From 7dcf0b0406c578e8543c9c9979c91bd4c826cd39 Mon Sep 17 00:00:00 2001 From: super_liu <396572590@qq.com> Date: Tue, 8 Jun 2021 16:16:26 +0800 Subject: [PATCH] commit code --- .gitignore | 29 + README.md | 1 + mvnw | 286 + pom.xml | 146 + src/main/java/com/ydw/bat/wkflow/.DS_Store | Bin 0 -> 6148 bytes .../ydw/bat/wkflow/BatWkflowApplication.java | 33 + .../define/ActivitDefineController.java | 317 + .../business_activiti/dto/Children.java | 293 + .../wkflow/business_activiti/dto/Data.java | 85 + .../wkflow/business_activiti/dto/Form.java | 247 + .../business_activiti/dto/FromFile.java | 49 + .../business_activiti/dto/ItemListNew.java | 281 + .../business_activiti/dto/ItemsList.java | 328 + .../business_activiti/dto/ModelQuery.java | 22 + .../wkflow/business_activiti/dto/Page.java | 44 + .../dto/ProjectAssessDTO.java | 580 + .../business_activiti/dto/ProjectFormDTO.java | 244 + .../business_activiti/dto/Response.java | 40 + .../business_activiti/dto/StandardDTO.java | 175 + .../business_activiti/dto/StandardDTONew.java | 250 + .../dto/TaskCommonQuery.java | 57 + .../wkflow/business_activiti/dto/ZNodes.java | 107 + .../editor/ModelEditorJsonRestResource.java | 77 + .../editor/ModelSaveRestResource.java | 106 + .../editor/StencilsetRestResource.java | 45 + .../instance/ActivitiInstanceController.java | 58 + .../instance/InstanceImageController.java | 55 + .../instance/service/InstanceService.java | 72 + .../model/ActivitiModelController.java | 213 + .../model/ActivitiModelImageController.java | 70 + .../service/TaskRollBackService.java | 60 + .../service/TaskTodoService.java | 84 + .../task/HastodoTasksController.java | 179 + .../task/TaskController.java | 133 + .../task/TaskRollBackController.java | 34 + .../task/TodoTaskController.java | 2456 ++ .../business_auth/AuUsrFeignService.java | 26 + .../bat/wkflow/business_auth/JsonData.java | 19 + .../business_auth/LawsUserInfoService.java | 87 + .../controller/CategoryController.java | 108 + .../category/dto/CategoryQuery.java | 23 + .../category/entity/Category.java | 53 + .../category/mapper/CategoryMapper.java | 16 + .../category/service/ICategoryService.java | 16 + .../service/impl/CategoryServiceImpl.java | 20 + .../controller/BusProcessController.java | 21 + .../BusProcessEntrustController.java | 21 + .../controller/BusProcessNameController.java | 39 + .../controller/BusProcessNewController.java | 51 + .../datas/controller/DatasController.java | 79 + .../datas/controller/HiDatasController.java | 21 + .../business_main/datas/dto/DatasQuery.java | 63 + .../business_main/datas/entity/AttFileEO.java | 216 + .../business_main/datas/entity/AttFileVo.java | 90 + .../business_main/datas/entity/BusMes.java | 114 + .../datas/entity/BusProcess.java | 47 + .../datas/entity/BusProcessEntrust.java | 64 + .../datas/entity/BusProcessName.java | 91 + .../datas/entity/BusProcessNew.java | 87 + .../business_main/datas/entity/Datas.java | 119 + .../business_main/datas/entity/HiDatas.java | 109 + .../business_main/datas/entity/MenuEO.java | 178 + .../business_main/datas/entity/OrgEO.java | 300 + .../datas/entity/PersonMsgEO.java | 240 + .../datas/entity/ResponseMessage.java | 58 + .../business_main/datas/entity/RoleEO.java | 299 + .../datas/entity/SarBussStandPlanEO.java | 627 + .../datas/entity/SarBussionessStandEO.java | 468 + .../entity/SarBussionessStandStateEO.java | 60 + .../datas/entity/SarStandAttrDetailsEO.java | 285 + .../business_main/datas/entity/UserVO.java | 329 + .../datas/mapper/BusProcessEntrustMapper.java | 16 + .../datas/mapper/BusProcessMapper.java | 16 + .../datas/mapper/BusProcessNameMapper.java | 22 + .../datas/mapper/BusProcessNewMapper.java | 29 + .../datas/mapper/DatasMapper.java | 27 + .../datas/mapper/HiDatasMapper.java | 18 + .../service/IBusProcessEntrustService.java | 16 + .../datas/service/IBusProcessNameService.java | 20 + .../datas/service/IBusProcessNewService.java | 32 + .../datas/service/IBusProcessService.java | 16 + .../datas/service/IDatasService.java | 20 + .../datas/service/IHiDatasService.java | 20 + .../impl/BusProcessEntrustServiceImpl.java | 20 + .../impl/BusProcessNameServiceImpl.java | 31 + .../impl/BusProcessNewServiceImpl.java | 71 + .../service/impl/BusProcessServiceImpl.java | 20 + .../datas/service/impl/DatasServiceImpl.java | 69 + .../service/impl/HiDatasServiceImpl.java | 167 + .../controller/DelegateController.java | 127 + .../delegate/dto/DelegateQuery.java | 70 + .../delegate/entity/Delegate.java | 88 + .../delegate/mapper/DelegateMapper.java | 16 + .../delegate/service/IDelegateService.java | 16 + .../service/impl/DelegateServiceImpl.java | 20 + .../DelegateBusinessController.java | 21 + .../dto/DelegateBusinessQuery.java | 34 + .../entity/DelegateBusiness.java | 58 + .../mapper/DelegateBusinessMapper.java | 16 + .../service/IDelegateBusinessService.java | 16 + .../impl/DelegateBusinessServiceImpl.java | 20 + .../file/controller/FileController.java | 62 + .../business_main/file/entity/File.java | 74 + .../business_main/file/mapper/FileMapper.java | 16 + .../file/service/IFileService.java | 27 + .../file/service/impl/FileServiceImpl.java | 178 + .../controller/FormAccessoryController.java | 88 + .../form/controller/FormApiController.java | 47 + .../form/controller/FormController.java | 102 + .../controller/FormVariableController.java | 21 + .../form/dto/FormAccessoryQuery.java | 35 + .../business_main/form/dto/FormQuery.java | 51 + .../business_main/form/entity/Form.java | 93 + .../form/entity/FormAccessory.java | 69 + .../form/entity/FormVariable.java | 70 + .../form/mapper/FormAccessoryMapper.java | 16 + .../business_main/form/mapper/FormMapper.java | 25 + .../form/mapper/FormVariableMapper.java | 16 + .../form/service/IFormAccessoryService.java | 16 + .../form/service/IFormService.java | 22 + .../form/service/IFormVariableService.java | 18 + .../impl/FormAccessoryServiceImpl.java | 20 + .../form/service/impl/FormServiceImpl.java | 51 + .../service/impl/FormVariableServiceImpl.java | 130 + .../system/controller/SystemController.java | 83 + .../business_main/system/entity/System.java | 58 + .../system/mapper/SystemMapper.java | 16 + .../system/service/ISystemService.java | 16 + .../service/impl/SystemServiceImpl.java | 20 + .../form/controller/FormEditorController.java | 130 + .../form/controller/FormJsonController.java | 144 + .../form/controller/FormSubmitController.java | 71 + .../form/controller/FormValsController.java | 98 + .../business_wkflow/form/dto/FormJsonDto.java | 21 + .../form/dto/FormPreviewDto.java | 20 + .../form/dto/FormSubmitDto.java | 23 + .../form/service/FormDuplicateService.java | 109 + .../form/service/FormValsService.java | 340 + .../form/service/ModelJsonService.java | 104 + .../task/service/TaskInjectService.java | 51 + .../wkflow/config/DatasTimerController.java | 28 + .../bat/wkflow/config/MybatisPlusConfig.java | 28 + .../ydw/bat/wkflow/config/SwaggerConfig.java | 59 + .../com/ydw/bat/wkflow/config/WebConfig.java | 26 + .../exception/GlobalExceptionHandler.java | 116 + .../interceptor/LoginAdminInterceptor.java | 33 + .../interceptor/MyWebMvcConfigurer.java | 20 + .../bat/wkflow/listener/ActivitiConfig.java | 25 + .../ManagerAppAfter.java | 69 + .../ManagerAppFrount.java | 39 + .../MeetingAppAfter.java | 64 + .../MeetingAppAgeinAfter.java | 36 + .../MeetingAppAgeinFrount.java | 30 + .../MeetingAppFrount.java | 40 + .../BeforeTheMeetingApp/ManagerAppAfter.java | 70 + .../BeforeTheMeetingApp/ManagerAppFrount.java | 40 + .../BeforeTheMeetingApp/MeetingAppAfter.java | 72 + .../MeetingAppAgeinAfter.java | 40 + .../BeforeTheMeetingApp/MeetingAppFrount.java | 32 + .../ChiefInspectorAppAfter.java | 80 + .../ChiefInspectorAppFrount.java | 58 + .../DraftsmanOpenAfter.java | 75 + .../DraftsmanOpenAgainAfter.java | 47 + .../DraftsmanOpenAgainFrount.java | 30 + .../DraftsmanOpenFrount.java | 38 + .../EngineerAppAfter.java | 140 + .../EngineerAppFrount.java | 77 + .../EnterpriseStandardAbolish/FoAppAfter.java | 88 + .../FoAppFrount.java | 55 + .../ManagerAppAfter.java | 108 + .../ManagerAppFrount.java | 51 + .../DraftsmanEditAfter.java | 91 + .../DraftsmanEditAgainAfter.java | 61 + .../DraftsmanEditAgainFrount.java | 33 + .../DraftsmanExamineAfter.java | 142 + .../DraftsmanExamineFrount.java | 55 + .../EngineerExamineAfter.java | 77 + .../EngineerExamineFrount.java | 100 + .../FoExamineAfter.java | 126 + .../FoExamineFrount.java | 55 + .../LlrAfter.java | 80 + .../LlrFrount.java | 63 + .../ManagerExamineAfter.java | 147 + .../ManagerExamineFrount.java | 44 + .../OtherApproveAfter.java | 109 + .../OtherApproveFrount.java | 54 + .../DraftsChangeAfter.java | 49 + .../DraftsChangeFrount.java | 54 + .../DraftsmanOpenAfter.java | 82 + .../FoExamineAfter.java | 122 + .../FoExamineFrount.java | 53 + .../ManagerExamineAfter.java | 82 + .../ManagerExamineFrount.java | 53 + .../DreAppAfter.java | 49 + .../DreAppFrount.java | 51 + .../FoAppAfter.java | 69 + .../FoAppFrount.java | 49 + .../ManagerAppAfter.java | 67 + .../ManagerAppFrount.java | 50 + .../ProcessOpenAfter.java | 70 + .../ProcessOpenFrount.java | 52 + .../DraftsmanOpenAfter.java | 78 + .../DraftsmanOpenAgeinAfter.java | 49 + .../DraftsmanOpenFrount.java | 52 + .../EngineerAppAfter.java | 79 + .../EngineerAppFrount.java | 64 + .../FoAppAfter.java | 119 + .../FoAppFrount.java | 50 + .../ChiefEngineerAppAfter.java | 94 + .../ChiefEngineerAppFrount.java | 50 + .../CountersignatureAppAfter.java | 188 + .../CountersignatureAppFrount.java | 54 + .../EngineerAppAfter.java | 56 + .../EngineerAppFrount.java | 66 + .../ExpertAppAfter.java | 202 + .../ExpertAppFrount.java | 52 + .../InitiationProcessAfter.java | 93 + .../InitiationProcessAgeinAfter.java | 74 + .../InitiationProcessFrount.java | 53 + .../SponsorReviseAfter.java | 72 + .../SponsorReviseFrount.java | 52 + .../VIAppAfter.java | 139 + .../VIAppFrount.java | 52 + .../ChiefInspectorAfter.java | 81 + .../ChiefInspectorFrount.java | 51 + .../DrafterAppAfter.java | 69 + .../DrafterAppAgeinAfter.java | 41 + .../DrafterAppFrount.java | 52 + .../ManagerAppAfter.java | 91 + .../ManagerAppFrount.java | 51 + .../listener/GlobalActivitiEventListener.java | 54 + .../listener/LawsWare/LawsWareIssueAfter.java | 261 + .../LawsWare/LawsWareIssueFrount.java | 61 + .../LawsWare/LawsWareIssuePGAfter.java | 312 + .../LawsWare/LawsWareIssuePGFrount.java | 74 + .../LawsWare/LawsWareIssueRKAfter.java | 63 + .../LawsWare/LawsWareIssueRKFrount.java | 78 + .../LawsWare/LawsWareIssueSPAfter.java | 214 + .../LawsWare/LawsWareIssueSPFrount.java | 53 + .../LawsWare/LawsWareIssueSVPPSAfter.java | 260 + .../LawsWare/LawsWareIssueSVPPSFrount.java | 66 + .../listener/OverSeasLawsList/FoAppAfter.java | 126 + .../OverSeasLawsList/FoAppFrount.java | 37 + .../OverSeasLawsList/OpenProcessAfter.java | 73 + .../OpenProcessAgeinAfter.java | 49 + .../OverSeasLawsList/OpenProcessFrount.java | 40 + .../PolicyEvaluation/ContactsAfter.java | 113 + .../PolicyEvaluation/ContactsFrount.java | 39 + .../listener/PolicyEvaluation/FoAfrount.java | 43 + .../listener/PolicyEvaluation/FoAfter.java | 234 + .../listener/PolicyEvaluation/FqrAfter.java | 88 + .../listener/PolicyEvaluation/FqrFront.java | 39 + .../listener/PolicyEvaluation/IssueAfter.java | 129 + .../PolicyEvaluation/IssueAgainAfter.java | 122 + .../PolicyEvaluation/IssueAgainFrount.java | 30 + .../listener/PolicyEvaluation/RectAfter.java | 123 + .../listener/PolicyEvaluation/RectFrount.java | 39 + .../listener/PolicyEvaluation/hzAfter.java | 11 + .../listener/PolicyEvaluation/hzFrount.java | 41 + .../wkflow/listener/PolicyWare/FoAfrount.java | 44 + .../wkflow/listener/PolicyWare/FoAfter.java | 151 + .../listener/PolicyWare/IssueAfter.java | 120 + .../listener/PolicyWare/IssueAgainAfter.java | 91 + .../listener/PolicyWare/IssueAgainFrount.java | 44 + .../listener/PolicyWare/IssueSureAfter.java | 132 + .../listener/PolicyWare/IssueSureFrount.java | 44 + .../wkflow/listener/PolicyWare/RectAfter.java | 114 + .../listener/PolicyWare/RectFrount.java | 44 + .../wkflow/listener/PolicyWare/hzAfter.java | 11 + .../wkflow/listener/PolicyWare/hzFrount.java | 41 + .../ApprovalResultAfter.java | 91 + .../ApprovalResultFrount.java | 41 + .../ComplianceAssessmentAfter.java | 316 + .../DistributionDepartmentAfter.java | 224 + .../DistributionDepartmentFrount.java | 42 + .../DistributionUserAfter.java | 158 + .../DistributionUserFrount.java | 41 + .../ProjectEvaluation/FirstApprovalAfter.java | 212 + .../FirstApprovalFrount.java | 41 + .../SecondApprovalAfter.java | 205 + .../SecondApprovalFrount.java | 41 + .../PurchaseRequest/BuyerAppAfter.java | 226 + .../PurchaseRequest/BuyerAppFrount.java | 42 + .../InitiateApplicationAfter.java | 88 + .../InitiateApplicationChangeAfter.java | 102 + .../InitiateApplicationChangeFrount.java | 44 + .../PurchaseRequest/ManagerAppAfter.java | 93 + .../PurchaseRequest/ManagerAppFrount.java | 42 + .../listener/PurchaseRequest/PMAppAfter.java | 89 + .../PurchaseRequest/PMAppFrouont.java | 42 + .../ReviewStandard/DraftingContactAfter.java | 166 + .../ReviewStandard/DraftingContactFront.java | 41 + .../ReviewStandard/EngineerAfter.java | 184 + .../ReviewStandard/EngineerFront.java | 53 + .../TranslateRequest/BuyerAppAfter.java | 214 + .../TranslateRequest/BuyerAppFrount.java | 40 + .../InitiateApplicationAfter.java | 76 + .../InitiateApplicationChangeAfter.java | 101 + .../InitiateApplicationChangeFrount.java | 43 + .../InitiateApplicationFrount.java | 27 + .../TranslateRequest/ManagerAppAfter.java | 90 + .../TranslateRequest/ManagerAppFrount.java | 40 + .../listener/TranslateRequest/PMAppAfter.java | 89 + .../TranslateRequest/PMAppFrouont.java | 40 + .../ydw/bat/wkflow/listener/UserRoleEnum.java | 34 + .../bat/wkflow/listener/WkFlowSendEmail.java | 41 + .../bat/wkflow/listener/Zcfgpg/FoAfter.java | 164 + .../listener/Zcfgpg/FoApproveAfter.java | 87 + .../listener/Zcfgpg/FoApproveFront.java | 30 + .../bat/wkflow/listener/Zcfgpg/FoFront.java | 30 + .../wkflow/listener/Zcfgpg/IssuedAfter.java | 173 + .../listener/Zcfgpg/IssuedAgainAfter.java | 98 + .../listener/Zcfgpg/IssuedAgainFront.java | 30 + .../bat/wkflow/listener/Zcfgpg/ckFrount.java | 32 + .../common/ReturnTaskBackListender.java | 44 + .../wkflow/listener/common/WorkflowUtil.java | 94 + .../DepartManagerReviewListender.java | 28 + .../purchase/FinaceReviewListener.java | 27 + .../GeneralManagerReviewListender.java | 27 + ...sSkillAssessStandIssuesAfterListender.java | 14 + ...sSkillAssessStandIssuesFrontListender.java | 49 + .../LawsSkillAssessStandJGAfterListender.java | 42 + .../LawsSkillAssessStandJGFrontListender.java | 41 + .../LawsSkillAssessStandPGAfterListender.java | 173 + .../LawsSkillAssessStandPGFrontListender.java | 39 + .../LawsSkillAssessStandSHAfterListender.java | 148 + .../LawsSkillAssessStandSHFrontListender.java | 44 + .../purchase/LawsSkillAssessSumListender.java | 18 + .../listener/purchase/TogeReviewListener.java | 255 + .../unqualified/AppImpleAfterListender.java | 85 + .../unqualified/AppImpleFrountListender.java | 38 + .../unqualified/AppPlanAfterListender.java | 98 + .../unqualified/AppPlanFrountListender.java | 37 + .../unqualified/AppResultsAfterListender.java | 90 + .../AppResultsFrountListender.java | 38 + .../unqualified/AppSchemeAfterListender.java | 95 + .../unqualified/AppSchemeFrountListender.java | 37 + .../ChangeImpleAfterListender.java | 132 + .../ChangeImpleFrountListender.java | 37 + .../DesignSchemeAfterListender.java | 55 + .../DesignSchemeFrountListender.java | 37 + .../unqualified/FillPlanAfterListender.java | 56 + .../unqualified/FillPlanFrountListender.java | 39 + .../unqualified/IssueAfterListender.java | 105 + .../unqualified/VerResultsAfterListender.java | 55 + .../VerResultsFrountListender.java | 38 + .../bat/wkflow/listener/zcfgrk/FoAfter.java | 11 + .../listener/zcfgrk/FoApproveAfter.java | 55 + .../listener/zcfgrk/FoApproveFront.java | 30 + .../bat/wkflow/listener/zcfgrk/FoFront.java | 30 + .../wkflow/listener/zcfgrk/IssuedAfter.java | 116 + .../listener/zcfgrk/IssuedAgainAfter.java | 98 + .../listener/zcfgrk/IssuedAgainFront.java | 28 + .../wkflow/listener/zcfgrk/SvppsAfter.java | 63 + .../wkflow/listener/zcfgrk/SvppsFront.java | 30 + .../com/ydw/bat/wkflow/util/CreatedTools.java | 30 + .../bat/wkflow/util/SessionMemberTool.java | 59 + .../com/ydw/bat/wkflow/util/SessionTool.java | 55 + .../bat/wkflow/util/SpringContextUtil.java | 38 + .../java/com/ydw/bat/wkflow/util/TjTools.java | 118 + .../java/com/ydw/bat/wkflow/util/Utils.java | 40 + .../java/com/ydw/bat/wkflow/util/WebUtil.java | 60 + .../wkflow/util/activiti/ActivitiTools.java | 204 + .../bat/wkflow/util/coder/CodeGenerator.java | 157 + .../ydw/bat/wkflow/util/date/DateTools.java | 493 + .../ydw/bat/wkflow/util/file/FileTools.java | 333 + .../bat/wkflow/util/form/FormReadTools.java | 71 + .../bat/wkflow/util/token/TokenAspect.java | 50 + .../wkflow/util/token/TokenController.java | 30 + .../bat/wkflow/util/tree/AuthTreeTools.java | 79 + src/main/resources/application-prod.yml | 42 + src/main/resources/application.yml | 49 + src/main/resources/doc/必读.txt | 4 + src/main/resources/generatorConfig.xml | 299 + src/main/resources/log4j.properties | 35 + src/main/resources/logback-spring.xml | 112 + .../mapper/category/CategoryMapper.xml | 5 + .../mapper/datas/BusProcessEntrustMapper.xml | 5 + .../mapper/datas/BusProcessMapper.xml | 5 + .../mapper/datas/BusProcessNameMapper.xml | 32 + .../mapper/datas/BusProcessNewMapper.xml | 30 + .../resources/mapper/datas/DatasMapper.xml | 17 + .../resources/mapper/datas/HiDatasMapper.xml | 7 + .../mapper/delegate/DelegateMapper.xml | 5 + .../DelegateBusinessMapper.xml | 5 + src/main/resources/mapper/file/FileMapper.xml | 5 + .../mapper/form/FormAccessoryMapper.xml | 5 + src/main/resources/mapper/form/FormMapper.xml | 12 + .../mapper/form/FormVariableMapper.xml | 5 + .../resources/mapper/system/SystemMapper.xml | 5 + src/main/resources/models/form/form-read.html | 95 + src/main/resources/models/form/form.html | 154 + .../static/diagram-viewer/images/bg.png | Bin 0 -> 3383 bytes .../diagram-viewer/images/breadcrumbs.png | Bin 0 -> 580 bytes .../diagram-viewer/images/checker-bg.png | Bin 0 -> 108 bytes .../images/deployer/blue/message_catch.png | Bin 0 -> 438 bytes .../images/deployer/business_rule.png | Bin 0 -> 227 bytes .../images/deployer/error_catch.png | Bin 0 -> 1307 bytes .../images/deployer/error_throw.png | Bin 0 -> 830 bytes .../diagram-viewer/images/deployer/manual.png | Bin 0 -> 3319 bytes .../images/deployer/message_catch.png | Bin 0 -> 410 bytes .../images/deployer/message_throw.png | Bin 0 -> 367 bytes .../images/deployer/receive.png | Bin 0 -> 344 bytes .../diagram-viewer/images/deployer/script.png | Bin 0 -> 601 bytes .../diagram-viewer/images/deployer/send.png | Bin 0 -> 361 bytes .../images/deployer/service.png | Bin 0 -> 1445 bytes .../images/deployer/signal_catch.png | Bin 0 -> 953 bytes .../images/deployer/signal_throw.png | Bin 0 -> 687 bytes .../diagram-viewer/images/deployer/timer.png | Bin 0 -> 6280 bytes .../diagram-viewer/images/deployer/user.png | Bin 0 -> 775 bytes .../static/diagram-viewer/index.html | 130 + .../static/diagram-viewer/js/ActivitiRest.js | 74 + .../static/diagram-viewer/js/ActivityImpl.js | 1 + .../static/diagram-viewer/js/Color.js | 603 + .../diagram-viewer/js/LineBreakMeasurer.js | 270 + .../static/diagram-viewer/js/Polyline.js | 387 + .../diagram-viewer/js/ProcessDiagramCanvas.js | 2172 ++ .../js/ProcessDiagramGenerator.js | 1087 + .../js/jquery/jquery.asyncqueue.js | 125 + .../static/diagram-viewer/js/jquery/jquery.js | 9266 ++++++ .../js/jquery/jquery.progressbar.js | 131 + .../static/diagram-viewer/js/jstools.js | 23 + .../static/diagram-viewer/js/raphael.2.1.1.js | 10 + .../static/diagram-viewer/js/raphael.js | 10 + .../diagram-viewer/js/raphael_uncompressed.js | 5815 ++++ .../static/diagram-viewer/js/textlayout.js | 441 + .../resources/static/diagram-viewer/style.css | 1 + .../resources/static/editor-app/app-cfg.js | 26 + src/main/resources/static/editor-app/app.js | 432 + .../properties-assignment-controller.js | 181 + ...perties-condition-expression-controller.js | 58 + .../properties-custom-controllers.js | 18 + .../properties-default-controllers.js | 115 + .../properties-event-listeners-controller.js | 266 + ...operties-execution-listeners-controller.js | 326 + .../properties-fields-controller.js | 192 + .../properties-form-properties-controller.js | 276 + .../properties-in-parameters-controller.js | 158 + ...operties-message-definitions-controller.js | 137 + .../properties-message-scope-controller.js | 48 + .../properties-multiinstance-controller.js | 34 + .../properties-out-parameters-controller.js | 158 + ...roperties-sequenceflow-order-controller.js | 130 + ...roperties-signal-definitions-controller.js | 136 + .../properties-signal-scope-controller.js | 47 + .../properties-task-listeners-controller.js | 325 + .../editor-app/configuration/properties.js | 99 + .../assignment-display-template.html | 4 + .../properties/assignment-popup.html | 61 + .../properties/assignment-write-template.html | 4 + .../properties/boolean-property-template.html | 4 + ...condition-expression-display-template.html | 2 + .../condition-expression-popup.html | 29 + .../condition-expression-write-template.html | 4 + .../default-value-display-template.html | 4 + .../event-listeners-display-template.html | 3 + .../properties/event-listeners-popup.html | 115 + .../event-listeners-write-template.html | 4 + .../execution-listeners-display-template.html | 3 + .../properties/execution-listeners-popup.html | 101 + .../execution-listeners-write-template.html | 4 + .../properties/feedback-popup.html | 17 + .../properties/fields-display-template.html | 3 + .../properties/fields-popup.html | 61 + .../properties/fields-write-template.html | 4 + .../form-properties-display-template.html | 3 + .../properties/form-properties-popup.html | 117 + .../form-properties-write-template.html | 4 + .../in-parameters-display-template.html | 3 + .../properties/in-parameters-popup.html | 53 + .../in-parameters-write-template.html | 4 + .../message-definitions-display-template.html | 2 + .../properties/message-definitions-popup.html | 50 + .../message-definitions-write-template.html | 3 + .../message-property-write-template.html | 4 + ...multiinstance-property-write-template.html | 8 + .../out-parameters-display-template.html | 3 + .../properties/out-parameters-popup.html | 53 + .../out-parameters-write-template.html | 4 + .../sequenceflow-order-display-template.html | 3 + .../properties/sequenceflow-order-popup.html | 47 + .../sequenceflow-order-write-template.html | 4 + .../signal-definitions-display-template.html | 3 + .../properties/signal-definitions-popup.html | 58 + .../signal-definitions-write-template.html | 4 + .../signal-property-write-template.html | 4 + .../string-property-write-mode-template.html | 8 + ...subprocess-reference-display-template.html | 3 + .../subprocess-reference-popup.html | 43 + .../subprocess-reference-write-template.html | 4 + .../task-listeners-display-template.html | 3 + .../properties/task-listeners-popup.html | 102 + .../task-listeners-write-template.html | 4 + .../configuration/properties/text-popup.html | 17 + .../text-property-write-template.html | 4 + .../configuration/toolbar-custom-actions.js | 18 + .../configuration/toolbar-default-actions.js | 453 + .../editor-app/configuration/toolbar.js | 175 + .../editor-app/configuration/url-config.js | 34 + .../static/editor-app/css/style-common.css | 1518 + .../static/editor-app/css/style-editor.css | 639 + .../resources/static/editor-app/css/style.css | 477 + .../static/editor-app/editor-config.js | 32 + .../static/editor-app/editor-controller.js | 65 + .../static/editor-app/editor-utils.js | 135 + .../resources/static/editor-app/editor.html | 136 + .../static/editor-app/editor/css/editor.css | 202 + .../editor-app/editor/i18n/translation_de.js | 383 + .../editor/i18n/translation_en_us.js | 423 + .../editor/i18n/translation_signavio_de.js | 106 + .../editor/i18n/translation_signavio_en_us.js | 108 + .../static/editor-app/editor/oryx.debug.js | 24510 ++++++++++++++++ .../static/editor-app/editor/oryx.js | 30 + .../resources/static/editor-app/eventbus.js | 133 + .../fonts/activiti-admin-webfont.eot | Bin 0 -> 5029 bytes .../fonts/activiti-admin-webfont.svg | 43 + .../fonts/activiti-admin-webfont.ttf | Bin 0 -> 8628 bytes .../fonts/activiti-admin-webfont.woff | Bin 0 -> 5624 bytes .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20290 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41236 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23292 bytes .../static/editor-app/header-controller.js | 31 + .../resources/static/editor-app/i18n/en.json | 291 + .../static/editor-app/images/bpmn-error.png | Bin 0 -> 492 bytes .../static/editor-app/images/bpmn-warning.png | Bin 0 -> 469 bytes .../editor-app/images/datadefinition.png | Bin 0 -> 778 bytes .../static/editor-app/images/delete.png | Bin 0 -> 304 bytes .../static/editor-app/images/loading.gif | Bin 0 -> 17550 bytes .../static/editor-app/images/logo-2x.png | Bin 0 -> 9386 bytes .../static/editor-app/images/logo.png | Bin 0 -> 4427 bytes .../editor-app/images/nw-handle-dark.gif | Bin 0 -> 839 bytes .../editor-app/images/se-handle-dark.gif | Bin 0 -> 838 bytes .../editor-app/images/shapemenu_highlight.png | Bin 0 -> 462 bytes .../static/editor-app/images/wrench.png | Bin 0 -> 374 bytes .../angular-cookies.min.js | 8 + .../angular-cookies.min.js.map | 8 + .../libs/angular-dragdrop.min-1.0.3.js | 9 + .../angular-dragdrop.min.js | 29 + .../angular-mocks_1.2.13/angular-mocks.js | 2136 ++ .../angular-resource.js | 596 + .../angular-resource.min.js | 13 + .../angular-resource.min.js.map | 8 + .../angular-route_1.2.13/angular-route.js | 921 + .../angular-route_1.2.13/angular-route.min.js | 14 + .../angular-route.min.js.map | 8 + .../angular-sanitize.js | 625 + .../angular-sanitize.min.js | 14 + .../angular-sanitize.min.js.map | 8 + .../angular-scroll.min.js | 1 + .../angular-strap_2.0.5/angular-strap.min.js | 9 + .../angular-strap.tpl.min.js | 8 + .../.bower.json | 19 + .../angular-translate-loader-static-files.js | 31 + ...gular-translate-loader-static-files.min.js | 6 + .../.bower.json | 20 + .../angular-translate-storage-cookie.js | 19 + .../angular-translate-storage-cookie.min.js | 6 + .../angular-translate.js | 960 + .../angular-translate.min.js | 6 + .../angular_1.2.13/angular-animate.min.js | 27 + .../libs/angular_1.2.13/angular.min.js | 204 + .../daterangepicker-bs3.css | 267 + .../daterangepicker.js | 1026 + .../bootstrap_3.1.1/css/bootstrap-theme.css | 347 + .../css/bootstrap-theme.css.map | 1 + .../css/bootstrap-theme.min.css | 7 + .../libs/bootstrap_3.1.1/css/bootstrap.css | 5785 ++++ .../bootstrap_3.1.1/css/bootstrap.css.map | 1 + .../bootstrap_3.1.1/css/bootstrap.min.css | 7 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20335 bytes .../fonts/glyphicons-halflings-regular.svg | 229 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 41280 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23320 bytes .../libs/bootstrap_3.1.1/js/bootstrap.js | 1951 ++ .../libs/bootstrap_3.1.1/js/bootstrap.min.js | 6 + .../libs/es5-shim-15.3.4.5/.bower.json | 14 + .../libs/es5-shim-15.3.4.5/.gitignore | 2 + .../editor-app/libs/es5-shim-15.3.4.5/CHANGES | 93 + .../libs/es5-shim-15.3.4.5/CONTRIBUTORS.md | 25 + .../editor-app/libs/es5-shim-15.3.4.5/LICENSE | 19 + .../libs/es5-shim-15.3.4.5/README.md | 161 + .../libs/es5-shim-15.3.4.5/es5-sham.js | 444 + .../libs/es5-shim-15.3.4.5/es5-sham.map | 1 + .../libs/es5-shim-15.3.4.5/es5-sham.min.js | 4 + .../libs/es5-shim-15.3.4.5/es5-shim.js | 1314 + .../libs/es5-shim-15.3.4.5/es5-shim.map | 1 + .../libs/es5-shim-15.3.4.5/es5-shim.min.js | 4 + .../libs/es5-shim-15.3.4.5/package.json | 34 + .../es5-shim-15.3.4.5/tests/helpers/h-kill.js | 64 + .../tests/helpers/h-matchers.js | 34 + .../libs/es5-shim-15.3.4.5/tests/helpers/h.js | 3 + .../libs/es5-shim-15.3.4.5/tests/index.html | 64 + .../es5-shim-15.3.4.5/tests/index.min.html | 63 + .../tests/lib/jasmine-html.js | 190 + .../es5-shim-15.3.4.5/tests/lib/jasmine.css | 166 + .../es5-shim-15.3.4.5/tests/lib/jasmine.js | 2477 ++ .../tests/lib/jasmine_favicon.png | Bin 0 -> 905 bytes .../libs/es5-shim-15.3.4.5/tests/lib/json2.js | 478 + .../es5-shim-15.3.4.5/tests/spec/s-array.js | 1223 + .../es5-shim-15.3.4.5/tests/spec/s-date.js | 152 + .../tests/spec/s-function.js | 147 + .../es5-shim-15.3.4.5/tests/spec/s-number.js | 14 + .../es5-shim-15.3.4.5/tests/spec/s-object.js | 181 + .../es5-shim-15.3.4.5/tests/spec/s-string.js | 204 + .../libs/jquery-ui-1.10.3.custom.min.js | 6 + .../libs/jquery.autogrow-textarea.js | 61 + .../editor-app/libs/jquery_1.11.0/jquery.js | 9789 ++++++ .../libs/jquery_1.11.0/jquery.min.js | 4 + .../libs/jquery_1.11.0/jquery.min.map | 1 + .../editor-app/libs/json3_3.2.6/LICENSE | 20 + .../editor-app/libs/json3_3.2.6/lib/json3.js | 861 + .../libs/json3_3.2.6/lib/json3.min.js | 18 + .../libs/momentjs_2.5.1/momentjs.min.js | 6 + .../editor-app/libs/mousetrap-1.4.5.min.js | 9 + .../editor-app/libs/ng-grid-2.0.7-min.js | 2 + .../editor-app/libs/ng-grid-2.0.7.min.css | 1 + .../static/editor-app/libs/path_parser.js | 30 + .../static/editor-app/libs/prototype-1.5.1.js | 3272 +++ .../editor-app/libs/ui-utils.min-0.0.4.js | 7 + .../partials/root-stencil-item-template.html | 11 + .../partials/stencil-item-template.html | 27 + .../resources/static/editor-app/plugins.xml | 58 + .../editor-app/popups/icon-template.html | 3 + .../static/editor-app/popups/save-model.html | 41 + .../editor-app/popups/select-shape.html | 20 + .../editor-app/popups/unsaved-changes.html | 22 + .../editor-app/select-shape-controller.js | 314 + .../static/editor-app/stencil-controller.js | 1435 + .../activity/event.subprocess.collapsed.png | Bin 0 -> 309 bytes .../icons/activity/event.subprocess.png | Bin 0 -> 274 bytes .../icons/activity/expanded.subprocess.png | Bin 0 -> 273 bytes .../activity/list/type.business.rule.png | Bin 0 -> 209 bytes .../icons/activity/list/type.camel.png | Bin 0 -> 608 bytes .../icons/activity/list/type.manual.png | Bin 0 -> 405 bytes .../bpmn2.0/icons/activity/list/type.mule.png | Bin 0 -> 705 bytes .../icons/activity/list/type.receive.png | Bin 0 -> 297 bytes .../icons/activity/list/type.script.png | Bin 0 -> 300 bytes .../bpmn2.0/icons/activity/list/type.send.png | Bin 0 -> 440 bytes .../icons/activity/list/type.service.png | Bin 0 -> 530 bytes .../icons/activity/list/type.shell.png | Bin 0 -> 325 bytes .../bpmn2.0/icons/activity/list/type.user.png | Bin 0 -> 405 bytes .../bpmn2.0/icons/activity/subprocess.png | Bin 0 -> 282 bytes .../bpmn2.0/icons/activity/task.png | Bin 0 -> 255 bytes .../icons/artifact/text.annotation.png | Bin 0 -> 367 bytes .../bpmn2.0/icons/catching/cancel.png | Bin 0 -> 3241 bytes .../bpmn2.0/icons/catching/compensation.png | Bin 0 -> 3256 bytes .../bpmn2.0/icons/catching/error.png | Bin 0 -> 698 bytes .../bpmn2.0/icons/catching/message.png | Bin 0 -> 549 bytes .../bpmn2.0/icons/catching/signal.png | Bin 0 -> 627 bytes .../bpmn2.0/icons/catching/timer.png | Bin 0 -> 573 bytes .../connector/association.undirected.png | Bin 0 -> 413 bytes .../connector/association.unidirectional.png | Bin 0 -> 3032 bytes .../bpmn2.0/icons/connector/messageflow.png | Bin 0 -> 3121 bytes .../bpmn2.0/icons/connector/sequenceflow.png | Bin 0 -> 346 bytes .../bpmn2.0/icons/dataobject/data.store.png | Bin 0 -> 3184 bytes .../stencilsets/bpmn2.0/icons/diagram.png | Bin 0 -> 206 bytes .../bpmn2.0/icons/endevent/cancel.png | Bin 0 -> 3280 bytes .../bpmn2.0/icons/endevent/error.png | Bin 0 -> 757 bytes .../bpmn2.0/icons/endevent/none.png | Bin 0 -> 467 bytes .../bpmn2.0/icons/endevent/terminate.png | Bin 0 -> 3166 bytes .../bpmn2.0/icons/gateway/eventbased.png | Bin 0 -> 492 bytes .../icons/gateway/exclusive.databased.png | Bin 0 -> 462 bytes .../bpmn2.0/icons/gateway/inclusive.png | Bin 0 -> 432 bytes .../bpmn2.0/icons/gateway/parallel.png | Bin 0 -> 329 bytes .../bpmn2.0/icons/startevent/error.png | Bin 0 -> 698 bytes .../bpmn2.0/icons/startevent/message.png | Bin 0 -> 549 bytes .../bpmn2.0/icons/startevent/none.png | Bin 0 -> 450 bytes .../bpmn2.0/icons/startevent/signal.png | Bin 0 -> 3201 bytes .../bpmn2.0/icons/startevent/timer.png | Bin 0 -> 573 bytes .../bpmn2.0/icons/swimlane/lane.png | Bin 0 -> 187 bytes .../bpmn2.0/icons/swimlane/pool.png | Bin 0 -> 189 bytes .../bpmn2.0/icons/throwing/none.png | Bin 0 -> 582 bytes .../bpmn2.0/icons/throwing/signal.png | Bin 0 -> 747 bytes .../static/editor-app/toolbar-controller.js | 162 + .../static/formjs/cdn/avue/avue.min.js | 8 + .../static/formjs/cdn/avue/index.css | 1 + .../static/formjs/cdn/axios/axios.min.js | 9 + .../static/formjs/cdn/element-ui/index.js | 1 + .../theme-chalk/fonts/element-icons.ttf | Bin 0 -> 55956 bytes .../theme-chalk/fonts/element-icons.woff | Bin 0 -> 28200 bytes .../cdn/element-ui/theme-chalk/index.css | 1 + .../static/formjs/cdn/vue/vue.min.js | 6 + src/main/resources/static/formjs/css/home.css | 54 + src/main/resources/static/formjs/favicon.ico | Bin 0 -> 16958 bytes .../static/formjs/img/loading-spin.svg | 7 + src/main/resources/static/formjs/index.html | 1 + .../static/formjs/js/app.87dae861.js | 1 + .../formjs/js/chunk-vendors.a7441135.js | 46 + src/main/resources/static/modeler.html | 145 + .../resource/babel/babel-browser.min.js | 32 + .../editor-app/assignment/assignmentset.html | 27 + .../editor-app/assignment/assignmentset.js | 196 + .../editor-app/assignment/load_assignee.js | 49 + .../static/resource/editor-app/readme.txt | 15 + .../editor-app/savemodel/savemodel.js | 19 + .../resource/editor-form/form_edit.html | 186 + .../editor-form/form_edit_readonly.html | 186 + .../static/resource/form/form-json-read.html | 153 + .../static/resource/form/form-json.html | 244 + .../static/resource/form/form-read.html | 47 + .../static/resource/form/form-test.html | 166 + .../static/resource/form/form-test2.html | 124 + .../resources/static/resource/form/form.html | 44 + .../static/resource/form/form_old.html | 214 + .../static/resource/form/rejectAvanceJs.js | 42 + .../resources/static/resource/js/jquery.js | 2 + .../static/resource/vue/css/antd.css | 8 + .../static/resource/vue/css/init.css | 9 + .../resources/static/resource/vue/js/antd.js | 26 + .../resources/static/resource/vue/js/app.js | 136 + .../static/resource/vue/js/axios.min.js | 9 + .../static/resource/vue/js/moment.min.js | 80 + .../resources/static/resource/vue/js/vue.js | 11944 ++++++++ .../resources/static/resource/vue/js/vuex.js | 1016 + src/main/resources/stencilset.json | 1348 + .../resources/templates/controller.java.vm | 41 + src/main/resources/templates/entity.java.vm | 155 + src/main/resources/templates/entity.kt.vm | 114 + src/main/resources/templates/mapper.java.vm | 20 + src/main/resources/templates/mapper.xml.vm | 39 + src/main/resources/templates/service.java.vm | 20 + .../resources/templates/serviceImpl.java.vm | 26 + .../wkflowtest/BatWkflowApplicationTest.java | 22 + 724 files changed, 145710 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 mvnw create mode 100644 pom.xml create mode 100644 src/main/java/com/ydw/bat/wkflow/.DS_Store create mode 100644 src/main/java/com/ydw/bat/wkflow/BatWkflowApplication.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/define/ActivitDefineController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Children.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Data.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Form.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/FromFile.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemListNew.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemsList.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ModelQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Page.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectAssessDTO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectFormDTO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Response.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTONew.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/TaskCommonQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ZNodes.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelEditorJsonRestResource.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelSaveRestResource.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/editor/StencilsetRestResource.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/instance/ActivitiInstanceController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/instance/InstanceImageController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/instance/service/InstanceService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelImageController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskRollBackService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskTodoService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/task/HastodoTasksController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskRollBackController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_activiti/task/TodoTaskController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_auth/AuUsrFeignService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_auth/JsonData.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_auth/LawsUserInfoService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/category/controller/CategoryController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/category/dto/CategoryQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/category/entity/Category.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/category/mapper/CategoryMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/category/service/ICategoryService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/category/service/impl/CategoryServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessEntrustController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNameController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNewController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/DatasController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/HiDatasController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/dto/DatasQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileVo.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusMes.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcess.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessEntrust.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessName.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessNew.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/Datas.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/HiDatas.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/MenuEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/OrgEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/PersonMsgEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/ResponseMessage.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/RoleEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussStandPlanEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandStateEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarStandAttrDetailsEO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/UserVO.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessEntrustMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNameMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNewMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/DatasMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/HiDatasMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessEntrustService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNameService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNewService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IDatasService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IHiDatasService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessEntrustServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNameServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNewServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/DatasServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/HiDatasServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate/controller/DelegateController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate/dto/DelegateQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate/entity/Delegate.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate/mapper/DelegateMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/IDelegateService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/impl/DelegateServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/controller/DelegateBusinessController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/dto/DelegateBusinessQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/entity/DelegateBusiness.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/mapper/DelegateBusinessMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/IDelegateBusinessService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/impl/DelegateBusinessServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/file/controller/FileController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/file/entity/File.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/file/mapper/FileMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/file/service/IFileService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/file/service/impl/FileServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormAccessoryController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormApiController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormVariableController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormAccessoryQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormQuery.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/entity/Form.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormAccessory.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormVariable.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormAccessoryMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormVariableMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormAccessoryService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormVariableService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormAccessoryServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormVariableServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/system/controller/SystemController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/system/entity/System.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/system/mapper/SystemMapper.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/system/service/ISystemService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_main/system/service/impl/SystemServiceImpl.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormEditorController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormJsonController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormSubmitController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormValsController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormJsonDto.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormPreviewDto.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormSubmitDto.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormDuplicateService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormValsService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/ModelJsonService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/business_wkflow/task/service/TaskInjectService.java create mode 100644 src/main/java/com/ydw/bat/wkflow/config/DatasTimerController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/config/MybatisPlusConfig.java create mode 100644 src/main/java/com/ydw/bat/wkflow/config/SwaggerConfig.java create mode 100644 src/main/java/com/ydw/bat/wkflow/config/WebConfig.java create mode 100644 src/main/java/com/ydw/bat/wkflow/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/ydw/bat/wkflow/interceptor/LoginAdminInterceptor.java create mode 100644 src/main/java/com/ydw/bat/wkflow/interceptor/MyWebMvcConfigurer.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ActivitiConfig.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAgeinAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsmanOpenAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAgeinAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAgeinAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAgeinAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/GlobalActivitiEventListener.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAgeinAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ComplianceAssessmentAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppFrouont.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppFrouont.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/UserRoleEnum.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/WkFlowSendEmail.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/ckFrount.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/common/ReturnTaskBackListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/common/WorkflowUtil.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/DepartManagerReviewListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/FinaceReviewListener.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/GeneralManagerReviewListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesFrontListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGFrontListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGFrontListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHFrontListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessSumListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/purchase/TogeReviewListener.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/IssueAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsAfterListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsFrountListender.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsAfter.java create mode 100644 src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsFront.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/CreatedTools.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/SessionMemberTool.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/SessionTool.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/SpringContextUtil.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/TjTools.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/Utils.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/WebUtil.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/activiti/ActivitiTools.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/coder/CodeGenerator.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/date/DateTools.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/file/FileTools.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/form/FormReadTools.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/token/TokenAspect.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/token/TokenController.java create mode 100644 src/main/java/com/ydw/bat/wkflow/util/tree/AuthTreeTools.java create mode 100644 src/main/resources/application-prod.yml create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/doc/必读.txt create mode 100644 src/main/resources/generatorConfig.xml create mode 100644 src/main/resources/log4j.properties create mode 100644 src/main/resources/logback-spring.xml create mode 100644 src/main/resources/mapper/category/CategoryMapper.xml create mode 100644 src/main/resources/mapper/datas/BusProcessEntrustMapper.xml create mode 100644 src/main/resources/mapper/datas/BusProcessMapper.xml create mode 100644 src/main/resources/mapper/datas/BusProcessNameMapper.xml create mode 100644 src/main/resources/mapper/datas/BusProcessNewMapper.xml create mode 100644 src/main/resources/mapper/datas/DatasMapper.xml create mode 100644 src/main/resources/mapper/datas/HiDatasMapper.xml create mode 100644 src/main/resources/mapper/delegate/DelegateMapper.xml create mode 100644 src/main/resources/mapper/delegate_business/DelegateBusinessMapper.xml create mode 100644 src/main/resources/mapper/file/FileMapper.xml create mode 100644 src/main/resources/mapper/form/FormAccessoryMapper.xml create mode 100644 src/main/resources/mapper/form/FormMapper.xml create mode 100644 src/main/resources/mapper/form/FormVariableMapper.xml create mode 100644 src/main/resources/mapper/system/SystemMapper.xml create mode 100644 src/main/resources/models/form/form-read.html create mode 100644 src/main/resources/models/form/form.html create mode 100644 src/main/resources/static/diagram-viewer/images/bg.png create mode 100644 src/main/resources/static/diagram-viewer/images/breadcrumbs.png create mode 100644 src/main/resources/static/diagram-viewer/images/checker-bg.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/blue/message_catch.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/business_rule.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/error_catch.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/error_throw.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/manual.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/message_catch.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/message_throw.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/receive.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/script.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/send.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/service.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/signal_catch.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/signal_throw.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/timer.png create mode 100644 src/main/resources/static/diagram-viewer/images/deployer/user.png create mode 100644 src/main/resources/static/diagram-viewer/index.html create mode 100644 src/main/resources/static/diagram-viewer/js/ActivitiRest.js create mode 100644 src/main/resources/static/diagram-viewer/js/ActivityImpl.js create mode 100644 src/main/resources/static/diagram-viewer/js/Color.js create mode 100644 src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js create mode 100644 src/main/resources/static/diagram-viewer/js/Polyline.js create mode 100644 src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js create mode 100644 src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js create mode 100644 src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js create mode 100644 src/main/resources/static/diagram-viewer/js/jquery/jquery.js create mode 100644 src/main/resources/static/diagram-viewer/js/jquery/jquery.progressbar.js create mode 100644 src/main/resources/static/diagram-viewer/js/jstools.js create mode 100644 src/main/resources/static/diagram-viewer/js/raphael.2.1.1.js create mode 100644 src/main/resources/static/diagram-viewer/js/raphael.js create mode 100644 src/main/resources/static/diagram-viewer/js/raphael_uncompressed.js create mode 100644 src/main/resources/static/diagram-viewer/js/textlayout.js create mode 100644 src/main/resources/static/diagram-viewer/style.css create mode 100644 src/main/resources/static/editor-app/app-cfg.js create mode 100644 src/main/resources/static/editor-app/app.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-assignment-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-condition-expression-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-custom-controllers.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-default-controllers.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-event-listeners-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-execution-listeners-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-fields-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-form-properties-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-in-parameters-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-message-definitions-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-message-scope-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-multiinstance-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-out-parameters-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-sequenceflow-order-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-signal-definitions-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-signal-scope-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties-task-listeners-controller.js create mode 100644 src/main/resources/static/editor-app/configuration/properties.js create mode 100644 src/main/resources/static/editor-app/configuration/properties/assignment-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/assignment-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/assignment-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/boolean-property-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/condition-expression-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/condition-expression-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/condition-expression-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/default-value-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/event-listeners-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/event-listeners-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/event-listeners-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/execution-listeners-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/execution-listeners-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/execution-listeners-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/feedback-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/fields-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/fields-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/fields-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/form-properties-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/form-properties-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/form-properties-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/in-parameters-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/in-parameters-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/in-parameters-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/message-definitions-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/message-definitions-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/message-definitions-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/message-property-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/multiinstance-property-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/out-parameters-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/out-parameters-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/out-parameters-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/sequenceflow-order-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/sequenceflow-order-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/sequenceflow-order-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/signal-definitions-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/signal-definitions-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/signal-definitions-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/signal-property-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/string-property-write-mode-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/subprocess-reference-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/subprocess-reference-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/subprocess-reference-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/task-listeners-display-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/task-listeners-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/task-listeners-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/text-popup.html create mode 100644 src/main/resources/static/editor-app/configuration/properties/text-property-write-template.html create mode 100644 src/main/resources/static/editor-app/configuration/toolbar-custom-actions.js create mode 100644 src/main/resources/static/editor-app/configuration/toolbar-default-actions.js create mode 100644 src/main/resources/static/editor-app/configuration/toolbar.js create mode 100644 src/main/resources/static/editor-app/configuration/url-config.js create mode 100644 src/main/resources/static/editor-app/css/style-common.css create mode 100644 src/main/resources/static/editor-app/css/style-editor.css create mode 100644 src/main/resources/static/editor-app/css/style.css create mode 100644 src/main/resources/static/editor-app/editor-config.js create mode 100644 src/main/resources/static/editor-app/editor-controller.js create mode 100644 src/main/resources/static/editor-app/editor-utils.js create mode 100644 src/main/resources/static/editor-app/editor.html create mode 100644 src/main/resources/static/editor-app/editor/css/editor.css create mode 100644 src/main/resources/static/editor-app/editor/i18n/translation_de.js create mode 100644 src/main/resources/static/editor-app/editor/i18n/translation_en_us.js create mode 100644 src/main/resources/static/editor-app/editor/i18n/translation_signavio_de.js create mode 100644 src/main/resources/static/editor-app/editor/i18n/translation_signavio_en_us.js create mode 100644 src/main/resources/static/editor-app/editor/oryx.debug.js create mode 100644 src/main/resources/static/editor-app/editor/oryx.js create mode 100644 src/main/resources/static/editor-app/eventbus.js create mode 100644 src/main/resources/static/editor-app/fonts/activiti-admin-webfont.eot create mode 100644 src/main/resources/static/editor-app/fonts/activiti-admin-webfont.svg create mode 100644 src/main/resources/static/editor-app/fonts/activiti-admin-webfont.ttf create mode 100644 src/main/resources/static/editor-app/fonts/activiti-admin-webfont.woff create mode 100644 src/main/resources/static/editor-app/fonts/glyphicons-halflings-regular.eot create mode 100644 src/main/resources/static/editor-app/fonts/glyphicons-halflings-regular.svg create mode 100644 src/main/resources/static/editor-app/fonts/glyphicons-halflings-regular.ttf create mode 100644 src/main/resources/static/editor-app/fonts/glyphicons-halflings-regular.woff create mode 100644 src/main/resources/static/editor-app/header-controller.js create mode 100644 src/main/resources/static/editor-app/i18n/en.json create mode 100644 src/main/resources/static/editor-app/images/bpmn-error.png create mode 100644 src/main/resources/static/editor-app/images/bpmn-warning.png create mode 100644 src/main/resources/static/editor-app/images/datadefinition.png create mode 100644 src/main/resources/static/editor-app/images/delete.png create mode 100644 src/main/resources/static/editor-app/images/loading.gif create mode 100644 src/main/resources/static/editor-app/images/logo-2x.png create mode 100644 src/main/resources/static/editor-app/images/logo.png create mode 100644 src/main/resources/static/editor-app/images/nw-handle-dark.gif create mode 100644 src/main/resources/static/editor-app/images/se-handle-dark.gif create mode 100644 src/main/resources/static/editor-app/images/shapemenu_highlight.png create mode 100644 src/main/resources/static/editor-app/images/wrench.png create mode 100644 src/main/resources/static/editor-app/libs/angular-cookies_1.2.13/angular-cookies.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-cookies_1.2.13/angular-cookies.min.js.map create mode 100644 src/main/resources/static/editor-app/libs/angular-dragdrop.min-1.0.3.js create mode 100644 src/main/resources/static/editor-app/libs/angular-dragdrop_1.0.7/angular-dragdrop.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-mocks_1.2.13/angular-mocks.js create mode 100644 src/main/resources/static/editor-app/libs/angular-resource_1.2.13/angular-resource.js create mode 100644 src/main/resources/static/editor-app/libs/angular-resource_1.2.13/angular-resource.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-resource_1.2.13/angular-resource.min.js.map create mode 100644 src/main/resources/static/editor-app/libs/angular-route_1.2.13/angular-route.js create mode 100644 src/main/resources/static/editor-app/libs/angular-route_1.2.13/angular-route.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-route_1.2.13/angular-route.min.js.map create mode 100644 src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.js create mode 100644 src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js.map create mode 100644 src/main/resources/static/editor-app/libs/angular-scroll_0.5.7/angular-scroll.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-strap_2.0.5/angular-strap.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-strap_2.0.5/angular-strap.tpl.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/.bower.json create mode 100644 src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js create mode 100644 src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/.bower.json create mode 100644 src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js create mode 100644 src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js create mode 100644 src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular_1.2.13/angular-animate.min.js create mode 100644 src/main/resources/static/editor-app/libs/angular_1.2.13/angular.min.js create mode 100644 src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css create mode 100644 src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css.map create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.min.css create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.css.map create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.min.css create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.eot create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.ttf create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.woff create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/js/bootstrap.js create mode 100644 src/main/resources/static/editor-app/libs/bootstrap_3.1.1/js/bootstrap.min.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/.bower.json create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/.gitignore create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/CHANGES create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/CONTRIBUTORS.md create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/LICENSE create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/README.md create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/es5-sham.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/es5-sham.map create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/es5-sham.min.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/es5-shim.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/es5-shim.map create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/es5-shim.min.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/package.json create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/helpers/h-kill.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/helpers/h-matchers.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/helpers/h.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/index.html create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/index.min.html create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/lib/jasmine-html.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/lib/jasmine.css create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/lib/jasmine.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/lib/jasmine_favicon.png create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/lib/json2.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/spec/s-array.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/spec/s-date.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/spec/s-function.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/spec/s-number.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/spec/s-object.js create mode 100644 src/main/resources/static/editor-app/libs/es5-shim-15.3.4.5/tests/spec/s-string.js create mode 100644 src/main/resources/static/editor-app/libs/jquery-ui-1.10.3.custom.min.js create mode 100644 src/main/resources/static/editor-app/libs/jquery.autogrow-textarea.js create mode 100644 src/main/resources/static/editor-app/libs/jquery_1.11.0/jquery.js create mode 100644 src/main/resources/static/editor-app/libs/jquery_1.11.0/jquery.min.js create mode 100644 src/main/resources/static/editor-app/libs/jquery_1.11.0/jquery.min.map create mode 100644 src/main/resources/static/editor-app/libs/json3_3.2.6/LICENSE create mode 100644 src/main/resources/static/editor-app/libs/json3_3.2.6/lib/json3.js create mode 100644 src/main/resources/static/editor-app/libs/json3_3.2.6/lib/json3.min.js create mode 100644 src/main/resources/static/editor-app/libs/momentjs_2.5.1/momentjs.min.js create mode 100644 src/main/resources/static/editor-app/libs/mousetrap-1.4.5.min.js create mode 100644 src/main/resources/static/editor-app/libs/ng-grid-2.0.7-min.js create mode 100644 src/main/resources/static/editor-app/libs/ng-grid-2.0.7.min.css create mode 100644 src/main/resources/static/editor-app/libs/path_parser.js create mode 100644 src/main/resources/static/editor-app/libs/prototype-1.5.1.js create mode 100644 src/main/resources/static/editor-app/libs/ui-utils.min-0.0.4.js create mode 100644 src/main/resources/static/editor-app/partials/root-stencil-item-template.html create mode 100644 src/main/resources/static/editor-app/partials/stencil-item-template.html create mode 100644 src/main/resources/static/editor-app/plugins.xml create mode 100644 src/main/resources/static/editor-app/popups/icon-template.html create mode 100644 src/main/resources/static/editor-app/popups/save-model.html create mode 100644 src/main/resources/static/editor-app/popups/select-shape.html create mode 100644 src/main/resources/static/editor-app/popups/unsaved-changes.html create mode 100644 src/main/resources/static/editor-app/select-shape-controller.js create mode 100644 src/main/resources/static/editor-app/stencil-controller.js create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.collapsed.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/event.subprocess.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/expanded.subprocess.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.business.rule.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.camel.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.manual.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.mule.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.receive.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.script.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.send.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.service.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.shell.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/list/type.user.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/subprocess.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/activity/task.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/artifact/text.annotation.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/catching/cancel.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/catching/compensation.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/catching/error.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/catching/message.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/catching/signal.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/catching/timer.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/connector/association.undirected.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/connector/association.unidirectional.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/connector/messageflow.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/connector/sequenceflow.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/dataobject/data.store.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/diagram.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/endevent/cancel.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/endevent/error.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/endevent/none.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/endevent/terminate.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/gateway/eventbased.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/gateway/exclusive.databased.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/gateway/inclusive.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/gateway/parallel.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/startevent/error.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/startevent/message.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/startevent/none.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/startevent/signal.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/startevent/timer.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/swimlane/lane.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/swimlane/pool.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/throwing/none.png create mode 100644 src/main/resources/static/editor-app/stencilsets/bpmn2.0/icons/throwing/signal.png create mode 100644 src/main/resources/static/editor-app/toolbar-controller.js create mode 100644 src/main/resources/static/formjs/cdn/avue/avue.min.js create mode 100644 src/main/resources/static/formjs/cdn/avue/index.css create mode 100644 src/main/resources/static/formjs/cdn/axios/axios.min.js create mode 100644 src/main/resources/static/formjs/cdn/element-ui/index.js create mode 100644 src/main/resources/static/formjs/cdn/element-ui/theme-chalk/fonts/element-icons.ttf create mode 100644 src/main/resources/static/formjs/cdn/element-ui/theme-chalk/fonts/element-icons.woff create mode 100644 src/main/resources/static/formjs/cdn/element-ui/theme-chalk/index.css create mode 100644 src/main/resources/static/formjs/cdn/vue/vue.min.js create mode 100644 src/main/resources/static/formjs/css/home.css create mode 100644 src/main/resources/static/formjs/favicon.ico create mode 100644 src/main/resources/static/formjs/img/loading-spin.svg create mode 100644 src/main/resources/static/formjs/index.html create mode 100644 src/main/resources/static/formjs/js/app.87dae861.js create mode 100644 src/main/resources/static/formjs/js/chunk-vendors.a7441135.js create mode 100644 src/main/resources/static/modeler.html create mode 100644 src/main/resources/static/resource/babel/babel-browser.min.js create mode 100644 src/main/resources/static/resource/editor-app/assignment/assignmentset.html create mode 100644 src/main/resources/static/resource/editor-app/assignment/assignmentset.js create mode 100644 src/main/resources/static/resource/editor-app/assignment/load_assignee.js create mode 100644 src/main/resources/static/resource/editor-app/readme.txt create mode 100644 src/main/resources/static/resource/editor-app/savemodel/savemodel.js create mode 100644 src/main/resources/static/resource/editor-form/form_edit.html create mode 100644 src/main/resources/static/resource/editor-form/form_edit_readonly.html create mode 100644 src/main/resources/static/resource/form/form-json-read.html create mode 100644 src/main/resources/static/resource/form/form-json.html create mode 100644 src/main/resources/static/resource/form/form-read.html create mode 100644 src/main/resources/static/resource/form/form-test.html create mode 100644 src/main/resources/static/resource/form/form-test2.html create mode 100644 src/main/resources/static/resource/form/form.html create mode 100644 src/main/resources/static/resource/form/form_old.html create mode 100644 src/main/resources/static/resource/form/rejectAvanceJs.js create mode 100644 src/main/resources/static/resource/js/jquery.js create mode 100644 src/main/resources/static/resource/vue/css/antd.css create mode 100644 src/main/resources/static/resource/vue/css/init.css create mode 100644 src/main/resources/static/resource/vue/js/antd.js create mode 100644 src/main/resources/static/resource/vue/js/app.js create mode 100644 src/main/resources/static/resource/vue/js/axios.min.js create mode 100644 src/main/resources/static/resource/vue/js/moment.min.js create mode 100644 src/main/resources/static/resource/vue/js/vue.js create mode 100644 src/main/resources/static/resource/vue/js/vuex.js create mode 100644 src/main/resources/stencilset.json create mode 100644 src/main/resources/templates/controller.java.vm create mode 100644 src/main/resources/templates/entity.java.vm create mode 100644 src/main/resources/templates/entity.kt.vm create mode 100644 src/main/resources/templates/mapper.java.vm create mode 100644 src/main/resources/templates/mapper.xml.vm create mode 100644 src/main/resources/templates/service.java.vm create mode 100644 src/main/resources/templates/serviceImpl.java.vm create mode 100644 src/test/java/com/ydw/bat/wkflowtest/BatWkflowApplicationTest.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..153c9335 --- /dev/null +++ b/.gitignore @@ -0,0 +1,29 @@ +HELP.md +/target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +/build/ + +### VS Code ### +.vscode/ diff --git a/README.md b/README.md new file mode 100644 index 00000000..2a221ef6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +add file \ No newline at end of file diff --git a/mvnw b/mvnw new file mode 100644 index 00000000..8b9da3b8 --- /dev/null +++ b/mvnw @@ -0,0 +1,286 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..166f760d --- /dev/null +++ b/pom.xml @@ -0,0 +1,146 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + com.ydw.bat.wkflow + bat-wkflow + 1.0.0 + jar + bat-wkflow + 基础项目 + + + UTF-8 + UTF-8 + 1.8 + 5.22.0 + + + + + com.tmsps.fk.common + fk-util + 1.0.0 + + + + org.springframework.cloud + spring-cloud-starter-netflix-eureka-client + 2.0.0.RELEASE + + + + org.springframework.cloud + spring-cloud-starter-openfeign + 2.0.2.RELEASE + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + + + + org.mybatis + mybatis + 3.5.4 + + + com.alibaba + druid + 1.0.28 + + + commons-lang + commons-lang + 2.6 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + + org.activiti + activiti-spring + ${activiti.version} + + + + org.activiti + activiti-spring-boot-starter-basic + ${activiti.version} + + + + org.activiti + activiti-diagram-rest + ${activiti.version} + + + org.activiti + activiti-rest + ${activiti.version} + + + + org.activiti + activiti-modeler + ${activiti.version} + + + + + org.springframework.boot + spring-boot-devtools + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.22.1 + + true + + + + + + diff --git a/src/main/java/com/ydw/bat/wkflow/.DS_Store b/src/main/java/com/ydw/bat/wkflow/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..8c1e661eb0d23f7b99daca48fa3954f05b75840a GIT binary patch literal 6148 zcmeHKPfNov6i>FPEh6?HxMMEfc35#bJP4)EgEyg~2bHa*#T8~d*4CkO(yyW4$WP$c z@x3G)j_JjN$aoK4elPD&LVhVp!x-ak5!#Gdj4=Zgv0_5=jbI#gNh;cd$mJLbi&)08 zV4Mw?vdQru8Nj_WSilO{x0rp|zhICC5PJ`XgE-5Z%@1Cw*4EZH4AV5sE%Vmvr(-Yo z^CENo(KYtY{k$J&`yx#TbK4It<7nKqc23eH_v0iQ$>KPSAm!#NPQrBTrbQBFavVf;59mHmJvwT8gfEXYKR+s^O?H#o=8mKzpDlm{%&C lmw+L!V#vj-xDF}>`~nR?M`NiFJRtNVAZeh682D2LJ^`oMQ;Yxr literal 0 HcmV?d00001 diff --git a/src/main/java/com/ydw/bat/wkflow/BatWkflowApplication.java b/src/main/java/com/ydw/bat/wkflow/BatWkflowApplication.java new file mode 100644 index 00000000..e2346002 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/BatWkflowApplication.java @@ -0,0 +1,33 @@ +package com.ydw.bat.wkflow; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +import org.springframework.cloud.openfeign.EnableFeignClients; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * 启动类 + * + * Api: http://localhost:17210/bat-wkflow/swagger-ui.html + * + * @author 冯晓东 398479251@qq.com + * + */ +@EnableEurekaClient +@EnableFeignClients +@SpringBootApplication +@EnableAutoConfiguration(exclude = { + org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class, + org.activiti.spring.boot.SecurityAutoConfiguration.class }) +@MapperScan("com.ydw.bat.wkflow.business.*.mapper") +@EnableScheduling +public class BatWkflowApplication { + + public static void main(String[] args) { + SpringApplication.run(BatWkflowApplication.class, args); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/define/ActivitDefineController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/define/ActivitDefineController.java new file mode 100644 index 00000000..8ba95299 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/define/ActivitDefineController.java @@ -0,0 +1,317 @@ +package com.ydw.bat.wkflow.business_activiti.define; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import org.activiti.engine.IdentityService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.repository.Model; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.repository.ProcessDefinitionQuery; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.util.SessionTool; +import com.ydw.bat.wkflow.util.activiti.ActivitiTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +@Api(description = "流程定义管理") +@RestController +public class ActivitDefineController extends BaseAction { + + @Autowired + private RuntimeService runtimeService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private TaskService taskService; + @Autowired + private IdentityService identityService; + @Autowired + private IBusProcessNameService ibusprocessnameService; + @Autowired + private LawsUserInfoService lawsUserInfoService; + + @ApiOperation(value = "流程定义列表-分页") + @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "category_id", value = "类型id"), @ApiImplicitParam(name = "current", value = "当前页"), + @ApiImplicitParam(name = "size", value = "每页条数") }) + @GetMapping("/activitDefineListPage") + public Wrapper> activitDefineListPage(String name, String category_id, int current, int size) { + // 创建查询对象 + ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); + // 使用流程定义的名称模糊查询 + if (ChkUtil.isNotNull(name)) { + processDefinitionQuery.processDefinitionNameLike("%" + name + "%"); + } + if (ChkUtil.isNotNull(category_id)) { + processDefinitionQuery.processDefinitionCategory(category_id); + } + long total = processDefinitionQuery.count(); + List list = processDefinitionQuery.orderByProcessDefinitionKey().asc().listPage((current - 1) * size, size); + List> definitions = ActivitiTools.turnProcessDefinitions(list); + for (Map map : definitions) { + Model model = repositoryService.createModelQuery().deploymentId(map.get("deploymentId")+"").singleResult(); + if(ChkUtil.isNotNull(model)) { + map.put("modelId", model.getId()); + }else { + map.put("modelId", ""); + } + } + Map map = new HashMap<>(); + map.put("records", definitions); + map.put("current", current); + map.put("size", size); + map.put("total", total); + return WrapMapper.ok(map); + } + + @ApiOperation(value = "流程定义列表") + @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "category_id", value = "类型id") }) + @GetMapping("/activitDefineList") + public Wrapper>> activitDefineList(String name, String category_id) { + // 创建查询对象 + ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); + // 使用流程定义的名称模糊查询 + if (name == null) { + name = ""; + } + if (ChkUtil.isNotNull(category_id)) { + processDefinitionQuery.processDefinitionCategory(category_id); + } + processDefinitionQuery.orderByDeploymentId().desc(); + List list = processDefinitionQuery.processDefinitionNameLike("%" + name + "%").list(); + return WrapMapper.ok(ActivitiTools.turnProcessDefinitions(list)); + } + + @ApiOperation(value = "删除流程定义") + @ApiImplicitParam(name = "deploymentId", value = "流程deploymentId") + @GetMapping("/activiti_define_delete") + public Wrapper activiti_define_delete(String deploymentId) { + repositoryService.deleteDeployment(deploymentId); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "启动流程-以流程定义id") + @ApiImplicitParam(name = "id", value = "流程定义Id") + @GetMapping("/activiti_define_start") + public Wrapper activiti_define_start(String id) { + // 创建查询对象 + ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); + // 使用流程定义的名称模糊查询 + processDefinitionQuery.processDefinitionCategory("4bdf0b396b4aa6ea10dd5e19956a1e22"); + long total = processDefinitionQuery.count(); + List list = processDefinitionQuery.orderByProcessDefinitionKey().asc().list(); + List> definitions = ActivitiTools.turnProcessDefinitions(list); + String pid = ""; + for(Map map:definitions){ + if(map.get("key").toString().equals(id)){ + pid = map.get("id").toString(); + } + } + + + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult(); + + ProcessInstance pi = runtimeService.startProcessInstanceById(pid); + Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); + task.setAssignee(SessionTool.getSessionAdminId()); + taskService.saveTask(task); + + logger.info("启动流程实例,获取id-->{},实例名称-->{}", pi.getId(), pd.getName()); + return WrapMapper.ok(pi.getId()); + } + + @ApiOperation(value = "启动流程-以流程定义id") + @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "流程定义Id"), + @ApiImplicitParam(name = "userId", value = "流程发起人Id") }) + @GetMapping("/activiti_define_start_user") + public Wrapper activiti_define_start(String id,String userId,String bpnId) { + // 创建查询对象 + ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); + // 使用流程定义的名称模糊查询 + processDefinitionQuery.processDefinitionCategory("4bdf0b396b4aa6ea10dd5e19956a1e22"); + long total = processDefinitionQuery.count(); + List list = processDefinitionQuery.orderByProcessDefinitionKey().asc().list(); + List> definitions = ActivitiTools.turnProcessDefinitions(list); + String pid = ""; + for(Map map:definitions){ + if(map.get("key").toString().equals(id)){ + pid = map.get("id").toString(); + } + } + + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(pid).singleResult(); + + ProcessInstance pi = runtimeService.startProcessInstanceById(pid); + Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); + task.setAssignee(userId); + taskService.saveTask(task); + + if(bpnId == null) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + BusProcessName busProcessName = new BusProcessName(); + busProcessName.setPrcId(pi.getId()); + busProcessName.setCreatTime(sdf.format(new Date())); + busProcessName.setCreatUser(userId); + ResponseMessage byId = lawsUserInfoService.getById(userId); + busProcessName.setCreatUserName(byId.getData().getUname()); + busProcessName.setPrcNum(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); + if(id.equals("bzhyhhgllc")){ + String prcName = bpnId; + busProcessName.setPrcType("16"); + busProcessName.setPrcName(prcName); + } + ibusprocessnameService.save(busProcessName); + }else { + if (bpnId.indexOf("会议会后") != -1) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + BusProcessName busProcessName = new BusProcessName(); + busProcessName.setPrcId(pi.getId()); + busProcessName.setCreatTime(sdf.format(new Date())); + busProcessName.setCreatUser(userId); + ResponseMessage byId = lawsUserInfoService.getById(userId); + busProcessName.setCreatUserName(byId.getData().getUname()); + busProcessName.setPrcNum(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); + if (id.equals("bzhyhhgllc")) { + String prcName = bpnId; + busProcessName.setPrcType("16"); + busProcessName.setPrcName(prcName); + } + ibusprocessnameService.save(busProcessName); + } else { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ID", bpnId); + BusProcessName one = ibusprocessnameService.getOne(queryWrapper); + one.setPrcNum(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); + one.setPrcId(pi.getId()); + ibusprocessnameService.saveOrUpdate(one); + } + } + logger.info("启动流程实例,获取id-->{},实例名称-->{}", pi.getId(), pd.getName()); + return WrapMapper.ok(task.getId()); + } + + /** + * 企标复审流程专用 + * @param id + * @param userId + * @return + */ + @ApiOperation(value = "启动流程-以流程定义id") + @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "流程定义Id"), + @ApiImplicitParam(name = "userId", value = "流程发起人Id") }) + @GetMapping("/activiti_define_start_user1") + public Map activiti_define_start1(String id,String userId,String standName) { + ProcessDefinition pd = repositoryService.createProcessDefinitionQuery().processDefinitionId(id).singleResult(); + + ProcessInstance pi = runtimeService.startProcessInstanceById(id); + Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult(); + task.setAssignee(userId); + taskService.saveTask(task); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + BusProcessName busProcessName = new BusProcessName(); + busProcessName.setPrcId(pi.getId()); + busProcessName.setCreatTime(sdf.format(new Date())); + if (userId != null){ + busProcessName.setCreatUser(userId); + ResponseMessage byId = lawsUserInfoService.getById(userId); + busProcessName.setCreatUserName(byId.getData().getUname()); + } + busProcessName.setPrcNum(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date())); + if (id.equals("qbfslc:1:2962547")){ + busProcessName.setPrcType("19"); + String prcName = standName+"-企标复审"; + busProcessName.setPrcName(prcName); + } + if (id.equals("qbfzlc:1:3130004")){ + busProcessName.setPrcType("7"); + String prcName = standName+"-企标废止"; + busProcessName.setPrcName(prcName); + } + if (id.equals("qbzxdsqlc:1:2595004")){ + busProcessName.setPrcType("6"); + String prcName = "QBFS"+ + new SimpleDateFormat("yyyyMMdd").format(new Date()); + busProcessName.setPrcName(prcName); + } + ibusprocessnameService.save(busProcessName); + logger.info("启动流程实例,获取id-->{},实例名称-->{}", pi.getId(), pd.getName()); + Map map = new HashMap<>(); + map.put("prcId",pi.getId()); + map.put("taskId",task.getId()); + return map; + } + + + @ApiOperation(value = "启动流程-以key") + @ApiImplicitParam(name = "keyName", value = "key") + @GetMapping("/start") + public Wrapper startProcess(String keyName) { + // 在流程启动之前设置发起人 + identityService.setAuthenticatedUserId(SessionTool.getSessionAdminId()); + // 启动流程 + ProcessInstance process = runtimeService.startProcessInstanceByKey(keyName); + + // 用于开启第一个 task任务 + Task task = taskService.createTaskQuery().processInstanceId(process.getId()).singleResult(); + task.setAssignee(SessionTool.getSessionAdminId()); + taskService.saveTask(task); + + return WrapMapper.ok(process.getId() + " : " + process.getProcessDefinitionId()); + } + + @ApiOperation(value = "判断流程定义key的唯一性") + @GetMapping("/check_define_key") + public Wrapper check_define_key(String modelId, String key) { + Model modelData = repositoryService.getModel(modelId); + System.out.println("modelData"+modelData); + ProcessDefinition pd = null; + if(modelData.getDeploymentId()!=null){ + pd = repositoryService.createProcessDefinitionQuery() + .deploymentId(modelData.getDeploymentId()).singleResult(); + } + + if (ChkUtil.isNotNull(pd) && pd.getKey().equals(key)) { + return WrapMapper.ok("TRUE"); + } + + Pattern p = Pattern.compile(".*\\d+.*"); + Matcher m = p.matcher(key); + if (m.matches()) { + return WrapMapper.ok("NUM"); + } + List list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(key) + .list(); + if (list.size() > 0) { + return WrapMapper.ok("FALSE"); + } + return WrapMapper.ok("TRUE"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Children.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Children.java new file mode 100644 index 00000000..7aeeced5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Children.java @@ -0,0 +1,293 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; +import java.util.List; + +/** + * Auto-generated: 2020-11-16 22:42:30 + * + * @author bejson.com (i@bejson.com) + * @website http://www.bejson.com/java2pojo/ + */ +public class Children { + + private String VSEId; + private boolean isTree; + private String deptName; + private String resNum; + private String resName; + private List itemsList; + private String deptId; + private String resId; + private String VSEName; + private List zNodes; + private Form form; + private String type; + private String taskId; + private String DREId; + private String DREName; + private String resType; + /** + * 审批意见 + */ + private String approvalOpinions; + + /** + * 审批内容 + */ + private String approvalContent; + private Date opinionTime; + private String opinion; + private String opinionContent; + private String opinionName; + private String opinionNode; + private String termsConditions; + + private String XMPGJS; + private String XMPGJSName; + + private String newPutText; + private String prodPutText; + private String authObj; + private String authDelive; + private String performInfo; + + public void setVSEId(String VSEId) { + this.VSEId = VSEId; + } + public String getVSEId() { + return VSEId; + } + + public void setIsTree(boolean isTree) { + this.isTree = isTree; + } + public boolean getIsTree() { + return isTree; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + public String getDeptName() { + return deptName; + } + + public void setResNum(String resNum) { + this.resNum = resNum; + } + public String getResNum() { + return resNum; + } + + public void setResName(String resName) { + this.resName = resName; + } + public String getResName() { + return resName; + } + + public void setItemsList(List itemsList) { + this.itemsList = itemsList; + } + public List getItemsList() { + return itemsList; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + public String getDeptId() { + return deptId; + } + + public void setResId(String resId) { + this.resId = resId; + } + public String getResId() { + return resId; + } + + public void setVSEName(String VSEName) { + this.VSEName = VSEName; + } + public String getVSEName() { + return VSEName; + } + + public void setZNodes(List zNodes) { + this.zNodes = zNodes; + } + public List getZNodes() { + return zNodes; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getDREId() { + return DREId; + } + + public void setDREId(String DREId) { + this.DREId = DREId; + } + + public String getDREName() { + return DREName; + } + + public void setDREName(String DREName) { + this.DREName = DREName; + } + + public Form getForm() { + return form; + } + + public void setForm(Form form) { + this.form = form; + } + + public String getApprovalOpinions() { + return approvalOpinions; + } + + public void setApprovalOpinions(String approvalOpinions) { + this.approvalOpinions = approvalOpinions; + } + + public String getApprovalContent() { + return approvalContent; + } + + public void setApprovalContent(String approvalContent) { + this.approvalContent = approvalContent; + } + + public String getResType() { + return resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getOpinionContent() { + return opinionContent; + } + + public void setOpinionContent(String opinionContent) { + this.opinionContent = opinionContent; + } + + public String getOpinionName() { + return opinionName; + } + + public void setOpinionName(String opinionName) { + this.opinionName = opinionName; + } + + public String getOpinionNode() { + return opinionNode; + } + + public void setOpinionNode(String opinionNode) { + this.opinionNode = opinionNode; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } + + public String getTermsConditions() { + return termsConditions; + } + + public void setTermsConditions(String termsConditions) { + this.termsConditions = termsConditions; + } + + public String getXMPGJS() { + return XMPGJS; + } + + public void setXMPGJS(String XMPGJS) { + this.XMPGJS = XMPGJS; + } + + public String getXMPGJSName() { + return XMPGJSName; + } + + public void setXMPGJSName(String XMPGJSName) { + this.XMPGJSName = XMPGJSName; + } + + public String getNewPutText() { + return newPutText; + } + + public void setNewPutText(String newPutText) { + this.newPutText = newPutText; + } + + public String getProdPutText() { + return prodPutText; + } + + public void setProdPutText(String prodPutText) { + this.prodPutText = prodPutText; + } + + public String getAuthObj() { + return authObj; + } + + public void setAuthObj(String authObj) { + this.authObj = authObj; + } + + public String getAuthDelive() { + return authDelive; + } + + public void setAuthDelive(String authDelive) { + this.authDelive = authDelive; + } + + public String getPerformInfo() { + return performInfo; + } + + public void setPerformInfo(String performInfo) { + this.performInfo = performInfo; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Data.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Data.java new file mode 100644 index 00000000..8fb892cf --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Data.java @@ -0,0 +1,85 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +public class Data { + private String attId; + private String fileName; + private String fileSuffix; + private String filePath; + private String name; + private String id; + private String standNum; + private String standName; + private String oldFileName; + + public String getOldFileName() { + return oldFileName; + } + + public void setOldFileName(String oldFileName) { + this.oldFileName = oldFileName; + } + + public String getStandName() { + return standName; + } + + public void setStandName(String standName) { + this.standName = standName; + } + + public String getStandNum() { + return standNum; + } + + public void setStandNum(String standNum) { + this.standNum = standNum; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getFileSuffix() { + return fileSuffix; + } + + public void setFileSuffix(String fileSuffix) { + this.fileSuffix = fileSuffix; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getAttId() { + return attId; + } + + public void setAttId(String attId) { + this.attId = attId; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Form.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Form.java new file mode 100644 index 00000000..e02a7c82 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Form.java @@ -0,0 +1,247 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.List; + +public class Form { + + private String estimatedChangeCycle; + private String itemNumber; + private String justified; + private String SupportingMaterials; + private String changeScheme; + private String cost; + private String current; + private String cycle; + private String enterpriseLabel; + private String enterpriseLabel2; + private String enterpriseLabel3; + private String estimatedCost; + private String feedback; + private String nonConformity; + private String riskPoint; + private String verificationScheme; + private List fileInfoList; + private String fileInfo; + private List file; + private String compTime; + + private String compPerson; + + private String nonConfomity; + + private String resNum; + + private String creatUser; + + private String creatOrgId; + + private String creatUserName; + + public String getEstimatedChangeCycle() { + return estimatedChangeCycle; + } + + public void setEstimatedChangeCycle(String estimatedChangeCycle) { + this.estimatedChangeCycle = estimatedChangeCycle; + } + + public String getItemNumber() { + return itemNumber; + } + + public void setItemNumber(String itemNumber) { + this.itemNumber = itemNumber; + } + + public String getJustified() { + return justified; + } + + public void setJustified(String justified) { + this.justified = justified; + } + + public String getSupportingMaterials() { + return SupportingMaterials; + } + + public void setSupportingMaterials(String supportingMaterials) { + SupportingMaterials = supportingMaterials; + } + + public String getChangeScheme() { + return changeScheme; + } + + public void setChangeScheme(String changeScheme) { + this.changeScheme = changeScheme; + } + + public String getCost() { + return cost; + } + + public void setCost(String cost) { + this.cost = cost; + } + + public String getCurrent() { + return current; + } + + public void setCurrent(String current) { + this.current = current; + } + + public String getCycle() { + return cycle; + } + + public void setCycle(String cycle) { + this.cycle = cycle; + } + + public String getEnterpriseLabel() { + return enterpriseLabel; + } + + public void setEnterpriseLabel(String enterpriseLabel) { + this.enterpriseLabel = enterpriseLabel; + } + + public String getEnterpriseLabel2() { + return enterpriseLabel2; + } + + public void setEnterpriseLabel2(String enterpriseLabel2) { + this.enterpriseLabel2 = enterpriseLabel2; + } + + public String getEnterpriseLabel3() { + return enterpriseLabel3; + } + + public void setEnterpriseLabel3(String enterpriseLabel3) { + this.enterpriseLabel3 = enterpriseLabel3; + } + + public String getEstimatedCost() { + return estimatedCost; + } + + public void setEstimatedCost(String estimatedCost) { + this.estimatedCost = estimatedCost; + } + + public String getFeedback() { + return feedback; + } + + public void setFeedback(String feedback) { + this.feedback = feedback; + } + + public String getNonConformity() { + return nonConformity; + } + + public void setNonConformity(String nonConformity) { + this.nonConformity = nonConformity; + } + + public String getRiskPoint() { + return riskPoint; + } + + public void setRiskPoint(String riskPoint) { + this.riskPoint = riskPoint; + } + + public String getVerificationScheme() { + return verificationScheme; + } + + public void setVerificationScheme(String verificationScheme) { + this.verificationScheme = verificationScheme; + } + + public List getFileInfoList() { + return fileInfoList; + } + + public void setFileInfoList(List fileInfoList) { + this.fileInfoList = fileInfoList; + } + + public String getFileInfo() { + return fileInfo; + } + + public void setFileInfo(String fileInfo) { + this.fileInfo = fileInfo; + } + + public List getFile() { + return file; + } + + public void setFile(List file) { + this.file = file; + } + + public String getCompTime() { + return compTime; + } + + public void setCompTime(String compTime) { + this.compTime = compTime; + } + + public String getCompPerson() { + return compPerson; + } + + public void setCompPerson(String compPerson) { + this.compPerson = compPerson; + } + + public String getNonConfomity() { + return nonConfomity; + } + + public void setNonConfomity(String nonConfomity) { + this.nonConfomity = nonConfomity; + } + + public String getResNum() { + return resNum; + } + + public void setResNum(String resNum) { + this.resNum = resNum; + } + + public String getCreatUser() { + return creatUser; + } + + public void setCreatUser(String creatUser) { + this.creatUser = creatUser; + } + + public String getCreatOrgId() { + return creatOrgId; + } + + public void setCreatOrgId(String creatOrgId) { + this.creatOrgId = creatOrgId; + } + + public String getCreatUserName() { + return creatUserName; + } + + public void setCreatUserName(String creatUserName) { + this.creatUserName = creatUserName; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/FromFile.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/FromFile.java new file mode 100644 index 00000000..f3e1bbda --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/FromFile.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +public class FromFile { + private String uid; + private String size; + private String percentage; + private String name; + private Response response; + + public String getUid() { + return uid; + } + + public void setUid(String uid) { + this.uid = uid; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getPercentage() { + return percentage; + } + + public void setPercentage(String percentage) { + this.percentage = percentage; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Response getResponse() { + return response; + } + + public void setResponse(Response response) { + this.response = response; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemListNew.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemListNew.java new file mode 100644 index 00000000..7fa4990b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemListNew.java @@ -0,0 +1,281 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; +import java.util.List; + +public class ItemListNew { + + private List deptName; + private List foName; + private String resNum; + private String resName; + private List foId; + private List deptId; + private String resId; + private String taskId; + private List zNodes; + private Form form; + private String type; + private String userId; + private String VSEId; + private String VSEName; + private String DREId; + private String DREName; + private String termsConditions; + private String resType; + /** + * 审批意见 + */ + private String approvalOpinions; + + /** + * 审批内容 + */ + private String approvalContent; + + private Date opinionTime; + + private String opinion; + private String opinionContent; + private String opinionName; + private String opinionNode; + + private String compTime; + + private String compPerson; + + private List XMPGJS; + private List XMPGJSName; + + public List getDeptName() { + return deptName; + } + + public void setDeptName(List deptName) { + this.deptName = deptName; + } + + public List getFoName() { + return foName; + } + + public void setFoName(List foName) { + this.foName = foName; + } + + public String getResNum() { + return resNum; + } + + public void setResNum(String resNum) { + this.resNum = resNum; + } + + public String getResName() { + return resName; + } + + public void setResName(String resName) { + this.resName = resName; + } + + public List getFoId() { + return foId; + } + + public void setFoId(List foId) { + this.foId = foId; + } + + public String getResId() { + return resId; + } + + public void setResId(String resId) { + this.resId = resId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public List getzNodes() { + return zNodes; + } + + public void setzNodes(List zNodes) { + this.zNodes = zNodes; + } + + public Form getForm() { + return form; + } + + public void setForm(Form form) { + this.form = form; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getVSEId() { + return VSEId; + } + + public void setVSEId(String VSEId) { + this.VSEId = VSEId; + } + + public String getVSEName() { + return VSEName; + } + + public void setVSEName(String VSEName) { + this.VSEName = VSEName; + } + + public String getDREId() { + return DREId; + } + + public void setDREId(String DREId) { + this.DREId = DREId; + } + + public String getDREName() { + return DREName; + } + + public void setDREName(String DREName) { + this.DREName = DREName; + } + + public String getTermsConditions() { + return termsConditions; + } + + public void setTermsConditions(String termsConditions) { + this.termsConditions = termsConditions; + } + + public String getResType() { + return resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + public String getApprovalOpinions() { + return approvalOpinions; + } + + public void setApprovalOpinions(String approvalOpinions) { + this.approvalOpinions = approvalOpinions; + } + + public String getApprovalContent() { + return approvalContent; + } + + public void setApprovalContent(String approvalContent) { + this.approvalContent = approvalContent; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getOpinionContent() { + return opinionContent; + } + + public void setOpinionContent(String opinionContent) { + this.opinionContent = opinionContent; + } + + public String getOpinionName() { + return opinionName; + } + + public void setOpinionName(String opinionName) { + this.opinionName = opinionName; + } + + public String getOpinionNode() { + return opinionNode; + } + + public void setOpinionNode(String opinionNode) { + this.opinionNode = opinionNode; + } + + public String getCompTime() { + return compTime; + } + + public void setCompTime(String compTime) { + this.compTime = compTime; + } + + public String getCompPerson() { + return compPerson; + } + + public void setCompPerson(String compPerson) { + this.compPerson = compPerson; + } + + public List getXMPGJS() { + return XMPGJS; + } + + public void setXMPGJS(List XMPGJS) { + this.XMPGJS = XMPGJS; + } + + public List getXMPGJSName() { + return XMPGJSName; + } + + public void setXMPGJSName(List XMPGJSName) { + this.XMPGJSName = XMPGJSName; + } + + public List getDeptId() { + return deptId; + } + + public void setDeptId(List deptId) { + this.deptId = deptId; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemsList.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemsList.java new file mode 100644 index 00000000..0a64fc29 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ItemsList.java @@ -0,0 +1,328 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; +import java.util.List; + +public class ItemsList { + + + private String deptName; + private String foName; + private String resNum; + private String resName; + private List foId; + private String deptId; + private String resId; + private String taskId; + private List zNodes; + private Form form; + private String type; + private String userId; + private String VSEId; + private String VSEName; + private String DREId; + private String DREName; + private String termsConditions; + private String resType; + /** + * 审批意见 + */ + private String approvalOpinions; + + /** + * 审批内容 + */ + private String approvalContent; + + private Date opinionTime; + + private String opinion; + private String opinionContent; + private String opinionName; + private String opinionNode; + + private String compTime; + + private String compPerson; + + private String XMPGJS; + private String XMPGJSName; + + private String newPutText; + private String prodPutText; + private String authObj; + private String authDelive; + private String performInfo; + + public String getDeptName() { + return deptName; + } + + public void setDeptName(String deptName) { + this.deptName = deptName; + } + + public String getFoName() { + return foName; + } + + public void setFoName(String foName) { + this.foName = foName; + } + + public String getResNum() { + return resNum; + } + + public void setResNum(String resNum) { + this.resNum = resNum; + } + + public String getResName() { + return resName; + } + + public void setResName(String resName) { + this.resName = resName; + } + + public List getFoId() { + return foId; + } + + public void setFoId(List foId) { + this.foId = foId; + } + + public String getDeptId() { + return deptId; + } + + public void setDeptId(String deptId) { + this.deptId = deptId; + } + + public String getResId() { + return resId; + } + + public void setResId(String resId) { + this.resId = resId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public List getzNodes() { + return zNodes; + } + + public void setzNodes(List zNodes) { + this.zNodes = zNodes; + } + + public Form getForm() { + return form; + } + + public void setForm(Form form) { + this.form = form; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getVSEId() { + return VSEId; + } + + public void setVSEId(String VSEId) { + this.VSEId = VSEId; + } + + public String getVSEName() { + return VSEName; + } + + public void setVSEName(String VSEName) { + this.VSEName = VSEName; + } + + public String getDREId() { + return DREId; + } + + public void setDREId(String DREId) { + this.DREId = DREId; + } + + public String getDREName() { + return DREName; + } + + public void setDREName(String DREName) { + this.DREName = DREName; + } + + public String getTermsConditions() { + return termsConditions; + } + + public void setTermsConditions(String termsConditions) { + this.termsConditions = termsConditions; + } + + public String getApprovalOpinions() { + return approvalOpinions; + } + + public void setApprovalOpinions(String approvalOpinions) { + this.approvalOpinions = approvalOpinions; + } + + public String getApprovalContent() { + return approvalContent; + } + + public void setApprovalContent(String approvalContent) { + this.approvalContent = approvalContent; + } + + public String getResType() { + return resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getOpinionContent() { + return opinionContent; + } + + public void setOpinionContent(String opinionContent) { + this.opinionContent = opinionContent; + } + + public String getOpinionName() { + return opinionName; + } + + public void setOpinionName(String opinionName) { + this.opinionName = opinionName; + } + + public String getOpinionNode() { + return opinionNode; + } + + public void setOpinionNode(String opinionNode) { + this.opinionNode = opinionNode; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } + + public String getCompTime() { + return compTime; + } + + public void setCompTime(String compTime) { + this.compTime = compTime; + } + + public String getCompPerson() { + return compPerson; + } + + public void setCompPerson(String compPerson) { + this.compPerson = compPerson; + } + + public String getXMPGJS() { + return XMPGJS; + } + + public void setXMPGJS(String XMPGJS) { + this.XMPGJS = XMPGJS; + } + + public String getXMPGJSName() { + return XMPGJSName; + } + + public void setXMPGJSName(String XMPGJSName) { + this.XMPGJSName = XMPGJSName; + } + + public String getNewPutText() { + return newPutText; + } + + public void setNewPutText(String newPutText) { + this.newPutText = newPutText; + } + + public String getProdPutText() { + return prodPutText; + } + + public void setProdPutText(String prodPutText) { + this.prodPutText = prodPutText; + } + + public String getAuthObj() { + return authObj; + } + + public void setAuthObj(String authObj) { + this.authObj = authObj; + } + + public String getAuthDelive() { + return authDelive; + } + + public void setAuthDelive(String authDelive) { + this.authDelive = authDelive; + } + + public String getPerformInfo() { + return performInfo; + } + + public void setPerformInfo(String performInfo) { + this.performInfo = performInfo; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ModelQuery.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ModelQuery.java new file mode 100644 index 00000000..a7b3d032 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ModelQuery.java @@ -0,0 +1,22 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import io.swagger.annotations.ApiModel; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "ModelQuery 对象", description = "") +public class ModelQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + public Wrapper makeQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Page.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Page.java new file mode 100644 index 00000000..01d046b8 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Page.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; + +import java.util.List; + +public class Page { + private Integer pageNo; + private Integer pageSize; + private Long count; + private List list; + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Long getCount() { + return count; + } + + public void setCount(Long count) { + this.count = count; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } + + public Integer getPageNo() { + return pageNo; + } + + public void setPageNo(Integer pageNo) { + this.pageNo = pageNo; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectAssessDTO.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectAssessDTO.java new file mode 100644 index 00000000..3546038f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectAssessDTO.java @@ -0,0 +1,580 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; +import java.util.List; + +/** + * Auto-generated: 2020-11-16 22:42:30 + * + * @author bejson.com (i@bejson.com) + * @website http://www.bejson.com/java2pojo/ + */ +public class ProjectAssessDTO { + + private String prodectCode; + private String creationUser; + private Date creationTime; + private Date planPassTime; + private String productBrand; + private String flatform; + private String productName; + private String productSet; + private String saleMarket; + private Date modifyTime; + private String targetMarket; +// private Children children; + private List children; + private String id; + private String productType; + private Date eopTime; + private String dataType; + private String relatePerson; + private Date sopTime; + private Date actualPassTime; + private List carModeFileList; + private String isDevelop; + private String pointTime; + private String carModel; + private String opinion; + private Date opinionTime; + private String opinionContent; + private String vseOpinion; + private String vseOpinionContent; + + private String carModeFile; + private String energyKind; + private String validFlag; + private String relatePersonShow; + private String energyKindShow; + private String productTypeShow; + private String standId; + private String standType; + private String shownumber; + private String showname; + private String country; + private String notId; + private String testItemId; + private String testItemName; + private String testItemCode; + private String standName; + private String authTypeShow; + private String standCode; + private String productBrandShow; + private String targetMarketShow; + private String saleMarketShow; + private String creatUser; + private String productNo; + private String producePlace; + private String baseCartype; + private String leftRight; + private String productManager; + private String productManagerShow; + private String productTypeCode; + private String productTypeCodeShow; + private String producePlaceShow; + private String prcNum; + private String produceCode; + private String productStage; + private String zhengcarNo; + private String zhengcarSopTime; + private List userEOList; + + + public void setProdectCode(String prodectCode) { + this.prodectCode = prodectCode; + } + public String getProdectCode() { + return prodectCode; + } + + public void setCreationUser(String creationUser) { + this.creationUser = creationUser; + } + public String getCreationUser() { + return creationUser; + } + + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + public Date getCreationTime() { + return creationTime; + } + + public void setPlanPassTime(Date planPassTime) { + this.planPassTime = planPassTime; + } + public Date getPlanPassTime() { + return planPassTime; + } + + public void setProductBrand(String productBrand) { + this.productBrand = productBrand; + } + public String getProductBrand() { + return productBrand; + } + + public void setFlatform(String flatform) { + this.flatform = flatform; + } + public String getFlatform() { + return flatform; + } + + public void setProductName(String productName) { + this.productName = productName; + } + public String getProductName() { + return productName; + } + + public void setProductSet(String productSet) { + this.productSet = productSet; + } + public String getProductSet() { + return productSet; + } + + public void setSaleMarket(String saleMarket) { + this.saleMarket = saleMarket; + } + public String getSaleMarket() { + return saleMarket; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + public Date getModifyTime() { + return modifyTime; + } + + public void setTargetMarket(String targetMarket) { + this.targetMarket = targetMarket; + } + public String getTargetMarket() { + return targetMarket; + } + + public void setId(String id) { + this.id = id; + } + public String getId() { + return id; + } + + public void setProductType(String productType) { + this.productType = productType; + } + public String getProductType() { + return productType; + } + + public void setEopTime(Date eopTime) { + this.eopTime = eopTime; + } + public Date getEopTime() { + return eopTime; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + public String getDataType() { + return dataType; + } + + public void setRelatePerson(String relatePerson) { + this.relatePerson = relatePerson; + } + public String getRelatePerson() { + return relatePerson; + } + + public void setSopTime(Date sopTime) { + this.sopTime = sopTime; + } + public Date getSopTime() { + return sopTime; + } + + public void setActualPassTime(Date actualPassTime) { + this.actualPassTime = actualPassTime; + } + public Date getActualPassTime() { + return actualPassTime; + } + + public void setCarModeFileList(List carModeFileList) { + this.carModeFileList = carModeFileList; + } + public List getCarModeFileList() { + return carModeFileList; + } + + public void setIsDevelop(String isDevelop) { + this.isDevelop = isDevelop; + } + public String getIsDevelop() { + return isDevelop; + } + + public void setPointTime(String pointTime) { + this.pointTime = pointTime; + } + public String getPointTime() { + return pointTime; + } + + public void setCarModel(String carModel) { + this.carModel = carModel; + } + public String getCarModel() { + return carModel; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getOpinionContent() { + return opinionContent; + } + + public void setOpinionContent(String opinionContent) { + this.opinionContent = opinionContent; + } + + public String getVseOpinion() { + return vseOpinion; + } + + public void setVseOpinion(String vseOpinion) { + this.vseOpinion = vseOpinion; + } + + public String getVseOpinionContent() { + return vseOpinionContent; + } + + public void setVseOpinionContent(String vseOpinionContent) { + this.vseOpinionContent = vseOpinionContent; + } + + public String getCarModeFile() { + return carModeFile; + } + + public void setCarModeFile(String carModeFile) { + this.carModeFile = carModeFile; + } + + public String getEnergyKind() { + return energyKind; + } + + public void setEnergyKind(String energyKind) { + this.energyKind = energyKind; + } + + public String getValidFlag() { + return validFlag; + } + + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + public String getRelatePersonShow() { + return relatePersonShow; + } + + public void setRelatePersonShow(String relatePersonShow) { + this.relatePersonShow = relatePersonShow; + } + + public String getEnergyKindShow() { + return energyKindShow; + } + + public void setEnergyKindShow(String energyKindShow) { + this.energyKindShow = energyKindShow; + } + + public String getProductTypeShow() { + return productTypeShow; + } + + public void setProductTypeShow(String productTypeShow) { + this.productTypeShow = productTypeShow; + } + + public String getStandId() { + return standId; + } + + public void setStandId(String standId) { + this.standId = standId; + } + + public String getStandType() { + return standType; + } + + public void setStandType(String standType) { + this.standType = standType; + } + + public String getShownumber() { + return shownumber; + } + + public void setShownumber(String shownumber) { + this.shownumber = shownumber; + } + + public String getShowname() { + return showname; + } + + public void setShowname(String showname) { + this.showname = showname; + } + + public String getCountry() { + return country; + } + + public void setCountry(String country) { + this.country = country; + } + + public String getNotId() { + return notId; + } + + public void setNotId(String notId) { + this.notId = notId; + } + + public String getTestItemId() { + return testItemId; + } + + public void setTestItemId(String testItemId) { + this.testItemId = testItemId; + } + + public String getTestItemName() { + return testItemName; + } + + public void setTestItemName(String testItemName) { + this.testItemName = testItemName; + } + + public String getTestItemCode() { + return testItemCode; + } + + public void setTestItemCode(String testItemCode) { + this.testItemCode = testItemCode; + } + + public String getAuthTypeShow() { + return authTypeShow; + } + + public void setAuthTypeShow(String authTypeShow) { + this.authTypeShow = authTypeShow; + } + + public String getStandName() { + return standName; + } + + public void setStandName(String standName) { + this.standName = standName; + } + + public String getStandCode() { + return standCode; + } + + public void setStandCode(String standCode) { + this.standCode = standCode; + } + + public String getProductBrandShow() { + return productBrandShow; + } + + public void setProductBrandShow(String productBrandShow) { + this.productBrandShow = productBrandShow; + } + + public String getTargetMarketShow() { + return targetMarketShow; + } + + public void setTargetMarketShow(String targetMarketShow) { + this.targetMarketShow = targetMarketShow; + } + + public String getSaleMarketShow() { + return saleMarketShow; + } + + public void setSaleMarketShow(String saleMarketShow) { + this.saleMarketShow = saleMarketShow; + } + + public String getCreatUser() { + return creatUser; + } + + public void setCreatUser(String creatUser) { + this.creatUser = creatUser; + } + + public String getProductNo() { + return productNo; + } + + public void setProductNo(String productNo) { + this.productNo = productNo; + } + + public String getProducePlace() { + return producePlace; + } + + public void setProducePlace(String producePlace) { + this.producePlace = producePlace; + } + + public String getBaseCartype() { + return baseCartype; + } + + public void setBaseCartype(String baseCartype) { + this.baseCartype = baseCartype; + } + + public String getLeftRight() { + return leftRight; + } + + public void setLeftRight(String leftRight) { + this.leftRight = leftRight; + } + + public String getProductManager() { + return productManager; + } + + public void setProductManager(String productManager) { + this.productManager = productManager; + } + + public String getProductManagerShow() { + return productManagerShow; + } + + public void setProductManagerShow(String productManagerShow) { + this.productManagerShow = productManagerShow; + } + + public String getProductTypeCode() { + return productTypeCode; + } + + public void setProductTypeCode(String productTypeCode) { + this.productTypeCode = productTypeCode; + } + + public String getProductTypeCodeShow() { + return productTypeCodeShow; + } + + public void setProductTypeCodeShow(String productTypeCodeShow) { + this.productTypeCodeShow = productTypeCodeShow; + } + + public String getProducePlaceShow() { + return producePlaceShow; + } + + public void setProducePlaceShow(String producePlaceShow) { + this.producePlaceShow = producePlaceShow; + } + + public String getPrcNum() { + return prcNum; + } + + public void setPrcNum(String prcNum) { + this.prcNum = prcNum; + } + + public String getProduceCode() { + return produceCode; + } + + public void setProduceCode(String produceCode) { + this.produceCode = produceCode; + } + + public String getProductStage() { + return productStage; + } + + public void setProductStage(String productStage) { + this.productStage = productStage; + } + + public String getZhengcarNo() { + return zhengcarNo; + } + + public void setZhengcarNo(String zhengcarNo) { + this.zhengcarNo = zhengcarNo; + } + + public String getZhengcarSopTime() { + return zhengcarSopTime; + } + + public void setZhengcarSopTime(String zhengcarSopTime) { + this.zhengcarSopTime = zhengcarSopTime; + } + + public List getUserEOList() { + return userEOList; + } + + public void setUserEOList(List userEOList) { + this.userEOList = userEOList; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectFormDTO.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectFormDTO.java new file mode 100644 index 00000000..d4f27373 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ProjectFormDTO.java @@ -0,0 +1,244 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; + +/** + * 项目评估符合不符合列表 + * @author david + */ +public class ProjectFormDTO extends Form { + + /** + * 标准或者条款ID + */ + private String resId; + + /** + * 标准编号 + */ + private String resNum; + + /** + * 标准名称 + */ + private String resName; + + /** + * 填写人id + */ + private String writeUserId; + + /** + * 填写人名称 + */ + private String writeUsername; + + /** + * 条款编号 + */ + private String clauseNum; + + /** + * 条款名称 + */ + private String clauseName; + + /** + * 条款内容 + */ + private String clauseContent; + + /** + * 审批意见 + */ + private String approvalOpinions; + + /** + * 审批内容 + */ + private String approvalContent; + + /** + * 任务id,用于查询任务数据,修改json + */ + private String taskId; + private String opinion; + private Date opinionTime; + private String opinionContent; + private String vseOpinion; + private String vseOpinionContent; + private String opinionName; + private String opinionNode; + private String termsConditions; + + private String XMPGJS; + private String XMPGJSName; + + public String getResId() { + return resId; + } + + public void setResId(String resId) { + this.resId = resId; + } + + public String getResNum() { + return resNum; + } + + public void setResNum(String resNum) { + this.resNum = resNum; + } + + public String getResName() { + return resName; + } + + public void setResName(String resName) { + this.resName = resName; + } + + public String getWriteUserId() { + return writeUserId; + } + + public void setWriteUserId(String writeUserId) { + this.writeUserId = writeUserId; + } + + public String getWriteUsername() { + return writeUsername; + } + + public void setWriteUsername(String writeUsername) { + this.writeUsername = writeUsername; + } + + public String getClauseNum() { + return clauseNum; + } + + public void setClauseNum(String clauseNum) { + this.clauseNum = clauseNum; + } + + public String getClauseName() { + return clauseName; + } + + public void setClauseName(String clauseName) { + this.clauseName = clauseName; + } + + public String getClauseContent() { + return clauseContent; + } + + public void setClauseContent(String clauseContent) { + this.clauseContent = clauseContent; + } + + public String getApprovalOpinions() { + return approvalOpinions; + } + + public void setApprovalOpinions(String approvalOpinions) { + this.approvalOpinions = approvalOpinions; + } + + public String getApprovalContent() { + return approvalContent; + } + + public void setApprovalContent(String approvalContent) { + this.approvalContent = approvalContent; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getOpinion() { + return opinion; + } + + public void setOpinion(String opinion) { + this.opinion = opinion; + } + + public String getOpinionContent() { + return opinionContent; + } + + public void setOpinionContent(String opinionContent) { + this.opinionContent = opinionContent; + } + + public String getVseOpinion() { + return vseOpinion; + } + + public void setVseOpinion(String vseOpinion) { + this.vseOpinion = vseOpinion; + } + + public String getVseOpinionContent() { + return vseOpinionContent; + } + + public void setVseOpinionContent(String vseOpinionContent) { + this.vseOpinionContent = vseOpinionContent; + } + + public String getOpinionName() { + return opinionName; + } + + public void setOpinionName(String opinionName) { + this.opinionName = opinionName; + } + + public String getOpinionNode() { + return opinionNode; + } + + public void setOpinionNode(String opinionNode) { + this.opinionNode = opinionNode; + } + + public Date getOpinionTime() { + return opinionTime; + } + + public void setOpinionTime(Date opinionTime) { + this.opinionTime = opinionTime; + } + + public String getTermsConditions() { + return termsConditions; + } + + public void setTermsConditions(String termsConditions) { + this.termsConditions = termsConditions; + } + + public String getXMPGJS() { + return XMPGJS; + } + + public void setXMPGJS(String XMPGJS) { + this.XMPGJS = XMPGJS; + } + + public String getXMPGJSName() { + return XMPGJSName; + } + + public void setXMPGJSName(String XMPGJSName) { + this.XMPGJSName = XMPGJSName; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Response.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Response.java new file mode 100644 index 00000000..0c1ffdca --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/Response.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +public class Response { + private String ok; + private String message; + private String respCode; + private Data data; + + public String getOk() { + return ok; + } + + public void setOk(String ok) { + this.ok = ok; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getRespCode() { + return respCode; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public Data getData() { + return data; + } + + public void setData(Data data) { + this.data = data; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTO.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTO.java new file mode 100644 index 00000000..f15a1671 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTO.java @@ -0,0 +1,175 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; +import java.util.List; + +public class StandardDTO { + + private String resNum; + private String resName; + private List itemsList; + private String resId; + private String taskId; + private List foId; + private Form form; + private String type; + private String userId; + private String resType; + private String deadline; + private List fileList; + private Date Time; + private String fileIds; + /** + * 审批意见 + */ + private String approvalOpinions; + + /** + * 审批内容 + */ + private String approvalContent; + + private String compTime; + + private String compPerson; + + public void setResNum(String resNum) { + this.resNum = resNum; + } + public String getResNum() { + return resNum; + } + + public void setResName(String resName) { + this.resName = resName; + } + public String getResName() { + return resName; + } + + public void setItemsList(List itemsList) { + this.itemsList = itemsList; + } + public List getItemsList() { + return itemsList; + } + + public void setResId(String resId) { + this.resId = resId; + } + public String getResId() { + return resId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public List getFoId() { + return foId; + } + + public void setFoId(List foId) { + this.foId = foId; + } + + public Form getForm() { + return form; + } + + public void setForm(Form form) { + this.form = form; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getApprovalOpinions() { + return approvalOpinions; + } + + public void setApprovalOpinions(String approvalOpinions) { + this.approvalOpinions = approvalOpinions; + } + + public String getApprovalContent() { + return approvalContent; + } + + public void setApprovalContent(String approvalContent) { + this.approvalContent = approvalContent; + } + + public String getResType() { + return resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + public String getDeadline() { + return deadline; + } + + public void setDeadline(String deadline) { + this.deadline = deadline; + } + + public List getFileList() { + return fileList; + } + + public void setFileList(List fileList) { + this.fileList = fileList; + } + + public Date getTime() { + return Time; + } + + public void setTime(Date time) { + Time = time; + } + + public String getFileIds() { + return fileIds; + } + + public void setFileIds(String fileIds) { + this.fileIds = fileIds; + } + + public String getCompTime() { + return compTime; + } + + public void setCompTime(String compTime) { + this.compTime = compTime; + } + + public String getCompPerson() { + return compPerson; + } + + public void setCompPerson(String compPerson) { + this.compPerson = compPerson; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTONew.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTONew.java new file mode 100644 index 00000000..5957efaf --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/StandardDTONew.java @@ -0,0 +1,250 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; +import java.util.List; + +public class StandardDTONew { + + private String resNum; + private String resName; + private String resId; + private String taskId; + private List foId; + private Form form; + private String type; + private String userId; + private String resType; + private String deadline; + private List fileList; + private Date Time; + private String fileIds; + private List itemsList; + /** + * 审批意见 + */ + private String approvalOpinions; + + /** + * 审批内容 + */ + private String approvalContent; + + private String compTime; + + private String compPerson; + + private List deptName; + private List roleIdAndId; + private List deptId; + private List XMPGJSName; + private List XMPGJS; + private List roleName; + private List foName; + private String backSaveFlag; + + public void setResNum(String resNum) { + this.resNum = resNum; + } + public String getResNum() { + return resNum; + } + + public void setResName(String resName) { + this.resName = resName; + } + public String getResName() { + return resName; + } + + + public void setResId(String resId) { + this.resId = resId; + } + public String getResId() { + return resId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public List getFoId() { + return foId; + } + + public void setFoId(List foId) { + this.foId = foId; + } + + public Form getForm() { + return form; + } + + public void setForm(Form form) { + this.form = form; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getApprovalOpinions() { + return approvalOpinions; + } + + public void setApprovalOpinions(String approvalOpinions) { + this.approvalOpinions = approvalOpinions; + } + + public String getApprovalContent() { + return approvalContent; + } + + public void setApprovalContent(String approvalContent) { + this.approvalContent = approvalContent; + } + + public String getResType() { + return resType; + } + + public void setResType(String resType) { + this.resType = resType; + } + + public String getDeadline() { + return deadline; + } + + public void setDeadline(String deadline) { + this.deadline = deadline; + } + + public List getFileList() { + return fileList; + } + + public void setFileList(List fileList) { + this.fileList = fileList; + } + + public Date getTime() { + return Time; + } + + public void setTime(Date time) { + Time = time; + } + + public String getFileIds() { + return fileIds; + } + + public void setFileIds(String fileIds) { + this.fileIds = fileIds; + } + + public String getCompTime() { + return compTime; + } + + public void setCompTime(String compTime) { + this.compTime = compTime; + } + + public String getCompPerson() { + return compPerson; + } + + public void setCompPerson(String compPerson) { + this.compPerson = compPerson; + } + + public List getItemsList() { + return itemsList; + } + + public void setItemsList(List itemsList) { + this.itemsList = itemsList; + } + + public List getDeptName() { + return deptName; + } + + public void setDeptName(List deptName) { + this.deptName = deptName; + } + + public List getRoleIdAndId() { + return roleIdAndId; + } + + public void setRoleIdAndId(List roleIdAndId) { + this.roleIdAndId = roleIdAndId; + } + + public List getDeptId() { + return deptId; + } + + public void setDeptId(List deptId) { + this.deptId = deptId; + } + + public List getXMPGJSName() { + return XMPGJSName; + } + + public void setXMPGJSName(List XMPGJSName) { + this.XMPGJSName = XMPGJSName; + } + + public List getXMPGJS() { + return XMPGJS; + } + + public void setXMPGJS(List XMPGJS) { + this.XMPGJS = XMPGJS; + } + + public List getRoleName() { + return roleName; + } + + public void setRoleName(List roleName) { + this.roleName = roleName; + } + + public List getFoName() { + return foName; + } + + public void setFoName(List foName) { + this.foName = foName; + } + + public String getBackSaveFlag() { + return backSaveFlag; + } + + public void setBackSaveFlag(String backSaveFlag) { + this.backSaveFlag = backSaveFlag; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/TaskCommonQuery.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/TaskCommonQuery.java new file mode 100644 index 00000000..107c9d47 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/TaskCommonQuery.java @@ -0,0 +1,57 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +public class TaskCommonQuery { + + @ApiModelProperty(value = "当前页") + private int current; + @ApiModelProperty(value = "数量") + private int size; + @ApiModelProperty(value = "名称") + private String name; + @ApiModelProperty(value = "开始时间从") + private String startTime; + @ApiModelProperty(value = "到") + private String endTime; + @ApiModelProperty(value = "结束时间从") + private String finishStartTime; + @ApiModelProperty(value = "到") + private String finishEndTime; + @ApiModelProperty(value = "流程分类") + private String category_id; + + @ApiModelProperty(value = "用户Id") + private String userId; + + @ApiModelProperty(value = "创建用户Id") + private String creatuserId; + + @ApiModelProperty(value = "流程类型") + private String prcType; + + @ApiModelProperty(value = "流程名称或编号") + private String prcNameOrId; + + @ApiModelProperty(value = "流程状态") + private String prcState; + + @ApiModelProperty(value = "节点名称") + private String taskName; + + @ApiModelProperty(value = "任务集合") + private List taskList; + + @ApiModelProperty(value = "流程名称") + private String prcName; + + @ApiModelProperty(value = "流程编号") + private String prcNum; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ZNodes.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ZNodes.java new file mode 100644 index 00000000..77d24a38 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/dto/ZNodes.java @@ -0,0 +1,107 @@ +package com.ydw.bat.wkflow.business_activiti.dto; + +import java.util.Date; + +public class ZNodes { + + private String orgName; + private boolean isParent; + private Date creationTime; + private String roleId; + private String icon; + private String pId; + private String title; + private Date modifyTime; + private String name; + private String roleName; + private String id; + + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + public String getOrgName() { + return orgName; + } + + public void setIsParent(boolean isParent) { + this.isParent = isParent; + } + + public boolean getIsParent() { + return isParent; + } + + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + public Date getCreationTime() { + return creationTime; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleId() { + return roleId; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getIcon() { + return icon; + } + + public void setPId(String pId) { + this.pId = pId; + } + + public String getPId() { + return pId; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getTitle() { + return title; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getRoleName() { + return roleName; + } + + public void setId(String id) { + this.id = id; + } + + public String getId() { + return id; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelEditorJsonRestResource.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelEditorJsonRestResource.java new file mode 100644 index 00000000..aeb2c833 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelEditorJsonRestResource.java @@ -0,0 +1,77 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ydw.bat.wkflow.business_activiti.editor; + +import org.activiti.editor.constants.ModelDataJsonConstants; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.tmsps.fk.common.base.action.BaseAction; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +/** + * @author Tijs Rademakers + */ +@Api(description = "工作流编辑器") +@RestController +@RequestMapping(value = "/service") +public class ModelEditorJsonRestResource extends BaseAction implements ModelDataJsonConstants { + + @Autowired + private RepositoryService repositoryService; + + @Autowired + private ObjectMapper objectMapper; + + @ApiOperation(value = "获取模型json数据") + @ApiImplicitParam(name = "modelId", value = "模型id") + @SuppressWarnings("deprecation") + @GetMapping(value = "/model/{modelId}/json", produces = "application/json") + public ObjectNode getEditorJson(@PathVariable String modelId) { + ObjectNode modelNode = null; + + Model model = repositoryService.getModel(modelId); + + if (model != null) { + try { + if (StringUtils.isNotEmpty(model.getMetaInfo())) { + modelNode = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); + } else { + modelNode = objectMapper.createObjectNode(); + modelNode.put(MODEL_NAME, model.getName()); + } + modelNode.put(MODEL_ID, model.getId()); + ObjectNode editorJsonNode = (ObjectNode) objectMapper + .readTree(new String(repositoryService.getModelEditorSource(model.getId()), "utf-8")); + modelNode.put("model", editorJsonNode); + + } catch (Exception e) { + logger.error("Error creating model JSON", e); + throw new ActivitiException("Error creating model JSON", e); + } + } + return modelNode; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelSaveRestResource.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelSaveRestResource.java new file mode 100644 index 00000000..b75d8a5b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/ModelSaveRestResource.java @@ -0,0 +1,106 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ydw.bat.wkflow.business_activiti.editor; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; + +import org.activiti.editor.constants.ModelDataJsonConstants; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; +import org.apache.batik.transcoder.TranscoderInput; +import org.apache.batik.transcoder.TranscoderOutput; +import org.apache.batik.transcoder.image.PNGTranscoder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +/** + * @author Tijs Rademakers + */ +@Api(description = "工作流编辑器") +@RestController +@RequestMapping(value = "/service") +public class ModelSaveRestResource implements ModelDataJsonConstants { + + protected static final Logger LOGGER = LoggerFactory.getLogger(ModelSaveRestResource.class); + + @Autowired + private RepositoryService repositoryService; + + @Autowired + private ObjectMapper objectMapper; + + @ApiOperation(value = "模型保存") + @ApiImplicitParams({ @ApiImplicitParam(name = "modelId", value = "模型id"), + @ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "json_xml", value = "流程图xml"), + @ApiImplicitParam(name = "svg_xml", value = "流程配置xml"), + @ApiImplicitParam(name = "description", value = "描述") }) + @PutMapping(value = "/model/{modelId}/save") + @ResponseStatus(value = HttpStatus.OK) + public void saveModel(@PathVariable String modelId, @RequestParam("name") String name, + @RequestParam("json_xml") String json_xml, @RequestParam("svg_xml") String svg_xml, + @RequestParam("description") String description) { + try { + + Model model = repositoryService.getModel(modelId); + + ObjectNode modelJson = (ObjectNode) objectMapper.readTree(model.getMetaInfo()); + + modelJson.put(MODEL_NAME, name); + modelJson.put(MODEL_DESCRIPTION, description); + model.setMetaInfo(modelJson.toString()); + model.setName(name); + + repositoryService.saveModel(model); + + repositoryService.addModelEditorSource(model.getId(), json_xml.getBytes("utf-8")); + + InputStream svgStream = new ByteArrayInputStream(svg_xml.getBytes("utf-8")); + TranscoderInput input = new TranscoderInput(svgStream); + + PNGTranscoder transcoder = new PNGTranscoder(); + // Setup output + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + TranscoderOutput output = new TranscoderOutput(outStream); + + // Do the transformation + transcoder.transcode(input, output); + final byte[] result = outStream.toByteArray(); + repositoryService.addModelEditorSourceExtra(model.getId(), result); + outStream.close(); + + } catch (Exception e) { + LOGGER.error("Error saving model", e); + throw new ActivitiException("Error saving model", e); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/StencilsetRestResource.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/StencilsetRestResource.java new file mode 100644 index 00000000..89adcfd7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/editor/StencilsetRestResource.java @@ -0,0 +1,45 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.ydw.bat.wkflow.business_activiti.editor; + +import java.io.InputStream; + +import org.activiti.engine.ActivitiException; +import org.apache.commons.io.IOUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + * @author Tijs Rademakers + */ +@Api(description = "工作流编辑器") +@RestController +@RequestMapping(value = "/service") +public class StencilsetRestResource { + + @ApiOperation(value = "获取模型stencilset的数据") + @GetMapping(value = "/editor/stencilset", produces = "application/json;charset=utf-8") + public @ResponseBody String getStencilset() { + InputStream stencilsetStream = this.getClass().getClassLoader().getResourceAsStream("stencilset.json"); + try { + return IOUtils.toString(stencilsetStream, "utf-8"); + } catch (Exception e) { + throw new ActivitiException("Error while loading stencil set", e); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/ActivitiInstanceController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/ActivitiInstanceController.java new file mode 100644 index 00000000..2cb0a4ed --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/ActivitiInstanceController.java @@ -0,0 +1,58 @@ +package com.ydw.bat.wkflow.business_activiti.instance; + +import java.util.List; +import java.util.Map; + +import org.activiti.engine.RuntimeService; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.runtime.ProcessInstanceQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.util.activiti.ActivitiTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +@Api(description = "流程实例管理") +@RestController +public class ActivitiInstanceController { + + @Autowired + private RuntimeService runtimeService; + + @ApiOperation(value = "流程实例列表") + @ApiImplicitParam(name = "name", value = "名称") + @GetMapping("/activitiInstanceList") + public List> activitiInstanceList(String name) { + // 创建查询对象 + ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); + if (name != null && !"".equals(name)) { + processInstanceQuery.processInstanceNameLike("%" + name + "%"); + } + processInstanceQuery.orderByProcessInstanceId().desc(); + + List list = processInstanceQuery.list(); + return ActivitiTools.turnProcessInstances(list); + } + + @ApiOperation(value = "流程挂起") + @ApiImplicitParam(name = "processInstanceId", value = "流程实例id") + @GetMapping("/instance/suspend") + public Wrapper suspend(String processInstanceId) { + runtimeService.suspendProcessInstanceById(processInstanceId); + return WrapMapper.ok("挂起成功"); + } + + @ApiOperation(value = "流程重新激活") + @ApiImplicitParam(name = "processInstanceId", value = "流程实例id") + @GetMapping("/instance/gorun") + public Wrapper gorun(String processInstanceId) { + runtimeService.activateProcessInstanceById(processInstanceId); + return WrapMapper.ok("重新激活成功"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/InstanceImageController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/InstanceImageController.java new file mode 100644 index 00000000..3e8a587c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/InstanceImageController.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.business_activiti.instance; + +import java.io.OutputStream; + +import javax.servlet.http.HttpServletResponse; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ydw.bat.wkflow.business_activiti.instance.service.InstanceService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +@Api(description = "流程实例图") +@RestController +@RequestMapping("/instance") +public class InstanceImageController { + + @Autowired + private InstanceService instanceService; + @Autowired + private IBusProcessNameService iBusProcessNameService; + +// @ApiOperation(value = "获取图片") +// @ApiImplicitParam(name = "processInstanceId", value = "流程实例id") +// @GetMapping("/getImg") +// public void getImg(String processInstanceId, HttpServletResponse response) throws Exception { +// response.setContentType("image/jpg"); // 设置返回的文件类型 +// +// byte[] bytes = instanceService.getProcessImage(processInstanceId); +// +// OutputStream os = response.getOutputStream(); +// os.write(bytes); +// os.flush(); +// os.close(); +// } + + @ApiOperation(value = "获取图片") + @ApiImplicitParam(name = "processInstanceId", value = "流程实例id") + @GetMapping("/getImg") + public byte[] getImg(String prcNum) throws Exception { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_NUM",prcNum); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + byte[] bytes = instanceService.getProcessImage(one.getPrcId()); + return bytes; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/service/InstanceService.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/service/InstanceService.java new file mode 100644 index 00000000..ddc2896d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/instance/service/InstanceService.java @@ -0,0 +1,72 @@ +package com.ydw.bat.wkflow.business_activiti.instance.service; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.engine.HistoryService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity; +import org.activiti.image.impl.DefaultProcessDiagramGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class InstanceService { + + protected Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Autowired + private RepositoryService repositoryService; + + @Autowired + private HistoryService historyService; + + public byte[] getProcessImage(String processInstanceId) throws Exception { + // TODO 获取流程图像,已执行节点和流程线高亮显示 + // 获取历史流程实例 + HistoricProcessInstance historicProcessInstance = queryHistoricProcessInstance(processInstanceId); + if (historicProcessInstance == null) { + throw new Exception(); + } else { + // 获取流程定义 + ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) repositoryService + .getProcessDefinition(historicProcessInstance.getProcessDefinitionId()); + + // 获取流程历史中已执行节点,并按照节点在流程中执行先后顺序排序 + List historicActivityInstanceList = historyService + .createHistoricActivityInstanceQuery().processInstanceId(processInstanceId) + .orderByHistoricActivityInstanceId().asc().list(); + + // 已执行的节点ID集合 + List executedActivityIdList = new ArrayList(); + int index = 1; + logger.info("获取已经执行的节点ID"); + for (HistoricActivityInstance activityInstance : historicActivityInstanceList) { + executedActivityIdList.add(activityInstance.getActivityId()); + logger.info("第[" + index + "]个已执行节点=" + activityInstance.getActivityId() + " : " + + activityInstance.getActivityName()); + index++; + } + // 获取流程图图像字符流 + BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinition.getId()); + DefaultProcessDiagramGenerator generator = new DefaultProcessDiagramGenerator(); + InputStream imageStream = generator.generateDiagram(bpmnModel, "png", executedActivityIdList, + new ArrayList(), "宋体", "宋体", "宋体", null, 1.0); + byte[] buffer = new byte[imageStream.available()]; + imageStream.read(buffer); + imageStream.close(); + return buffer; + } + } + + private HistoricProcessInstance queryHistoricProcessInstance(String processInstanceId) { + // TODO 通过流程id查询流程 + return historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelController.java new file mode 100644 index 00000000..b9757401 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelController.java @@ -0,0 +1,213 @@ +package com.ydw.bat.wkflow.business_activiti.model; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.ydw.bat.wkflow.business_main.category.entity.Category; +import com.ydw.bat.wkflow.business_main.category.service.ICategoryService; +import org.activiti.bpmn.converter.BpmnXMLConverter; +import org.activiti.bpmn.model.BpmnModel; +import org.activiti.editor.constants.ModelDataJsonConstants; +import org.activiti.editor.language.json.converter.BpmnJsonConverter; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Deployment; +import org.activiti.engine.repository.Model; +import org.activiti.engine.repository.ModelQuery; +import org.activiti.engine.repository.NativeModelQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cglib.beans.BeanMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.form.service.IFormVariableService; +import com.ydw.bat.wkflow.util.CreatedTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +@Api(description = "工作流模板管理") +@RestController +public class ActivitiModelController extends BaseAction { + + @Autowired + private RepositoryService repositoryService; + @Autowired + private ObjectMapper objectMapper; + @Autowired + private IFormVariableService iFormVariableService; + @Autowired + private ICategoryService iCategoryService; + + @ApiOperation(value = "新建模板") + @ApiImplicitParam(name = "category_id", value = "类型id") + @SuppressWarnings("deprecation") + @GetMapping("/create") + public void newModel(HttpServletRequest request, HttpServletResponse response, String category_id) + throws IOException { + // 初始化一个空模型 + Model model = repositoryService.newModel(); + + // 设置一些默认信息 + String name = ""; + String description = ""; + int revision = 1; + String key = "m_" + CreatedTools.getCreated(); + // 设置子系统 + model.setTenantId("子系统1"); + model.setCategory(category_id); + + ObjectNode modelNode = objectMapper.createObjectNode(); + modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); + modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description); + modelNode.put(ModelDataJsonConstants.MODEL_REVISION, revision); + + model.setName(name); + model.setKey(key); + model.setMetaInfo(modelNode.toString()); + + repositoryService.saveModel(model); + String id = model.getId(); + + // 完善ModelEditorSource + ObjectNode editorNode = objectMapper.createObjectNode(); + editorNode.put("id", "canvas"); + editorNode.put("resourceId", "canvas"); + ObjectNode stencilSetNode = objectMapper.createObjectNode(); + stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); + editorNode.put("stencilset", stencilSetNode); + repositoryService.addModelEditorSource(id, editorNode.toString().getBytes("utf-8")); + response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + id); + } + + @ApiOperation(value = "模板列表") + @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "category_id", value = "类型id") }) + @GetMapping("/modelList") + public Wrapper> modelList(String name, String category_id) { + String sql = "select distinct RES.* from ACT_RE_MODEL RES WHERE RES.TENANT_ID_ = '子系统1' and RES.NAME_<>'' and RES.CATEGORY_=#{category} order by RES.CREATE_TIME_ desc"; + NativeModelQuery nativeModelQuery = repositoryService.createNativeModelQuery(); + if (ChkUtil.isNull(category_id)) { + sql = sql.replace("and RES.CATEGORY_=#{category}", ""); + }else { + nativeModelQuery.parameter("category", category_id); + } + nativeModelQuery.sql(sql); + List list = nativeModelQuery.list(); + return WrapMapper.ok(list); + } + + @ApiOperation(value = "模板列表-分页") + @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "category_id", value = "类型id"), @ApiImplicitParam(name = "current", value = "当前页"), + @ApiImplicitParam(name = "size", value = "每页条数") }) + @GetMapping("/modelListPage") + public Wrapper> modelListPage(String name, String category_id, int current, int size) { + if (ChkUtil.isNull(name)) { + name = ""; + } else { + current = 1; + } + ModelQuery modelQuery = repositoryService.createModelQuery(); + if (ChkUtil.isNotNull(category_id)) { + modelQuery.modelCategory(category_id); + } + modelQuery.modelNameLike("%" + name + "%").modelTenantId("子系统1"); + long total = modelQuery.count(); + List list = modelQuery.orderByCreateTime().desc().listPage((current - 1) * size, size); + List> resultList = new ArrayList<>(); + Map map = new HashMap<>(); + for(Model model:list){ + Map resultMap = this.beanToMap(model); + if(resultMap.get("category")!=null){ + Category category = iCategoryService.getById(resultMap.get("category").toString()); + resultMap.put("categoryName",category.getType()); + } + resultList.add(resultMap); + } + map.put("records", resultList); + map.put("current", current); + map.put("size", size); + map.put("total", total); + return WrapMapper.ok(map); + } + + public static Map beanToMap(T bean) { + Map map = new HashMap<>(); + if (bean != null) { + BeanMap beanMap = BeanMap.create(bean); + for (Object key : beanMap.keySet()) { + map.put(key+"", beanMap.get(key)); + } + } + return map; + } + + @ApiOperation(value = "删除模板") + @ApiImplicitParam(name = "modelId", value = "模型id") + @GetMapping("/deleteModel") + public Wrapper deleteModel(String modelId) { + repositoryService.deleteModel(modelId); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "修改流程所属分类") + @ApiImplicitParam(name = "modelId", value = "模型id") + @GetMapping("/updatModel") + public Wrapper updatModel(String modelId,String categoryId) { + Model modelData = repositoryService.getModel(modelId); + modelData.setCategory(categoryId); + repositoryService.saveModel(modelData); + return WrapMapper.ok("修改成功"); + } + + @ApiOperation(value = "部署") + @ApiImplicitParam(name = "modelId", value = "模型id") + @GetMapping("/deploy") + public Wrapper deploy(String modelId) throws Exception { + + // 获取模型 + Model modelData = repositoryService.getModel(modelId); + byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); + + if (bytes == null) { + return WrapMapper.ok("模型数据为空,请先设计流程并成功保存,再进行发布。"); + } + + // 生成/更新 模板变量表 + iFormVariableService.createAndUpdateFormVariable(bytes, modelId); + + JsonNode modelNode = new ObjectMapper().readTree(bytes); + BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); + model.setTargetNamespace(modelData.getCategory()); + + if (model.getProcesses().size() == 0) { + return WrapMapper.ok("数据模型不符要求,请至少设计一条主线流程。"); + } + byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model); + + // 发布流程 + String processName = modelData.getName() + ".bpmn20.xml"; + Deployment deployment = repositoryService.createDeployment().name(modelData.getName()) + .category(modelData.getCategory()).addString(processName, new String(bpmnBytes, "UTF-8")).deploy(); + modelData.setDeploymentId(deployment.getId()); + repositoryService.saveModel(modelData); + + return WrapMapper.ok("部署成功"); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelImageController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelImageController.java new file mode 100644 index 00000000..92c6b6cd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/model/ActivitiModelImageController.java @@ -0,0 +1,70 @@ +package com.ydw.bat.wkflow.business_activiti.model; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Base64; + +import javax.servlet.http.HttpServletResponse; + +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +@Api(description = "流程图片管理") +@RestController +@RequestMapping("/model") +public class ActivitiModelImageController { + + @Autowired + private RepositoryService repositoryService; + + @ApiOperation(value = "获取图片-base64") + @ApiImplicitParam(name = "modelId", value = "模型id") + @GetMapping("/getImgBase64") + public Wrapper getImgBase64(String modelId) { + // 模型模块 + byte[] bytes = repositoryService.getModelEditorSourceExtra(modelId); + String image = Base64.getEncoder().encodeToString(bytes); + return WrapMapper.ok("data:image/png;base64," + image); + + } + + @ApiOperation(value = "获取图片") + @ApiImplicitParam(name = "modelId", value = "模型id") + @GetMapping("/getImg") + public void getImg(String modelId, HttpServletResponse response) throws IOException { + response.setContentType("image/jpg"); // 设置返回的文件类型 + + // 模型模块 + byte[] bytes = repositoryService.getModelEditorSourceExtra(modelId); + + OutputStream os = response.getOutputStream(); + if(ChkUtil.isNotNull(bytes)) { + os.write(bytes); + os.flush(); + os.close(); + } + } + + @ApiOperation(value = "获取图片-通过deploymentId") + @ApiImplicitParam(name = "deploymentId", value = "流程deploymentId") + @GetMapping("/getImgByDeploymentId") + public void getImgByDeploymentId(String deploymentId, HttpServletResponse response) throws IOException { + Model model = repositoryService.createModelQuery().deploymentId(deploymentId).singleResult(); + + String modelId = model.getId(); + getImg(modelId, response); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskRollBackService.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskRollBackService.java new file mode 100644 index 00000000..9712bb35 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskRollBackService.java @@ -0,0 +1,60 @@ +package com.ydw.bat.wkflow.business_activiti.service; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.history.HistoricTaskInstance; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.ChkUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.HiDatas; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.business_main.datas.service.IHiDatasService; + +/** + * TODO 任务回退 + * + * @author Administrator + * + */ +@Service +public class TaskRollBackService { + + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private HistoryService historyService; + @Autowired + private IDatasService datasService; + @Autowired + private IHiDatasService hiDatasService; + + @Transactional + public String rollBack(String backTaskId) { + // TODO 流程回退 + logger.info("任务流程回退-->{}", backTaskId); + HistoricTaskInstance preTask = historyService.createHistoricTaskInstanceQuery().taskId(backTaskId) + .singleResult(); + if (ChkUtil.isNull(preTask)) { + return "任务不存在"; + } + // 获取任务提交信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_PROC_INST_ID", preTask.getProcessInstanceId()); + queryWrapper.eq("ACTI_TASK_ID", preTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + QueryWrapper hiQueryWrapper = new QueryWrapper<>(); + hiQueryWrapper.eq("DATAS_ID", datas.getObjectId()); + HiDatas hiDatas = hiDatasService.getOne(hiQueryWrapper); + // 删除工作流历史记录数据 + hiDatasService.rollBack(hiDatas, preTask.getProcessInstanceId()); + // 删除任务记录数据 + datasService.rollBack(datas); + return "回退成功"; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskTodoService.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskTodoService.java new file mode 100644 index 00000000..2f2b2ed2 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/service/TaskTodoService.java @@ -0,0 +1,84 @@ +package com.ydw.bat.wkflow.business_activiti.service; + +import java.util.Date; + +import org.activiti.engine.TaskService; +import org.activiti.engine.task.NativeTaskQuery; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.tmsps.fk.common.util.ChkUtil; +import com.ydw.bat.wkflow.business_activiti.dto.TaskCommonQuery; +import com.ydw.bat.wkflow.util.SessionTool; +import com.ydw.bat.wkflow.util.date.DateTools; + +/** + * 待办任务注入类,动态修改 Task的assignee等 + * + * @author 冯晓东 + * + */ +@Service +public class TaskTodoService { + + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private TaskService taskService; + + /** + * 查询待办任务 拼接sql 包含待办任务和委托任务 + * @param taskCommonQuery + * @return + */ + public NativeTaskQuery createSql(TaskCommonQuery taskCommonQuery) { + Date start = DateTools.strToDate2(taskCommonQuery.getStartTime()); + Date end = DateTools.strToDate2(taskCommonQuery.getEndTime()); + NativeTaskQuery nativeTaskQuery = taskService.createNativeTaskQuery(); + StringBuilder sb = new StringBuilder(); + sb.append( + "select distinct RES.* from ACT_RU_TASK RES left join ACT_RU_IDENTITYLINK I on I.TASK_ID_ = RES.ID_ inner join ACT_RE_PROCDEF D on RES.PROC_DEF_ID_ = D.ID_ "); + sb.append(" left join t_delegate_business db on RES.PROC_DEF_ID_=db.BUSINESS_KEY and db.IS_DELETED=0 "); + sb.append(" left join t_delegate de on db.DELEGATE_ID=de.OBJECT_ID and de.USERD=#{userd} "); + sb.append(" WHERE "); + //任务名称 + if (ChkUtil.isNotNull(taskCommonQuery.getName())) { + sb.append(" RES.NAME_ LIKE #{taskName} and "); + nativeTaskQuery = nativeTaskQuery.parameter("taskName", taskCommonQuery.getName()); + } + + //日期查询 + if (ChkUtil.isNotNull(taskCommonQuery.getStartTime())) { + sb.append(" RES.CREATE_TIME_ >= #{starttime} and "); + nativeTaskQuery = nativeTaskQuery.parameter("starttime", start); + } + if (ChkUtil.isNotNull(taskCommonQuery.getEndTime())) { + sb.append(" RES.CREATE_TIME_ <= #{endtime} and "); + nativeTaskQuery = nativeTaskQuery.parameter("endtime", end); + } + + sb.append( + " (RES.ASSIGNEE_=#{assignee} or (RES.ASSIGNEE_ is null and I.TYPE_ = 'candidate' and (I.USER_ID_=#{user_id} ))) "); + sb.append( + " or (RES.ASSIGNEE_ = de.USER or (RES.ASSIGNEE_ is null and I.TYPE_ = 'candidate' and (I.USER_ID_ = de.USER ))) "); + sb.append(" order by RES.CREATE_TIME_ desc "); + if(StringUtils.isBlank(taskCommonQuery.getUserId())){ + nativeTaskQuery = nativeTaskQuery.parameter("userd", SessionTool.getSessionAdminId()) + .parameter("assignee", SessionTool.getSessionAdminId()) + .parameter("user_id", SessionTool.getSessionAdminId()); + }else{ + nativeTaskQuery = nativeTaskQuery.parameter("userd", taskCommonQuery.getUserId()) + .parameter("assignee", taskCommonQuery.getUserId()) + .parameter("user_id", taskCommonQuery.getUserId()); + } + + nativeTaskQuery = nativeTaskQuery.sql(sb.toString()); + + return nativeTaskQuery; + + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/task/HastodoTasksController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/HastodoTasksController.java new file mode 100644 index 00000000..edcb39b1 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/HastodoTasksController.java @@ -0,0 +1,179 @@ +package com.ydw.bat.wkflow.business_activiti.task; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.history.HistoricProcessInstanceQuery; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.history.HistoricTaskInstanceQuery; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.runtime.ProcessInstanceQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_activiti.dto.TaskCommonQuery; +import com.ydw.bat.wkflow.util.SessionTool; +import com.ydw.bat.wkflow.util.activiti.ActivitiTools; +import com.ydw.bat.wkflow.util.date.DateTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +@Api(description = "已办任务管理") +@RestController +public class HastodoTasksController { + + @Autowired + private RuntimeService runtimeService; + @Autowired + private HistoryService historyService; + @Autowired + private RepositoryService repositoryService; + +// @ApiOperation(value = "我的已办任务列表") +// @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称"), +// @ApiImplicitParam(name = "current", value = "当前页"), @ApiImplicitParam(name = "size", value = "每页条数") }) +// @PostMapping("/hastodoTasksList") +// public Wrapper> HastodoTasksList(@RequestBody TaskCommonQuery taskCommonQuery) { +// // 创建查询对象 +// String name = taskCommonQuery.getName(); +// int size = taskCommonQuery.getSize(); +// int current = taskCommonQuery.getCurrent(); +// HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery(); +// if (ChkUtil.isNotNull(name)) { +// historicTaskInstanceQuery.taskNameLike("%" + name + "%"); +// } +// List category = new ArrayList<>(); +// category.add(taskCommonQuery.getCategory_id()); +// historicTaskInstanceQuery.processCategoryIn(category); +// historicTaskInstanceQuery.taskAssignee(SessionTool.getSessionAdminId()); +// Date startDate = DateTools.strToDate2(taskCommonQuery.getStartTime()); +// Date endDate = DateTools.strToDate2(taskCommonQuery.getEndTime()); +// historicTaskInstanceQuery.taskCreatedAfter(startDate).taskCreatedBefore(endDate); +// // Date finishStartDate = +// // DateTools.strToDate2(taskCommonQuery.getFinishStartTime()); +// // Date finishEndDate = +// // DateTools.strToDate2(taskCommonQuery.getFinishEndTime()); +// // historicTaskInstanceQuery.taskDueAfter(finishStartDate).taskDueBefore(finishEndDate); +// historicTaskInstanceQuery.finished(); +// long total = historicTaskInstanceQuery.count(); +// if (ChkUtil.isNotNull(name) || ChkUtil.isNotNull(startDate) || ChkUtil.isNotNull(endDate)) { +// current = 1; +// } +// List list = historicTaskInstanceQuery.orderByHistoricTaskInstanceEndTime().desc() +// .listPage((current - 1) * size, size); +// List> listEnd = ActivitiTools.turnHistoricTaskInstance(list); +// for (Map map : listEnd) { +// ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(map.get("processDefinitionId")+"").singleResult(); +// map.put("processInstanceName", processDefinition.getName()); +// } +// Map map = new HashMap<>(); +// map.put("records", listEnd); +// map.put("current", current); +// map.put("size", size); +// map.put("total", total); +// return WrapMapper.ok(map); +// } + + + @ApiOperation(value = "我的已办任务列表") + @ApiImplicitParams({ @ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "current", value = "当前页"), @ApiImplicitParam(name = "size", value = "每页条数"), + @ApiImplicitParam(name = "userId", value = "用户Id")}) + @PostMapping("/hastodoTasksList") + public Wrapper> HastodoTasksListByUserId(@RequestBody TaskCommonQuery taskCommonQuery) { + // 创建查询对象 + String name = taskCommonQuery.getName(); + int size = taskCommonQuery.getSize(); + int current = taskCommonQuery.getCurrent(); + HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery(); + if (ChkUtil.isNotNull(name)) { + historicTaskInstanceQuery.taskNameLike("%" + name + "%"); + } + List category = new ArrayList<>(); + category.add(taskCommonQuery.getCategory_id()); + historicTaskInstanceQuery.processCategoryIn(category); + historicTaskInstanceQuery.taskAssignee(taskCommonQuery.getUserId()); + Date startDate = DateTools.strToDate2(taskCommonQuery.getStartTime()); + Date endDate = DateTools.strToDate2(taskCommonQuery.getEndTime()); + historicTaskInstanceQuery.taskCreatedAfter(startDate).taskCreatedBefore(endDate); + // Date finishStartDate = + // DateTools.strToDate2(taskCommonQuery.getFinishStartTime()); + // Date finishEndDate = + // DateTools.strToDate2(taskCommonQuery.getFinishEndTime()); + // historicTaskInstanceQuery.taskDueAfter(finishStartDate).taskDueBefore(finishEndDate); + historicTaskInstanceQuery.finished(); + long total = historicTaskInstanceQuery.count(); + if (ChkUtil.isNotNull(name) || ChkUtil.isNotNull(startDate) || ChkUtil.isNotNull(endDate)) { + current = 1; + } + List list = historicTaskInstanceQuery.orderByHistoricTaskInstanceEndTime().desc() + .listPage((current - 1) * size, size); + List> listEnd = ActivitiTools.turnHistoricTaskInstance(list); + for (Map map : listEnd) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(map.get("processDefinitionId")+"").singleResult(); + map.put("processInstanceName", processDefinition.getName()); + } + Map map = new HashMap<>(); + map.put("records", listEnd); + map.put("current", current); + map.put("size", size); + map.put("total", total); + return WrapMapper.ok(map); + } + + + + + @ApiOperation(value = "流程监控(查询已经发起的流程实例以及已经执行完成的流程实例)") + @ApiImplicitParam(name = "name", value = "名称") + @GetMapping("/queryHistoricInstance") + public Wrapper> queryHistoricInstance(String name, int current, int size, String category_id) { + // 根据条件查询所有的流程实例 + HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery(); + + if (ChkUtil.isNotNull(name)) { + historicProcessInstanceQuery.processInstanceNameLike("%" + name + "%"); + current = 1; + } + historicProcessInstanceQuery.processDefinitionCategory(category_id); + long total = historicProcessInstanceQuery.count(); + List list = historicProcessInstanceQuery.orderByProcessInstanceStartTime().desc() + .listPage((current - 1) * size, size); + // 判断流程实例是否走完 + for (int i = 0; i < list.size(); i++) { + ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery(); + ProcessInstanceQuery processInstanceId = createProcessInstanceQuery.processInstanceId(list.get(i).getId()); + ProcessInstance singleResult = processInstanceId.singleResult(); + if (singleResult == null) { + list.get(i).setLocalizedDescription("已完成"); + } else { + list.get(i).setLocalizedDescription("进行中"); + } + } + + Page page = new Page(); + page.setTotal(total); + page.setRecords(list); + page.setCurrent(current); + page.setSize(size); + return WrapMapper.ok(page); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskController.java new file mode 100644 index 00000000..e2e7dc0b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskController.java @@ -0,0 +1,133 @@ +package com.ydw.bat.wkflow.business_activiti.task; + +import java.text.SimpleDateFormat; +import java.util.*; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessEntrustService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import org.activiti.engine.HistoryService; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.history.HistoricTaskInstanceQuery; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.util.ChkUtil; +import com.ydw.bat.wkflow.util.activiti.ActivitiTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +@Api(description = "流程明细管理") +@RestController +@RequestMapping("/task") +public class TaskController { + + @Autowired + private HistoryService historyService; + @Autowired + private JdbcTemplate jt; + @Autowired + LawsUserInfoService lawsUserInfoService; + @Autowired + private IBusProcessNameService iBusProcessNameService; + @Autowired + private IBusProcessNewService iBusProcessNewService; + @Autowired + private IBusProcessEntrustService iBusProcessEntrustService; + + @ApiOperation(value = "流程实例明细列表") + @ApiImplicitParam(name = "prcNum", value = "流程实例id") + @GetMapping("/get_list_by_instance") + public List> get_list_by_instance(String prcNum,String sortWord,String shunxu) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_NUM",prcNum); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(one.getPrcId()).orderByTaskCreateTime().asc(); + List list2 = historicTaskInstanceQuery.list(); + List> list = ActivitiTools.turnHistoricTaskInstance(list2); + for (Map historicTaskInstance : list) { +// if(ChkUtil.isNull(historicTaskInstance.get("assignee"))) { +// continue; +// } + //需要修改 根据当前表结构查询 +// Map map = jt.queryForMap("select t.USR_NAME from view_t_au_usr t where t.OBJECT_ID=?", historicTaskInstance.get("assignee")); +// if(ChkUtil.isNotNull(map)) { +// historicTaskInstance.put("assignee", map.get("USR_NAME")); +// } + if(ChkUtil.isNull(historicTaskInstance.get("assignee"))) { + ResponseMessage> listUser = lawsUserInfoService.getManagerByOrgIdNew("企业标准管理工程师"); + if(listUser.getData()!=null){ + List qbgcs = new ArrayList<>(); + for (OrgEO orgEO : listUser.getData()) { + qbgcs.add(orgEO.getUserName()); + } + String str= StringUtils.join(qbgcs, ","); + historicTaskInstance.put("assignee", str); + } + }else{ + ResponseMessage assignee = lawsUserInfoService.getById(historicTaskInstance.get("assignee").toString()); + + if(assignee.getData()!=null){ + historicTaskInstance.put("assignee", assignee.getData().getUname()); + historicTaskInstance.put("assigneeId", assignee.getData().getUsid()); + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",historicTaskInstance.get("id")); + queryWrapper2.orderByAsc("CREATE_TIME"); + List list1 = iBusProcessEntrustService.list(queryWrapper2); + String str = ""; + if(list1.size()>0){ + ResponseMessage assignee1 = lawsUserInfoService.getById(list1.get(0).getUserId()); + historicTaskInstance.put("assignee", assignee.getData().getUname()+"("+assignee1.getData().getUname()+" 委托)"); + } + } + } + historicTaskInstance.put("prcType",one.getPrcType()); + historicTaskInstance.put("prcName",one.getPrcName()); + historicTaskInstance.put("prcNum",one.getPrcNum()); + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",historicTaskInstance.get("id")); + List list1 = iBusProcessNewService.list(queryWrapper1); + if(list1.size()>0){ + historicTaskInstance.put("comment",list1.get(0).getCommitFlag()); + historicTaskInstance.put("commentText",list1.get(0).getCommitText()); + }else{ + historicTaskInstance.put("comment",""); + historicTaskInstance.put("commentText",""); + } + + } + if(StringUtils.isNotBlank(sortWord)){ + Collections.sort(list, new Comparator>() { + public int compare(Map o1, Map o2) { + String id1=""; + String id2=""; + if(sortWord.equals("startTime")){ + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + id1 = df.format(o1.get(sortWord)); + id2 = df.format(o2.get(sortWord)); + }else{ + id1 = (String) o1.get(sortWord); + id2 = (String) o2.get(sortWord); + } + if(shunxu.equals("desc")){ + return id2.compareTo(id1); + }else{ + return id1.compareTo(id2); + } + } + }); + } + return list; + } +} \ No newline at end of file diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskRollBackController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskRollBackController.java new file mode 100644 index 00000000..c755904b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TaskRollBackController.java @@ -0,0 +1,34 @@ +package com.ydw.bat.wkflow.business_activiti.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_activiti.service.TaskRollBackService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +@Api(description = "任务回退") +@RestController +public class TaskRollBackController { + + @Autowired + private TaskRollBackService taskRollBackService; + + @ApiOperation(value = "待办任务回退") + @ApiImplicitParams({ @ApiImplicitParam(name = "backToTaskId", value = "回退到任务id") }) + @GetMapping("/rollBack") + public Wrapper rollBack(String backToTaskId) { + + String result = taskRollBackService.rollBack(backToTaskId); + + return WrapMapper.ok(result); + + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TodoTaskController.java b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TodoTaskController.java new file mode 100644 index 00000000..33090bb4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_activiti/task/TodoTaskController.java @@ -0,0 +1,2456 @@ +package com.ydw.bat.wkflow.business_activiti.task; + +import java.text.SimpleDateFormat; +import java.util.*; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.*; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessEntrustService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_wkflow.form.dto.FormSubmitDto; +import com.ydw.bat.wkflow.business_wkflow.form.service.FormValsService; +import org.activiti.engine.*; +import org.activiti.engine.history.*; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.runtime.ProcessInstanceQuery; +import org.activiti.engine.task.NativeTaskQuery; +import org.activiti.engine.task.Task; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_activiti.service.TaskTodoService; +import com.ydw.bat.wkflow.util.activiti.ActivitiTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +@Api(description = "待办任务管理") +@RestController +public class TodoTaskController extends BaseAction { + + @Autowired + private TaskService taskService; + @Autowired + private RuntimeService runtimeService; + @Autowired + private RepositoryService repositoryService; + + @Autowired + private TaskTodoService taskTodoService; + + @Autowired + private FormValsService formValsService; + + @Autowired + private IBusProcessNewService iBusProcessNewService; + + @Autowired + private IBusProcessNameService iBusProcessNameService; + + @Autowired + private HistoryService historyService; + + @Autowired + private IBusProcessEntrustService iBusProcessEntrustService; + + @Autowired + private LawsUserInfoService lawsUserInfoService; + + @ApiOperation(value = "我的待办任务列表") + @ApiImplicitParams({@ApiImplicitParam(name = "name", value = "名称"), + @ApiImplicitParam(name = "current", value = "当前页"), + @ApiImplicitParam(name = "size", value = "每页条数"), + @ApiImplicitParam(name = "userId", value = "用户Id")}) + @PostMapping("/todoTaskList") + public List todoTaskListByUserId(@RequestBody TaskCommonQuery taskCommonQuery) { + // 创建查询对象 + NativeTaskQuery nativeTaskQuery = taskTodoService.createSql(taskCommonQuery); + int current = taskCommonQuery.getCurrent(); + int size = taskCommonQuery.getSize(); + + long total = nativeTaskQuery.list().size(); + if (ChkUtil.isNotNull(taskCommonQuery.getName()) || ChkUtil.isNotNull(taskCommonQuery.getStartTime()) + || ChkUtil.isNotNull(taskCommonQuery.getEndTime())) { + current = 1; + } + // 获取查询列表 +// List list = nativeTaskQuery.listPage((current - 1) * size, size); + List list = nativeTaskQuery.list(); + List> listEnd = ActivitiTools.turnTasks(list); + for (Map map : listEnd) { + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(map.get("processDefinitionId") + "").singleResult(); + map.put("processInstanceName", processDefinition.getName()); + //接受任务时间 +// map.put("acceptTime",); + } + + Set prdSet = new HashSet(); + + Map>> resutMap = new LinkedHashMap<>(); + for (Map map : listEnd) { + String key = map.get("name").toString() + "," + map.get("processInstanceId").toString(); + if (resutMap.get(key) == null) { + List> value = new ArrayList<>(); + value.add(map); + resutMap.put(key, value); + } else { + List> value = resutMap.get(key); + value.add(map); + resutMap.put(key, value); + } + } + + List todoList = new ArrayList<>(); + for (Map.Entry>> entry : resutMap.entrySet()) { + String prcId = entry.getKey().split(",")[1]; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_ID", prcId); + if (taskCommonQuery.getPrcNum() != null && !taskCommonQuery.getPrcNum().equals("")) { + queryWrapper.like("PRC_NUM", taskCommonQuery.getPrcNum()); + } + if (taskCommonQuery.getPrcName() != null && !taskCommonQuery.getPrcName().equals("")) { + queryWrapper.like("PRC_NAME", taskCommonQuery.getPrcName()); + } + if (taskCommonQuery.getPrcType() != null && !taskCommonQuery.getPrcType().equals("")) { + queryWrapper.eq("PRC_TYPE", taskCommonQuery.getPrcType()); + } + BusProcessName busProcessName = iBusProcessNameService.getOne(queryWrapper); + String taskIds = ""; + for (Map map : entry.getValue()) { + taskIds += map.get("id").toString() + ","; + } + if (busProcessName != null) { + busProcessName.setTaskIds(taskIds); + busProcessName.setTaskInfo(entry.getValue().get(0).get("name").toString()); + busProcessName.setMes(null); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String data = sdf.format(entry.getValue().get(0).get("createTime")); + busProcessName.setAcceptTime(data); + todoList.add(busProcessName); + } + } + return todoList; + } + + @ApiOperation(value = "改派任务") + @ApiImplicitParams({@ApiImplicitParam(name = "taskId", value = "任务id"), + @ApiImplicitParam(name = "assignee", value = "改派人员")}) + @GetMapping("/changeAssignee") + public Wrapper run(String taskId, String assignee) { + taskService.setAssignee(taskId, assignee); + + logger.info("task {} find " + taskId); + return WrapMapper.ok("改派成功"); + } + + @ApiOperation(value = "新改派任务") + @ApiImplicitParams({@ApiImplicitParam(name = "taskId", value = "任务id"), + @ApiImplicitParam(name = "assignee", value = "被改派人员"), @ApiImplicitParam(name = "userId", value = "改派人员"), + @ApiImplicitParam(name = "pId", value = "流程实例ID")}) + @GetMapping("/changeAssigneeNew") + public Wrapper changeAssigneeNew(String taskId, String assignee, String userId, String pId) { + + List list = Arrays.asList(taskId.split(",")); + for (String str : list) { + if (str != null && !str.equals("")) { + taskService.setAssignee(str, assignee); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_ID", pId); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", userId); + queryWrapper1.eq("TASK_ID", str); + queryWrapper1.eq("P_ID", pId); + List list1 = iBusProcessNewService.list(queryWrapper1); + if (list1.size() > 0) { + for (BusProcessNew busProcessNew : list1) { + busProcessNew.setUserId(assignee); + iBusProcessNewService.saveOrUpdate(busProcessNew); + } + } + + BusProcessEntrust busProcessEntrust = new BusProcessEntrust(); + busProcessEntrust.setEnUserId(assignee); + busProcessEntrust.setUserId(userId); + busProcessEntrust.setValidFlag("0"); + busProcessEntrust.setPrcId(pId); + busProcessEntrust.setPrcName(one.getPrcName()); + busProcessEntrust.setTaskId(str); + iBusProcessEntrustService.save(busProcessEntrust); + } + } + + //发送邮件 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_ID", pId); + BusProcessName name = iBusProcessNameService.getOne(queryWrapper); + String type = name.getPrcType(); + Integer typeInt = 99; + if (StringUtils.isNotEmpty(type)){ + typeInt = Integer.valueOf(type); + } + switch (typeInt){ + case 1: + type = "法规入库及评估流程"; + break; + case 2: + type = "标准法规技术储备评估流程"; + break; + case 3: + type = "项目评估流程"; + break; + case 4: + type = "企标制修订流程"; + break; + case 5: + type = "未符合项跟踪流程"; + break; + case 6: + type = "企标制修订申请流程"; + break; + case 7: + type = "企标废止流程"; + break; + case 8: + type = "企标延期制修订申请流程"; + break; + case 9: + type = "标准采购流程"; + break; + case 10: + type = "工作组会前申请流程"; + break; + case 11: + type = "企标制修订评估流程"; + break; + case 12: + type = "企标勘误流程"; + break; + case 13: + type = "行政管理要求评估流程"; + break; + case 14: + type = "政策入库及评估流程"; + break; + case 15: + type = "标准翻译申请流程"; + break; + case 16: + type = "工作组会后管理流程"; + break; + case 17: + type = "企标备案流程"; + break; + case 18: + type = "标准法规清单发布/更新流程"; + break; + case 19: + type = "企标复审流程"; + break; + default: + break; + } + ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(userId); + UserVO userVO = userVOResponseMessage.getData(); + String userName = ""; + if (null != userVO) { + userName = userVO.getUname(); + } + String content = "您好,"+name.getPrcNum()+"-"+ name.getPrcName() +" "+ userName +"委托您处理待办任务 ,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 办理:链接( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter )。\n" + + " ——来自 全球标准法规管理系统"; + lawsUserInfoService.sendEmail(userId,content,"GSRM——【待办任务】["+type+"]有您的待办任务"); + + logger.info("task {} find " + taskId); + return WrapMapper.ok("改派成功"); + } + + @ApiOperation(value = "完成任务", notes = "流程单个节点任务,直接完成任务") + @ApiImplicitParams({@ApiImplicitParam(name = "taskId", value = "任务id"), + @ApiImplicitParam(name = "userId", value = "完成任务用户Id")}) + @PostMapping("/completeTask") + public Wrapper completeTaskByUserId(@RequestBody BusMes busMes) { + logger.info("!!!!!!!!!!!!!TaskId!!!!!!!!!!!!!!!"+busMes.getTaskId()); + logger.info("!!!!!!!!!!!!!!TaskIds!!!!!!!!!!!!!!"+busMes.getTaskIds()); + if (busMes.getTaskId() != null && !busMes.getTaskId().equals("")) { + if (busMes.getTaskId().indexOf(",") > -1) { + String taskIdsrc = busMes.getTaskId().substring(0, busMes.getTaskId().length() - 1); + busMes.setTaskId(taskIdsrc); + } + logger.info("taskId--> " + busMes.getTaskId()); + Task task = taskService.createTaskQuery().taskId(busMes.getTaskId()).singleResult(); + if(task!=null){ + if (ChkUtil.isNull(task.getAssignee())) { + taskService.claim(busMes.getTaskId(), busMes.getUserId()); + } + + FormSubmitDto formSubmitDto = new FormSubmitDto(); + formSubmitDto.setForm(busMes.getJson()); + formSubmitDto.setTask_id(busMes.getTaskId()); + + formValsService.saveFormVals(formSubmitDto, task.getTaskDefinitionKey()); + + taskService.complete(busMes.getTaskId()); + } + return WrapMapper.ok(task.getProcessInstanceId()); + } else { + String[] ids = busMes.getTaskIds().split(","); + Set staffsSet = new HashSet<>(Arrays.asList(ids)); + String prcid = ""; + logger.info("!!!!!!!!!!!staffsSet!!!!!!!!!!!!!1"+staffsSet); + for (String taskId : staffsSet) { + logger.info("taskId--> " + taskId); + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + if(task!=null){ + prcid = task.getProcessInstanceId(); + if (ChkUtil.isNull(task.getAssignee())) { + taskService.claim(taskId, busMes.getUserId()); + } + FormSubmitDto formSubmitDto = new FormSubmitDto(); + formSubmitDto.setForm(busMes.getJson()); + formSubmitDto.setTask_id(taskId); + formValsService.saveFormVals(formSubmitDto, task.getTaskDefinitionKey()); + taskService.complete(taskId); + } + } + return WrapMapper.ok(prcid); + } + } + + @ApiOperation(value = "查询流程编号", notes = "根据流程实例ID查询流程编号") + @ApiImplicitParams({@ApiImplicitParam(name = "pId", value = "流程id")}) + @GetMapping("/findPrcNumByPid") + public Wrapper findPrcNumByPid(String pId) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_ID", pId); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + return WrapMapper.ok(one.getPrcNum()); + } + + @ApiOperation(value = "查询流程名称", notes = "根据流程流程编号查询名称") + @ApiImplicitParams({@ApiImplicitParam(name = "prcNum", value = "流程编号")}) + @GetMapping("/findPrcNameByPrcNum") + public Wrapper findPrcNameByPrcNum(String prcNum) { + QueryWrapper queryWrapper = new QueryWrapper(); + List nums = new ArrayList<>(Arrays.asList(prcNum.split(","))); + StringBuilder names = new StringBuilder(); + StringBuilder numbers = new StringBuilder(); + for (String num : nums) { + queryWrapper.eq("PRC_NUM", num); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + if (null != one) { + names.append(",").append(one.getPrcName()); + numbers.append(",").append(one.getPrcNum()); + } + } + return WrapMapper.ok(numbers.toString() + "&&" + names.toString()); + } + + + @ApiOperation(value = "提交完成任务", notes = "流程单个节点任务,直接完成任务") + @ApiImplicitParams({@ApiImplicitParam(name = "processInstanceId", value = "流程id"), + @ApiImplicitParam(name = "userId", value = "完成任务用户Id")}) + @GetMapping("/run") + public Wrapper runByUserId(String processInstanceId, String userId) { + Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); + if (ChkUtil.isNull(task.getAssignee())) { + taskService.claim(task.getId(), userId); + } + // 设置扩展json属性 + task.getDescription(); + + logger.info("task {} find " + task.getId()); + taskService.complete(task.getId()); + return WrapMapper.ok("提交成功"); + } + + @ApiOperation(value = "认领并完成任务", notes = "审批结果为审批拒绝,则结束流程") + @ApiImplicitParams({@ApiImplicitParam(name = "taskId", value = "任务id"), + @ApiImplicitParam(name = "userId", value = "用户Id"), + @ApiImplicitParam(name = "result", value = "审批结果")}) + @GetMapping("/claimAndComplete") + public Wrapper claimAndCompleteByUserId(String taskId, String userId, String result) { + // 创建查询对象 + Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); + String pid = task.getProcessInstanceId(); + if (ChkUtil.isNull(task.getAssignee())) { + taskService.claim(taskId, userId); + } + taskService.complete(taskId); + if ("审批拒绝".equals(result)) { + runtimeService.deleteProcessInstance(pid, "审批拒绝"); + } + // 获取流程实例 + ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(pid).singleResult(); + return WrapMapper.ok(pi); + } + + @ApiOperation(value = "查询待办任务") + @GetMapping("/queryTask") + public List QueryTask(String userId, String pId) { + List tasks = iBusProcessNewService.QueryTask(userId, pId); + return tasks; + } + + @ApiOperation(value = "待办任务详情") + @GetMapping("/todotask") + public List todotask(String userId, String pId) { + List findtodotask = iBusProcessNewService.findtodotask(userId, pId); + return findtodotask; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "入库流程联络人详情") + @PostMapping("/saveInboundLiaisonDetail") + public BusProcessNew saveInboundLiaisonDetail(@RequestBody BusMes busMes) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("task_id", busMes.getTaskId()); + BusProcessNew processNew = iBusProcessNewService.getOne(queryWrapper); + processNew.setMesg(busMes.getJson()); + iBusProcessNewService.updateById(processNew); + return processNew; + + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds,pId + */ + @ApiOperation(value = "详情") + @GetMapping("/queryDetail") + public BusProcessNew queryDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + BusProcessNew processNew = new BusProcessNew(); + + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + object.put("taskId", list.get(0).getTaskId()); + BeanUtils.copyProperties(list.get(0), processNew); + processNew.setMesg(object.toJSONString()); + return processNew; + + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds + */ + @ApiOperation(value = "入库流程联络人详情") + @GetMapping("/inboundLiaisonDetail") + public BusProcessNew inboundLiaisonDetail(String taskIds, String pId) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + BusProcessNew processNew = new BusProcessNew(); + BeanUtils.copyProperties(list.get(0), processNew); + + JSONObject object3 = JSONObject.parseObject(list.get(0).getMesg()); + JSONArray arr2 = new JSONArray(); + object3.put("taskBreak", arr2); + processNew.setMesg(object3.toJSONString()); + for (BusProcessNew busProcessNew : list) { + JSONObject object = JSONObject.parseObject(busProcessNew.getMesg()); + JSONArray array = object.getJSONArray("taskBreak"); + JSONArray itemsList = ((JSONObject) array.get(0)).getJSONArray("itemsList"); + if (itemsList != null && itemsList.size() > 0) { + + itemsList.getJSONObject(0).put("taskId", busProcessNew.getTaskId()); + JSONObject objectOld = JSONObject.parseObject(processNew.getMesg()); + for (Object obj : objectOld.getJSONArray("taskBreak")) { + if (((Map) obj).get("id").toString().equals(((JSONObject) array.get(0)).getString("id"))) { + JSONArray itemsList1 = ((JSONObject) obj).getJSONArray("itemsList"); + itemsList1.add(itemsList.get(0)); + } + } + + if (objectOld.getJSONArray("taskBreak").size() == 0) { + object.put("itemsList", array); + JSONObject object2 = JSONObject.parseObject(processNew.getMesg()); + JSONArray arr = object2.getJSONArray("taskBreak"); + arr.add(array.get(0)); + processNew.setMesg(object2.toJSONString()); + } else { + processNew.setMesg(objectOld.toJSONString()); + } + } else { + JSONArray array1 = object.getJSONArray("taskBreak"); + ((JSONObject) array1.get(0)).put("taskId", busProcessNew.getTaskId()); + JSONObject object2 = JSONObject.parseObject(processNew.getMesg()); + JSONArray arr = object2.getJSONArray("taskBreak"); + Task task = taskService.createTaskQuery().taskId(busProcessNew.getTaskId()).singleResult(); + if(task!=null){ + if(task.getName().equals("再次下发")){ +// if(arr.size()==0){ + arr.add(array1.get(0)); +// } + }else{ + arr.add(array1.get(0)); + } + }else{ + arr.add(array1.get(0)); + } + processNew.setMesg(object2.toJSONString()); + } + + } + return processNew; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds + */ + @ApiOperation(value = "国内法规入库评估流程详情") + @GetMapping("/inboundLiaisonDetailForLawsAss") + public String inboundLiaisonDetailForLawsAss(String taskIds) { + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + BusProcessNew processNew = new BusProcessNew(); + List standardDTOList = new ArrayList<>(); + Map> map = new LinkedHashMap<>(); + for (BusProcessNew busProcessNew : list) { + JSONObject obj = JSONObject.parseObject(busProcessNew.getMesg()); + if (obj.getJSONArray("dicTypeList") == null) { + StandardDTONew jsonObject = JSONObject.parseObject(busProcessNew.getMesg(), StandardDTONew.class); +// JSONObject jsonObject1 = busProcessNew.getMesg(); + List clauseArr = jsonObject.getItemsList(); + + if (clauseArr != null && clauseArr.size() > 0) { + ItemListNew clause = clauseArr.get(0); + clause.setTaskId(busProcessNew.getTaskId()); + } else { + jsonObject.setTaskId(busProcessNew.getTaskId()); + } + standardDTOList.add(jsonObject); +// String resId = jsonObject.getResId(); +// if(map.get(resId) == null) { +// List jsonObjectList = new ArrayList<>(); +// jsonObjectList.add(jsonObject); +// map.put(resId, jsonObjectList); +// } else { +// List jsonObjectList = map.get(resId); +// jsonObjectList.add(jsonObject); +// map.put(resId, jsonObjectList); +// } + } else { + for (Object object : obj.getJSONArray("dicTypeList")) { + StandardDTONew jsonObject = JSONObject.parseObject(object.toString(), StandardDTONew.class); + + List clauseArr = jsonObject.getItemsList(); + + if (clauseArr != null && clauseArr.size() > 0) { + ItemListNew clause = clauseArr.get(0); + clause.setTaskId(busProcessNew.getTaskId()); + } else { + jsonObject.setTaskId(busProcessNew.getTaskId()); + } + standardDTOList.add(jsonObject); +// String resId = jsonObject.getResId(); +// if(map.get(resId) == null) { +// List jsonObjectList = new ArrayList<>(); +// jsonObjectList.add(jsonObject); +// map.put(resId, jsonObjectList); +// } else { +// List jsonObjectList = map.get(resId); +// jsonObjectList.add(jsonObject); +// map.put(resId, jsonObjectList); +// } + } + } + } + +// for(Map.Entry> entry : map.entrySet()) { +// StandardDTONew item = entry.getValue().get(0); +// List clauseArr = new ArrayList<>(); +// for (StandardDTONew clause : entry.getValue()) { +// if (clause.getItemsList() != null && clause.getItemsList().size() > 0) { +// clauseArr.add(clause.getItemsList().get(0)); +// } +// } +// item.setItemsList(clauseArr); +// standardDTOList.add(item); +// } +// Map> result = new HashMap<>(); +// result.put("dicTypeList", standardDTOList); + String str = JSONObject.toJSONString(standardDTOList); + String str1 = JSONObject.toJSONString(standardDTOList.get(0).getItemsList()); + Object o = JSONObject.toJSON(standardDTOList); + processNew = list.get(0); + String str2 = JSONObject.toJSONString(o); + processNew.setMesg(str2); + return str2; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds + */ + @ApiOperation(value = "项目评估流程详情") + @GetMapping("/projectAssessDetail") + public BusProcessNew projectAssessDetail(String taskIds) { + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + + Map> map = new LinkedHashMap<>(); + + // 符合 + List accordList = new ArrayList<>(); + // 不符合 + List nonComplianceList = new ArrayList<>(); + // 待确认 + List toBeConfirmedList = new ArrayList<>(); + // 不涉及 + List notInvolvedList = new ArrayList<>(); + + for (BusProcessNew busProcessNew : list) { + ProjectAssessDTO projectAssessDTO = JSONObject.parseObject(busProcessNew.getMesg(), ProjectAssessDTO.class); + List projectAssessDTOS; + if (map.get(projectAssessDTO.getId()) == null) { + projectAssessDTOS = new ArrayList<>(); + } else { + projectAssessDTOS = map.get(projectAssessDTO.getId()); + } + ProjectFormDTO projectFormDTO = new ProjectFormDTO(); + // 设置taskId + if (projectAssessDTO.getChildren().get(0).getItemsList() != null && projectAssessDTO.getChildren().get(0).getItemsList().size() > 0) { + + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setTaskId(busProcessNew.getTaskId()); + + Form form = projectAssessDTO.getChildren().get(0).getItemsList().get(0).getForm(); + if (form != null) { + BeanUtils.copyProperties(form, projectFormDTO); + } + + // 有条款设置条款id + projectFormDTO.setResId(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResId()); + projectFormDTO.setResNum(projectAssessDTO.getChildren().get(0).getResNum()); + projectFormDTO.setResName(projectAssessDTO.getChildren().get(0).getResName()); + projectFormDTO.setClauseNum(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResNum()); + projectFormDTO.setClauseName(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResName()); + projectFormDTO.setClauseContent(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getTermsConditions()); + projectFormDTO.setApprovalContent(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getApprovalContent()); + projectFormDTO.setApprovalOpinions(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getApprovalOpinions()); + projectFormDTO.setTaskId(busProcessNew.getTaskId()); + projectFormDTO.setWriteUserId(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getVSEId()); + projectFormDTO.setWriteUsername(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getVSEName()); + projectFormDTO.setOpinion(projectAssessDTO.getOpinion()); + projectFormDTO.setOpinionContent(projectAssessDTO.getOpinionContent()); + projectFormDTO.setOpinionTime(projectAssessDTO.getOpinionTime()); + projectFormDTO.setVseOpinion(projectAssessDTO.getVseOpinion()); + projectFormDTO.setVseOpinionContent(projectAssessDTO.getVseOpinionContent()); + projectFormDTO.setTermsConditions(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getTermsConditions()); + projectFormDTO.setXMPGJS(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getXMPGJS()); + projectFormDTO.setXMPGJSName(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getXMPGJSName()); + + if ("1".equals(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getType())) { + accordList.add(projectFormDTO); + } else if ("2".equals(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getType())) { + nonComplianceList.add(projectFormDTO); + } else if ("3".equals(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getType())) { + toBeConfirmedList.add(projectFormDTO); + } else if ("4".equals(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getType())) { + notInvolvedList.add(projectFormDTO); + } else { + + } + + } else { + projectAssessDTO.getChildren().get(0).setTaskId(busProcessNew.getTaskId()); + // 有条款设置条款id + Form form = projectAssessDTO.getChildren().get(0).getForm(); + + if (form != null) { + BeanUtils.copyProperties(form, projectFormDTO); + } + // 有条款设置条款id + projectFormDTO.setResId(projectAssessDTO.getChildren().get(0).getResId()); + projectFormDTO.setResNum(projectAssessDTO.getChildren().get(0).getResNum()); + projectFormDTO.setResName(projectAssessDTO.getChildren().get(0).getResName()); + projectFormDTO.setApprovalContent(projectAssessDTO.getChildren().get(0).getApprovalContent()); + projectFormDTO.setApprovalOpinions(projectAssessDTO.getChildren().get(0).getApprovalOpinions()); + projectFormDTO.setTaskId(busProcessNew.getTaskId()); + projectFormDTO.setWriteUserId(projectAssessDTO.getChildren().get(0).getVSEId()); + projectFormDTO.setWriteUsername(projectAssessDTO.getChildren().get(0).getVSEName()); + projectFormDTO.setOpinion(projectAssessDTO.getOpinion()); + projectFormDTO.setOpinionContent(projectAssessDTO.getOpinionContent()); + projectFormDTO.setOpinionTime(projectAssessDTO.getOpinionTime()); + projectFormDTO.setVseOpinion(projectAssessDTO.getVseOpinion()); + projectFormDTO.setVseOpinionContent(projectAssessDTO.getVseOpinionContent()); + projectFormDTO.setTermsConditions(projectAssessDTO.getChildren().get(0).getTermsConditions()); + projectFormDTO.setXMPGJSName(projectAssessDTO.getChildren().get(0).getXMPGJSName()); + projectFormDTO.setXMPGJS(projectAssessDTO.getChildren().get(0).getXMPGJS()); + + if ("1".equals(projectAssessDTO.getChildren().get(0).getType())) { + accordList.add(projectFormDTO); + } else if ("2".equals(projectAssessDTO.getChildren().get(0).getType())) { + nonComplianceList.add(projectFormDTO); + } else if ("3".equals(projectAssessDTO.getChildren().get(0).getType())) { + toBeConfirmedList.add(projectFormDTO); + } else if ("4".equals(projectAssessDTO.getChildren().get(0).getType())) { + notInvolvedList.add(projectFormDTO); + } else { + + } + } + + + projectAssessDTOS.add(projectAssessDTO); +// if(map.containsKey(projectAssessDTO.getId())){ +// projectAssessDTOS.addAll(map.get(projectAssessDTO.getId())); +// map.put(projectAssessDTO.getId(), projectAssessDTOS); +// }else{ + map.put(projectAssessDTO.getId(), projectAssessDTOS); +// } + } + + + List projectAssessResultList = new ArrayList<>(); + if (map.size() > 1) { + + // 多项目,单一标准 + for (Map.Entry> entry : map.entrySet()) { + List projectAssessDTOList = entry.getValue(); + List children = new ArrayList<>(); + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + List itemsLists = new ArrayList<>(); + if (projectAssessDTO.getChildren().get(0).getItemsList() != null && projectAssessDTO.getChildren().get(0).getItemsList().size() > 0) { + // 有条款 + itemsLists.addAll(projectAssessDTO.getChildren().get(0).getItemsList()); + } + projectAssessDTO.getChildren().get(0).setItemsList(itemsLists); + children.add(projectAssessDTO.getChildren().get(0)); + } + ProjectAssessDTO projectAssess = projectAssessDTOList.get(0); + projectAssess.setChildren(children); +// List childrenList = projectAssess.getChildren(); +// childrenList.get(0).setItemsList(itemsLists); +// projectAssess.setChildren(childrenList); + projectAssessResultList.add(projectAssess); + } + } else { + // 单项目,多标准 + // 由于是单项目多标准,这个循环只会走一次 + ProjectAssessDTO projectAssessResult; + List childrenListResult = new ArrayList<>(); + for (Map.Entry> entry : map.entrySet()) { + List projectAssessDTOList = entry.getValue(); + projectAssessResult = projectAssessDTOList.get(0); + // 用于存储不同标准 + Map> stdMap = new LinkedHashMap<>(); + // 根据标准id去重,将同样标准id的数据放到stdMap的value中 + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + List childrenList; + if (stdMap.get(projectAssessDTO.getChildren().get(0).getResId()) == null) { + childrenList = new ArrayList<>(); + } else { + childrenList = stdMap.get(projectAssessDTO.getChildren().get(0).getResId()); + } + childrenList.add(projectAssessDTO.getChildren().get(0)); + stdMap.put(projectAssessDTO.getChildren().get(0).getResId(), childrenList); + } + // 遍历去重后的标准Map,将相同标准的条款合并, + for (Map.Entry> stdEntry : stdMap.entrySet()) { + if(stdEntry.getValue().get(0).getItemsList()!=null && stdEntry.getValue().get(0).getItemsList().size()>0){ + Children children = stdEntry.getValue().get(0); + List itemsLists = new ArrayList<>(); + for (Children item : stdEntry.getValue()) { + if (item.getItemsList() != null && item.getItemsList().size() > 0) { + // 有条款 + itemsLists.addAll(item.getItemsList()); + } + } + children.setItemsList(itemsLists); + childrenListResult.add(children); + }else{ + for(Children item : stdEntry.getValue()){ + childrenListResult.add(item); + } + } + } + projectAssessResult.setChildren(childrenListResult); + projectAssessResultList.add(projectAssessResult); + } + + } + + Map result = new HashMap<>(); + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_ID", list.get(0).getPId()); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + if (one != null) { + result.put("prcDeadLine", one.getOverTime()); + } + + result.put("dicTypeList", projectAssessResultList); + result.put("accordList", accordList); + result.put("nonComplianceList", nonComplianceList); + result.put("toBeConfirmedList", toBeConfirmedList); + result.put("notInvolvedList", notInvolvedList); + BusProcessNew processNew = list.get(0); + processNew.setMesg(JSONObject.toJSONString(result)); + return processNew; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds + */ + @ApiOperation(value = "未符合项详情") + @GetMapping("/nonconformity") + public String nonconformity(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + + JSONObject object1 = JSONObject.parseObject(list.get(0).getMesg()); + JSONArray array3 = new JSONArray(); + object1.put("tableData", array3); + for (BusProcessNew busProcessNew : list) { +// JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + JSONObject object = JSONObject.parseObject(busProcessNew.getMesg()); + JSONArray array = object.getJSONArray("tableData"); + if (array != null && array.size() > 0) { + for (int i = 0; i < array.size(); i++) { + array.getJSONObject(i).put("taskId", busProcessNew.getTaskId()); + } + if (object1.get("tableData") != null) { + JSONArray array1 = (JSONArray) object1.get("tableData"); + array1.add(array.get(0)); + object1.put("tableData", array1); + } else { + object1.put("tableData", array); + } + } else { + JSONArray array1 = object.getJSONArray("tableData"); + for (int i = 0; i < array1.size(); i++) { + array1.getJSONObject(i).put("taskId", list.get(0).getTaskId()); + } + } + } + + return object1.toJSONString(); + } + + @ApiOperation(value = "企标制修订申请流程详情") + @GetMapping("/qbzxdsqlcDetail") + public String qbzxdsqlcDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + JSONObject qbzxdForm = object.getJSONObject("qbzxdForm"); + + qbzxdForm.put("taskId", list.get(0).getTaskId()); + + object.put("qbzxdForm", qbzxdForm); + + return object.toJSONString(); + } + + @ApiOperation(value = "企标废止流程详情") + @GetMapping("/qbfzlcDetail") + public String qbfzlcDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds + */ + @ApiOperation(value = "企标制修订评估详情") + @GetMapping("/qbzxdpgDetail") + public String qbzxdpgDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + return object.toJSONString(); + } + + @ApiOperation(value = "采购申请流程详情") + @GetMapping("/cgsqDetail") + public String cgsqDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + @ApiOperation(value = "复审流程详情") + @GetMapping("/fsDetail") + public String fsDetail(String taskIds) { + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + @ApiOperation(value = "企标制修订流程详情") + @GetMapping("/qbzxdlcDetail") + public String qbzxdlcDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + @ApiOperation(value = "企标制修订流程详情") + @GetMapping("/zcfgrklcFqrDetail") + public String zcfgrklcFqrDetail(String taskIds) { + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONArray jsonArrayAll = new JSONArray(); + for (BusProcessNew busProcessNew:list) { + JSONObject object = JSONObject.parseObject(busProcessNew.getMesg()); + JSONArray jsonArray = JSONArray.parseArray(object.get("taskBreak").toString()); + jsonArrayAll.add(jsonArray.get(0)); + } + JSONObject object = new JSONObject(); + object.put("taskBreak",jsonArrayAll); + object.put("taskId",taskIds); + return object.toJSONString(); + } + + @ApiOperation(value = "政策法规入库流程详情/行政要求评估流程") + @GetMapping("/zcfgrklcDetail") + public String zcfgrklcDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + + @ApiOperation(value = "政策法规入库流程联络人选择FO详情") + @GetMapping("/zcfgrklcLlrDetail") + public String zcfgrklcLlrDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONArray resultArray = new JSONArray(); + JSONArray itemsJSONArray = new JSONArray(); + for (BusProcessNew busProcessNew:list) { + JSONObject object = JSONObject.parseObject(busProcessNew.getMesg()); + JSONArray jsonArray = object.getJSONArray("taskBreak"); + JSONObject jsonObject = (JSONObject) jsonArray.get(0); + JSONArray jsonArray1 = jsonObject.getJSONArray("itemsList"); + if (jsonArray1 != null){ + for (Object o:jsonArray1) { + itemsJSONArray.add(o); + } + } + Map map = new HashMap<>(); + for (Object o:itemsJSONArray) { + JSONObject jsonObject1 = (JSONObject) o; + map.putIfAbsent(jsonObject1.getString("id"), jsonObject1); + } + JSONArray newJsonArray = new JSONArray(); + for (String id:map.keySet()) { + newJsonArray.add(map.get(id)); + } + Collections.sort(newJsonArray, (o1, o2) -> { + JSONObject js1 = (JSONObject)o1; + JSONObject js2 = (JSONObject)o2; + Integer i1 = Integer.valueOf(js1.get("resNum").toString()); + Integer i2 = Integer.valueOf(js2.get("resNum").toString()); + return i1-i2; + }); + } + JSONObject object = JSONObject.parseObject(list.get(0).getMesg()); + JSONArray jsonArray = object.getJSONArray("taskBreak"); + JSONObject jsonObject1 = (JSONObject) jsonArray.get(0); + jsonObject1.put("itemsList",itemsJSONArray); + resultArray.add(jsonObject1); + object.put("taskBreak",jsonArray); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + + @ApiOperation(value = "政策法规入库流程再次下发详情") + @GetMapping("/zcfgrklcRectDetail") + public String zcfgrklcRectDetail(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + JSONObject mesg = JSONObject.parseObject(list.get(0).getMesg()); + JSONArray jsonArray = JSONArray.parseArray(mesg.getString("taskBreak")); + Map map = new HashMap<>(); + for (BusProcessNew busProcessNew:list) { + JSONObject object = JSONObject.parseObject(busProcessNew.getMesg()); + JSONArray jsonArray1 = JSONArray.parseArray(object.getString("taskBreak")); + JSONObject object1 = JSONObject.parseObject(jsonArray1.getString(0)); + JSONArray jsonArray2 = JSONArray.parseArray(object1.getString("itemsList")); + for (Object o:jsonArray2) { + JSONObject jsonObject = (JSONObject) o; + if (map.get(jsonObject.getString("id")) == null){ + map.put(jsonObject.getString("id"),jsonObject); + } + } + } + JSONArray jsonArray1 = new JSONArray(); + for (String key:map.keySet()) { + jsonArray1.add(map.get(key)); + } + for (Object o:jsonArray) { + JSONObject jsonObject = (JSONObject) o; + jsonObject.put("itemsList",jsonArray1); + + } + JSONObject object = new JSONObject(); + object.put("taskBreak", jsonArray); + object.put("taskId", list.get(0).getTaskId()); + return object.toJSONString(); + } + + @ApiOperation(value = "保存任务") + @PostMapping("/saveinboundTask") + public Wrapper saveinboundTask(@RequestBody BusMes busMes) { + BusProcessNew processNew = new BusProcessNew(); + if (busMes.getTaskIds() != null && !busMes.getTaskIds().equals("")) { + List list = Arrays.asList(busMes.getTaskIds().split(",")); + JSONObject ooo = JSONObject.parseObject(busMes.getJson()); + for (String str : list) { + JSONArray taskBreak = JSONObject.parseObject(busMes.getJson()).getJSONArray("taskBreak"); + int k = 0; + for (Object obj : taskBreak) { + JSONArray itemsList = ((JSONObject) obj).getJSONArray("itemsList"); + if (itemsList.size() > 0) { + //有条款 + JSONArray items = new JSONArray(); + for (int i = 0; i < itemsList.size(); i++) { + JSONObject item = itemsList.getJSONObject(i); + if (item.getString("taskId").equals(str)) { + JSONObject data = item; + JSONArray array = new JSONArray(); + array.add(data); + JSONObject.parseObject(busMes.getJson()).put("itemsList", array); + ((JSONObject) obj).put("itemsList", array); + JSONArray array1 = new JSONArray(); + array1.add(obj); + ooo.put("taskBreak", array1); + + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("task_id", str); + processNew = iBusProcessNewService.getOne(queryWrapper); + processNew.setMesg(JSON.toJSONString(ooo, SerializerFeature.DisableCircularReferenceDetect)); + iBusProcessNewService.saveOrUpdate(processNew); + } + } + } else { + //没条款 + Map map = ((Map) obj); + if (map.get("taskId").toString().equals(str)) { + JSONObject data = (JSONObject) map; + JSONArray array = new JSONArray(); + array.add(data); + ooo.put("taskBreak", array); + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("task_id", str); + processNew = iBusProcessNewService.getOne(queryWrapper); + processNew.setMesg(JSON.toJSONString(ooo, SerializerFeature.DisableCircularReferenceDetect)); + iBusProcessNewService.saveOrUpdate(processNew); + } + } + k++; + } + } + } + return WrapMapper.ok("保存成功"); + } + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "国内法规入库技术评估流程保存") + @PostMapping("/saveInboundLiaisonDetailForLawsAss") + public Wrapper saveInboundLiaisonDetailForLawsAss(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + JSONArray itemsList = object.getJSONArray("itemsList"); + if (itemsList.size() > 0) { + //有条款 + JSONArray array = new JSONArray(); + for (Object item : itemsList) { + Map map = ((Map) item); + JSONObject object1 = object; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", map.get("taskId").toString()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + object1.put("itemsList", item); + object1.put("backSaveFlag",1); + one.setMesg(JSON.toJSONString(object1)); + iBusProcessNewService.saveOrUpdate(one); + } + } else { + //没条款 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", object.get("taskId").toString()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + object.put("backSaveFlag",1); + one.setMesg(JSON.toJSONString(object)); + iBusProcessNewService.saveOrUpdate(one); + } +// JSONArray object2 = JSONArray.parseArray(busMes.getJson()); +// for(Object object3:object2){ +// JSONObject object = (JSONObject)object3; +// JSONArray itemsList = object.getJSONArray("itemsList"); +// if (itemsList.size() > 0) { +// //有条款 +// JSONArray array = new JSONArray(); +// for (Object item : itemsList) { +// Map map = ((Map) item); +// JSONObject object1 = object; +// QueryWrapper queryWrapper = new QueryWrapper(); +// queryWrapper.eq("TASK_ID", map.get("taskId").toString()); +// BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); +// object1.put("itemsList", item); +// one.setMesg(JSON.toJSONString(object1)); +// iBusProcessNewService.saveOrUpdate(one); +// } +// } else { +// //没条款 +// QueryWrapper queryWrapper = new QueryWrapper(); +// queryWrapper.eq("TASK_ID", object.get("taskId").toString()); +// BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); +// one.setMesg(JSON.toJSONString(object)); +// iBusProcessNewService.saveOrUpdate(one); +// } +// } + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "国内法规入库项目评估流程保存") + @PostMapping("/saveProjectAssessDetail2") + public Wrapper saveProjectAssessDetail2(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + JSONArray taskDis = object.getJSONArray("taskDistribution"); + List projectAssessDTOList = new ArrayList<>(); + for (int i = 0; i < taskDis.size(); i++) { + //标准列表 + String taskDisString = new String(); + taskDisString = taskDis.get(i).toString(); + ProjectAssessDTO jsonObject = JSONObject.parseObject(taskDisString, ProjectAssessDTO.class); + + if (jsonObject.getChildren().size() > 0) { + for (int j = 0; j < jsonObject.getChildren().size(); j++) { + //条款列表 + List itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + + if (itemsList.size() > 0) { + //有条款 + List items = new ArrayList<>(); + for (int k = 0; k < itemsList.size(); k++) { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + Children children = new Children(); + BeanUtils.copyProperties(jsonObject.getChildren().get(j), children); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + System.out.println(itemsList.get(k)); + itemsLists.add(itemsList.get(k)); + children.setItemsList(itemsLists); + childrenList.add(children); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } else { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + List childrenList = projectAssessDTO.getChildren(); + for (Children children : childrenList) { + //有条款 + if (children.getItemsList().size() > 0) { + List itemsList = children.getItemsList(); + for (ItemsList itemsList1 : itemsList) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", itemsList1.getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(projectAssessDTO)); + iBusProcessNewService.saveOrUpdate(one); + } + } else { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", children.getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(projectAssessDTO)); + iBusProcessNewService.saveOrUpdate(one); + } + } + } + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "国内法规入库项目评估流程保存") + @PostMapping("/saveProjectAssessDetail3") + public Wrapper saveProjectAssessDetail3(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + JSONArray taskDis = object.getJSONArray("children"); + List projectAssessDTOList = new ArrayList<>(); + + //标准列表 + Children jsonObject = JSONObject.parseObject(taskDis.get(0).toString(), Children.class); + //条款列表 + List itemsList = jsonObject.getItemsList(); + if (itemsList.size() > 0) { + //有条款 + List items = new ArrayList<>(); + for (int k = 0; k < itemsList.size(); k++) { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + itemsLists.add(itemsList.get(k)); + jsonObject.setItemsList(itemsLists); + childrenList.add(jsonObject); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", itemsList.get(k).getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(object)); + iBusProcessNewService.saveOrUpdate(one); + } + } else { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", jsonObject.getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(object)); + iBusProcessNewService.saveOrUpdate(one); + } + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "国内法规入库项目评估流程保存") + @PostMapping("/saveProjectAssessDetail4") + public Wrapper saveProjectAssessDetail4(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + //获取标准列表 + JSONArray taskDis = object.getJSONArray("dicTypeList"); + List projectAssessDTOList = new ArrayList<>(); + //标准列表 + for (int i = 0; i < taskDis.size(); i++) { + //标准列表 + ProjectAssessDTO jsonObject = JSONObject.parseObject(taskDis.get(i).toString(), ProjectAssessDTO.class); + if (jsonObject.getChildren().size() > 0) { + for (int j = 0; j < jsonObject.getChildren().size(); j++) { + //条款列表 + List itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + Children children = jsonObject.getChildren().get(j); + if (itemsList.size() > 0) { + //有条款 + List items = new ArrayList<>(); + for (int k = 0; k < itemsList.size(); k++) { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + itemsLists.add(itemsList.get(k)); + children.setItemsList(itemsLists); + childrenList.add(children); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } else { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + + JSONArray notInvolvedList = object.getJSONArray("nonComplianceList"); + Map map = new HashMap(); + + for (Object not : notInvolvedList) { + ProjectFormDTO notInvolved = JSONObject.parseObject(not.toString(), ProjectFormDTO.class); + if (notInvolved.getClauseNum() != null) { + map.put(notInvolved.getResId(), notInvolved); + } else { + map.put(notInvolved.getResId(), notInvolved); + } + } + + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + if (projectAssessDTO.getChildren().get(0).getItemsList() != null && projectAssessDTO.getChildren().get(0).getItemsList().size() > 0) { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResId()); + if (projectAssessDTO1 != null) { + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setApprovalOpinions(projectAssessDTO1.getApprovalOpinions()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setApprovalContent(projectAssessDTO1.getApprovalContent()); + projectAssessDTO.setOpinion(projectAssessDTO1.getOpinion()); + projectAssessDTO.setOpinionContent(projectAssessDTO1.getOpinionContent()); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", projectAssessDTO.getChildren().get(0).getItemsList().get(0).getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(projectAssessDTO)); + iBusProcessNewService.saveOrUpdate(one); + } + } else { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getResId()); + if (projectAssessDTO1 != null) { + projectAssessDTO.getChildren().get(0).setApprovalOpinions(projectAssessDTO1.getApprovalOpinions()); + projectAssessDTO.getChildren().get(0).setApprovalContent(projectAssessDTO1.getApprovalContent()); + projectAssessDTO.setOpinion(projectAssessDTO1.getOpinion()); + projectAssessDTO.setOpinionContent(projectAssessDTO1.getOpinionContent()); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", projectAssessDTO.getChildren().get(0).getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(projectAssessDTO)); + iBusProcessNewService.saveOrUpdate(one); + } + } + } + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "国内法规入库项目评估流程保存") + @PostMapping("/saveProjectAssessDetail5") + public Wrapper saveProjectAssessDetail5(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + //获取标准列表 + JSONArray taskDis = object.getJSONArray("dicTypeList"); + List projectAssessDTOList = new ArrayList<>(); + //标准列表 + for (int i = 0; i < taskDis.size(); i++) { + //标准列表 + ProjectAssessDTO jsonObject = JSONObject.parseObject(taskDis.get(i).toString(), ProjectAssessDTO.class); + if (jsonObject.getChildren().size() > 0) { + for (int j = 0; j < jsonObject.getChildren().size(); j++) { + //条款列表 + List itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + Children children = jsonObject.getChildren().get(j); + if (itemsList.size() > 0) { + //有条款 + List items = new ArrayList<>(); + for (int k = 0; k < itemsList.size(); k++) { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + itemsLists.add(itemsList.get(k)); + children.setItemsList(itemsLists); + childrenList.add(children); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } else { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + + JSONArray notInvolvedList = object.getJSONArray("nonComplianceList"); + Map map = new HashMap(); + + for (Object not : notInvolvedList) { + ProjectFormDTO notInvolved = JSONObject.parseObject(not.toString(), ProjectFormDTO.class); + if (notInvolved.getClauseNum() != null) { + map.put(notInvolved.getResId(), notInvolved); + } else { + map.put(notInvolved.getResId(), notInvolved); + } + } + JSONArray accordList = object.getJSONArray("accordList"); + JSONArray nonComplianceList = object.getJSONArray("nonComplianceList"); + JSONArray toBeConfirmedList = object.getJSONArray("toBeConfirmedList"); + + for (Object acc : accordList) { + ProjectFormDTO accord = JSONObject.parseObject(acc.toString(), ProjectFormDTO.class); + map.put(accord.getResId(), accord); + } + + for (Object non : nonComplianceList) { + ProjectFormDTO nonCompliance = JSONObject.parseObject(non.toString(), ProjectFormDTO.class); + map.put(nonCompliance.getResId(), nonCompliance); + } + + for (Object tobe : toBeConfirmedList) { + ProjectFormDTO toBeConfirmed = JSONObject.parseObject(tobe.toString(), ProjectFormDTO.class); + map.put(toBeConfirmed.getResId(), toBeConfirmed); + } + + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + if (projectAssessDTO.getChildren().get(0).getItemsList() != null && projectAssessDTO.getChildren().get(0).getItemsList().size() > 0) { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResId()); + if (projectAssessDTO1 != null) { + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setApprovalOpinions(projectAssessDTO1.getApprovalOpinions()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setApprovalContent(projectAssessDTO1.getApprovalContent()); + projectAssessDTO.setVseOpinion(projectAssessDTO1.getVseOpinion()); + projectAssessDTO.setVseOpinionContent(projectAssessDTO1.getVseOpinionContent()); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", projectAssessDTO.getChildren().get(0).getItemsList().get(0).getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(projectAssessDTO)); + iBusProcessNewService.saveOrUpdate(one); + } + } else { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getResId()); + if (projectAssessDTO1 != null) { + projectAssessDTO.getChildren().get(0).setApprovalOpinions(projectAssessDTO1.getApprovalOpinions()); + projectAssessDTO.getChildren().get(0).setApprovalContent(projectAssessDTO1.getApprovalContent()); + projectAssessDTO.setVseOpinion(projectAssessDTO1.getVseOpinion()); + projectAssessDTO.setVseOpinionContent(projectAssessDTO1.getVseOpinionContent()); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", projectAssessDTO.getChildren().get(0).getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(projectAssessDTO)); + iBusProcessNewService.saveOrUpdate(one); + } + } + } + return WrapMapper.ok("保存成功"); + } + + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "整改流程保存") + @PostMapping("/saveUnqualified") + public Wrapper saveUnqualified(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + JSONArray tableData = object.getJSONArray("tableData"); + for (Object object1 : tableData) { + Map map = (Map) object1; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", map.get("taskId")); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + JSONArray array = new JSONArray(); + array.add(object1); + object.put("tableData", array); + one.setMesg(object.toString()); + iBusProcessNewService.saveOrUpdate(one); + } + return WrapMapper.ok("保存成功"); + } + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "采购流程保存") + @PostMapping("/saveCgSq") + public Wrapper saveCgSq(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + JSONArray tableData = object.getJSONArray("tableData"); + for (Object object1 : tableData) { + Map map = (Map) object1; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", map.get("taskId")); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + JSONArray array = new JSONArray(); + array.add(object1); + object.put("tableData", array); + one.setMesg(object.toString()); + iBusProcessNewService.saveOrUpdate(one); + } + return WrapMapper.ok("保存成功"); + } + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "政策法规评估流程保存") + @PostMapping("/saveZcfgpg") + public Wrapper saveZcfgpg(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + JSONArray array = object.getJSONArray("dicTypeList"); + for (Object object1 : array) { + JSONArray itemsList = ((JSONObject) object1).getJSONArray("itemsList"); + if (itemsList.size() > 0) { + //有条款 + JSONArray array1 = new JSONArray(); + for (Object item : itemsList) { + Map map = ((Map) item); + JSONObject object2 = object; + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", map.get("taskId").toString()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + array1.add(item); + object2.put("itemsList", array1); + one.setMesg(JSON.toJSONString(object2)); + iBusProcessNewService.saveOrUpdate(one); + } + } else { + //没条款 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", ((Map) object1).get("taskId").toString()); + BusProcessNew one = iBusProcessNewService.getOne(queryWrapper); + one.setMesg(JSON.toJSONString(object)); + iBusProcessNewService.saveOrUpdate(one); + } + } + return WrapMapper.ok("保存成功"); + } + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "公共保存") + @PostMapping("/saveTaskForPub") + public Wrapper saveTaskForPub(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + List list = Arrays.asList(busMes.getTaskIds().split(",")); + for(String str:list){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", str); + List busProcessNewList = iBusProcessNewService.list(queryWrapper); + if (busProcessNewList != null && !busProcessNewList.isEmpty()) { + BusProcessNew one = busProcessNewList.get(0); + one.setMesg(object.toString()); + iBusProcessNewService.saveOrUpdate(one); + } + } + return WrapMapper.error("保存失败"); + } + + /** + * 保存任务第一步 + * + * @param busMes + */ + @ApiOperation(value = "保存任务第一步") + @PostMapping("/saveTaskFirst") + public Wrapper saveTaskFirst(@RequestBody BusMes busMes) { + BusMes busMes1 = new BusMes(); + if (busMes.getId() != null && !busMes.getId().equals("")) { + busMes1.setId(busMes.getId()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CREAT_USER", busMes.getCreateUser()); + queryWrapper.eq("PRC_TYPE", busMes.getPrcType()); + queryWrapper.eq("ID", busMes.getId()); + queryWrapper.isNull("PRC_ID"); + List list = iBusProcessNameService.list(queryWrapper); + if (list != null && list.size() > 0) { + BusProcessName busProcessName = list.get(0); + busProcessName.setMes(busMes.getJson()); + iBusProcessNameService.saveOrUpdate(busProcessName); + } + } else { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String time = sdf.format(new Date()); + BusProcessName busProcessName = new BusProcessName(); + busProcessName.setPrcType(busMes.getPrcType()); + busProcessName.setCreatUser(busMes.getCreateUser()); + busProcessName.setCreatTime(time); + busProcessName.setMes(busMes.getJson()); + busProcessName.setCreatUserName(busMes.getCreateUserName()); + iBusProcessNameService.save(busProcessName); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CREAT_TIME", time); + queryWrapper.eq("CREATE_USER_NAME", busMes.getCreateUserName()); + queryWrapper.eq("PRC_TYPE", busMes.getPrcType()); + queryWrapper.eq("CREAT_USER", busMes.getCreateUser()); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + busMes1.setId(one.getId()); + } + return WrapMapper.ok(busMes1.getId()); + } + + /** + * 查询任务第一步 + * + * @param bpnId + */ + @ApiOperation(value = "查询任务第一步") + @GetMapping("/queryTaskFirst") + public BusProcessName queryTaskFirst(String bpnId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ID", bpnId); + List list = iBusProcessNameService.list(queryWrapper); + if (list.size() > 0) { + return list.get(0); + } else { + return null; + } + } + + /** + * 查询草稿 + * + * @param taskCommonQuery + */ + @ApiOperation(value = "查询草稿") + @PostMapping("/queryTaskDraft") + public List queryTaskDraft(@RequestBody TaskCommonQuery taskCommonQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CREAT_USER", taskCommonQuery.getUserId()); + if (taskCommonQuery.getPrcNum() != null && !taskCommonQuery.getPrcNum().equals("")) { + queryWrapper.like("PRC_NUM", taskCommonQuery.getPrcNum()); + } + if (taskCommonQuery.getPrcName() != null && !taskCommonQuery.getPrcName().equals("")) { + queryWrapper.like("PRC_NAME", taskCommonQuery.getPrcName()); + } + if (taskCommonQuery.getPrcType() != null && !taskCommonQuery.getPrcType().equals("")) { + queryWrapper.eq("PRC_TYPE", taskCommonQuery.getPrcType()); + } else { + queryWrapper.isNotNull("PRC_TYPE"); + } + queryWrapper.isNull("PRC_ID"); + queryWrapper.orderByDesc("CREAT_TIME"); + List list = iBusProcessNameService.list(queryWrapper); + return list; + } + + @ApiOperation(value = "自动发起流程保存第一步", notes = "自动发起流程保存第一步") + @PostMapping("/autoSaveFirst") + public Wrapper autoSaveFirst(@RequestBody BusMes busMes) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("TASK_ID", busMes.getTaskId()); + BusProcessNew one = iBusProcessNewService.getOne(wrapper); + if (one != null) { + one.setMesg(busMes.getJson()); + iBusProcessNewService.saveOrUpdate(one); + } + + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("PRC_ID", busMes.getpId()); + BusProcessName one1 = iBusProcessNameService.getOne(wrapper1); + if (one1 != null) { + one1.setCreatUserName(busMes.getUserName()); + iBusProcessNameService.saveOrUpdate(one1); + } + + return WrapMapper.ok("提交成功"); + } + + + /** + * 复审流程专用 + * + * @param busMes + * @return + */ + @ApiOperation(value = "自动发起流程保存第一步", notes = "自动发起流程保存第一步") + @PostMapping("/autoSaveFirst1") + public Wrapper autoSaveFirst1(@RequestBody BusMes busMes) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("P_ID", busMes.getpId()); + BusProcessNew one = new BusProcessNew(); + BusProcessNew data = iBusProcessNewService.getOne(wrapper); + if (data != null) { + one = data; + } + if (busMes.getUserId() != null) { + one.setMesg(busMes.getUserId()); + one.setUserId(busMes.getUserId()); + } + one.setMsgType("19"); + one.setMesg(busMes.getJson()); + one.setPId(busMes.getpId()); + iBusProcessNewService.saveOrUpdate(one); + return WrapMapper.ok("提交成功"); + } + + + @ApiOperation(value = "查询流程是否结束", notes = "查询流程是否结束") + @GetMapping("/isEnd") + public String isEnd(String pId) { + ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); + RuntimeService runtimeService = processEngine.getRuntimeService(); + ProcessInstanceQuery createProcessInstanceQuery = runtimeService.createProcessInstanceQuery(); + if (pId != null) { + ProcessInstanceQuery processInstanceId = createProcessInstanceQuery.processInstanceId(pId); + ProcessInstance singleResult = processInstanceId.singleResult(); + if (singleResult == null) { + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("PRC_ID", pId); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper2); + if (one != null) { + if (one.getEndTime() == null || one.getEndTime().equals("")) { + List historicActivityInstanceList = historyService + .createHistoricActivityInstanceQuery().processInstanceId(pId) + .orderByHistoricActivityInstanceEndTime().desc().list(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + one.setEndTime(sdf.format(historicActivityInstanceList.get(0).getEndTime())); + iBusProcessNameService.saveOrUpdate(one); + } + } + return "1"; + }else if(singleResult.getProcessDefinitionName().equals("法规技术评估流程")){ + List tasksList = taskService.createTaskQuery().processInstanceId(singleResult.getProcessInstanceId()).active().list(); + if(tasksList.size()==0){ + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("PRC_ID", pId); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper2); + if (one != null) { + if (one.getEndTime() == null || one.getEndTime().equals("")) { + List historicActivityInstanceList = historyService + .createHistoricActivityInstanceQuery().processInstanceId(pId) + .orderByHistoricActivityInstanceEndTime().desc().list(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + one.setEndTime(sdf.format(historicActivityInstanceList.get(0).getEndTime())); + iBusProcessNameService.saveOrUpdate(one); + } + } + return "1"; + }else{ + return "0"; + } + }else if(singleResult.getProcessDefinitionName().equals("法规入库")){ + List tasksList = taskService.createTaskQuery().processInstanceId(singleResult.getProcessInstanceId()).active().list(); + if(tasksList.size()==0){ + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("PRC_ID", pId); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper2); + if (one != null) { + if (one.getEndTime() == null || one.getEndTime().equals("")) { + List historicActivityInstanceList = historyService + .createHistoricActivityInstanceQuery().processInstanceId(pId) + .orderByHistoricActivityInstanceEndTime().desc().list(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + one.setEndTime(sdf.format(historicActivityInstanceList.get(0).getEndTime())); + iBusProcessNameService.saveOrUpdate(one); + } + } + return "1"; + }else{ + return "0"; + } + }else { + return "0"; + } + } else { + return "1"; + } + } + + @ApiOperation(value = "删除流程", notes = "删除流程") + @GetMapping("/deleteProcessInstance") + public Wrapper deleteProcessInstance(String pId) { + runtimeService.deleteProcessInstance(pId, "用户删除"); + Map map = new HashMap(); + map.put("P_ID", pId); + Map map1 = new HashMap(); + map1.put("PRC_ID", pId); + iBusProcessNameService.removeByMap(map1); + iBusProcessNewService.removeByMap(map); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "删除草稿", notes = "删除草稿") + @GetMapping("/deleteDraft") + public Wrapper deleteDraft(String id) { + iBusProcessNameService.removeById(id); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "已发流程", notes = "已发流程") + @PostMapping("/issuedProcess") + public Page IssuedProcess(@RequestBody TaskCommonQuery taskCommonQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("CREAT_USER", taskCommonQuery.getUserId()); + if (taskCommonQuery.getPrcNum() != null && !taskCommonQuery.getPrcNum().equals("")) { + queryWrapper.like("PRC_NUM", taskCommonQuery.getPrcNum()); + } + if (taskCommonQuery.getPrcName() != null && !taskCommonQuery.getPrcName().equals("")) { + queryWrapper.like("PRC_NAME", taskCommonQuery.getPrcName()); + } + if (taskCommonQuery.getPrcType() != null && !taskCommonQuery.getPrcType().equals("")) { + queryWrapper.eq("PRC_TYPE", taskCommonQuery.getPrcType()); + } + queryWrapper.orderByDesc("CREAT_TIME"); + queryWrapper.isNotNull("PRC_ID"); + queryWrapper.isNotNull("PRC_NUM"); + List list = iBusProcessNameService.list(queryWrapper); + Page page = new Page(); + if (list != null && list.size() > 0) { + List list1 = this.startPage(list, taskCommonQuery.getCurrent(), taskCommonQuery.getSize()); + for (BusProcessName busProcessName : list1) { + String assignee = ""; + List list2 = taskService.createTaskQuery().processInstanceId(busProcessName.getPrcId()).active().list(); + if (list2.size() > 0) { + for (Task task : list2) { + if (task.getAssignee() != null && !task.getAssignee().equals("")) { + ResponseMessage byId = lawsUserInfoService.getById(task.getAssignee()); + if (byId.getData() != null) { + if (assignee.indexOf(byId.getData().getUname()) == -1) { + assignee += ((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname()) + ","; + } + } + } else { +// ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); +// List listCandidate = processEngine.getHistoryService()// +// .getHistoricIdentityLinksForTask(task.getId()); +// if (listCandidate != null && listCandidate.size() > 0) { +// for (HistoricIdentityLink historicIdentityLink : listCandidate) { +// ResponseMessage byId = lawsUserInfoService.getById(historicIdentityLink.getUserId()); +// if (byId.getData() != null) { +// if (assignee.indexOf(byId.getData().getUname()) == -1) { +// assignee += ((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname()) + ","; +// } +// } +// } +// } + String end = this.isEnd(busProcessName.getPrcId()); + if(end.equals("0")){ + ResponseMessage> listUser = lawsUserInfoService.getManagerByOrgIdNew("企业标准管理工程师"); + if(listUser.getData()!=null){ +// List qbgcs = new ArrayList<>(); + for (OrgEO orgEO : listUser.getData()) { + assignee+=orgEO.getRoleName()+"-"+orgEO.getUserName(); + } +// String str= StringUtils.join(qbgcs, ","); +// assignee+=str; + } + } + } + } + } + if (assignee != null && !assignee.equals("")) { + busProcessName.setTaskAssignee(assignee.substring(0, assignee.length() - 1)); + } + String end = this.isEnd(busProcessName.getPrcId()); + busProcessName.setIsEnd(end); + if(end.equals("1")&&busProcessName.getEndTime()==null ){ + BusProcessName byId = iBusProcessNameService.getById(busProcessName.getId()); + busProcessName.setEndTime(byId.getEndTime()); + } + List userTask = historyService.createHistoricActivityInstanceQuery() + .activityType("userTask") + .processInstanceId(busProcessName.getPrcId()) + .finished().orderByHistoricActivityInstanceEndTime().desc().list(); + if (userTask.size() > 0) { + if (end.equals("1")) { + ResponseMessage byId = lawsUserInfoService.getById(userTask.get(0).getAssignee()); + if (byId.getData() != null) { + busProcessName.setTaskBackAssignee(((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname())); + } + } else { + ResponseMessage byId = lawsUserInfoService.getById(userTask.get(0).getAssignee()); + if (byId.getData() != null) { + busProcessName.setTaskBackAssignee(((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname())); + } + } + } else { + busProcessName.setTaskBackAssignee(""); + } + } + page.setList(list1); + page.setCount(Long.valueOf(list.size())); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } else { + List list2 = new ArrayList(); + page.setList(list2); + page.setCount(Long.valueOf(list.size())); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } + return page; + } + + @ApiOperation(value = "已办流程", notes = "已办流程") + @PostMapping("/doneProcess") + public Page doneProcess(@RequestBody TaskCommonQuery taskCommonQuery) { +// HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery(); +// query.involvedUser(taskCommonQuery.getUserId()); +// query.finished(); +// query.orderByProcessInstanceStartTime().desc(); +// List instances = query.list(); + + List instances = historyService.createHistoricTaskInstanceQuery() + .taskAssignee(taskCommonQuery.getUserId()).orderByHistoricTaskInstanceEndTime().asc() + .finished() + .list(); + Set pIds = new HashSet<>(); + Map map = new HashMap(); + for (HistoricTaskInstance historicProcessInstance : instances) { + pIds.add(historicProcessInstance.getProcessInstanceId()); + map.put(historicProcessInstance.getProcessInstanceId()+"start",historicProcessInstance.getStartTime()); + map.put(historicProcessInstance.getProcessInstanceId()+"end",historicProcessInstance.getEndTime()); + } + Page page = new Page(); + if (pIds.size() > 0) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.in("PRC_ID", pIds); + queryWrapper.orderByDesc("CREAT_TIME"); + if (taskCommonQuery.getPrcNum() != null && !taskCommonQuery.getPrcNum().equals("")) { + queryWrapper.like("PRC_NUM", taskCommonQuery.getPrcNum()); + } + if (taskCommonQuery.getPrcName() != null && !taskCommonQuery.getPrcName().equals("")) { + queryWrapper.like("PRC_NAME", taskCommonQuery.getPrcName()); + } + if (taskCommonQuery.getPrcType() != null && !taskCommonQuery.getPrcType().equals("")) { + queryWrapper.eq("PRC_TYPE", taskCommonQuery.getPrcType()); + } + List list = iBusProcessNameService.list(queryWrapper); + List list1 = this.startPage(list, taskCommonQuery.getCurrent(), taskCommonQuery.getSize()); + if (list != null && list.size() > 0) { + for (BusProcessName busProcessName : list1) { + String assignee = ""; + List list2 = taskService.createTaskQuery().processInstanceId(busProcessName.getPrcId()).active().list(); + if (list2.size() > 0) { + for (Task task : list2) { + if (task.getAssignee() != null && !task.getAssignee().equals("")) { + ResponseMessage byId = lawsUserInfoService.getById(task.getAssignee()); + if (byId.getData() != null) { + if (assignee.indexOf(byId.getData().getUname()) == -1) { + assignee += ((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname()) + ","; + } + } + }else{ + String end = this.isEnd(busProcessName.getPrcId()); + if(end.equals("0")){ + ResponseMessage> listUser = lawsUserInfoService.getManagerByOrgIdNew("企业标准管理工程师"); + if(listUser.getData()!=null){ +// List qbgcs = new ArrayList<>(); + for (OrgEO orgEO : listUser.getData()) { + assignee+=orgEO.getRoleName()+"-"+orgEO.getUserName(); + } +// String str= StringUtils.join(qbgcs, ","); +// assignee+=str; + } + } + } + } + } + if (assignee != null && !assignee.equals("")) { + busProcessName.setTaskAssignee(assignee.substring(0, assignee.length() - 1)); + } + String end = this.isEnd(busProcessName.getPrcId()); + busProcessName.setIsEnd(end); + if(end.equals("1")&&busProcessName.getEndTime()==null ){ + BusProcessName byId = iBusProcessNameService.getById(busProcessName.getId()); + busProcessName.setEndTime(byId.getEndTime()); + } + List userTask = historyService.createHistoricActivityInstanceQuery() + .activityType("userTask") + .processInstanceId(busProcessName.getPrcId()) + .finished().orderByHistoricActivityInstanceEndTime().desc().list(); + if (userTask.size() > 0) { + if (end.equals("1")) { + ResponseMessage byId = lawsUserInfoService.getById(userTask.get(0).getAssignee()); + if (byId.getData() != null) { + busProcessName.setTaskBackAssignee(((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname())); + } + } else { + ResponseMessage byId = lawsUserInfoService.getById(userTask.get(0).getAssignee()); + if (byId.getData() != null) { + busProcessName.setTaskBackAssignee(((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname())); + } + } + } else { + busProcessName.setTaskBackAssignee(""); + } + map.get(busProcessName.getPrcId()+"start"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String startdata = sdf.format(map.get(busProcessName.getPrcId()+"start")); + String enddata = sdf.format(map.get(busProcessName.getPrcId()+"end")); + busProcessName.setEndTaskTime(enddata); + busProcessName.setStartTaskTime(startdata); + } + page.setList(list1); + page.setCount(Long.valueOf(list.size())); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } else { + List list2 = new ArrayList(); + page.setList(list2); + page.setCount(Long.valueOf(list.size())); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } + } else { + List list2 = new ArrayList(); + page.setList(list2); + page.setCount(Long.valueOf(0)); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } + return page; + } + + @ApiOperation(value = "监控流程列表", notes = "监控流程列表") + @PostMapping("/allProcess") + public Page allProcess(@RequestBody TaskCommonQuery taskCommonQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderByDesc("CREAT_TIME"); + if (taskCommonQuery.getPrcNum() != null && !taskCommonQuery.getPrcNum().equals("")) { + queryWrapper.like("PRC_NUM", taskCommonQuery.getPrcNum()); + } + if (taskCommonQuery.getPrcName() != null && !taskCommonQuery.getPrcName().equals("")) { + queryWrapper.like("PRC_NAME", taskCommonQuery.getPrcName()); + } + if (taskCommonQuery.getPrcType() != null && !taskCommonQuery.getPrcType().equals("")) { + queryWrapper.eq("PRC_TYPE", taskCommonQuery.getPrcType()); + } + queryWrapper.isNotNull("PRC_ID"); + queryWrapper.isNotNull("PRC_NAME"); + List list = iBusProcessNameService.list(queryWrapper); + Page page = new Page(); + if (list != null && list.size() > 0) { + List list1 = this.startPage(list, taskCommonQuery.getCurrent(), taskCommonQuery.getSize()); + for (BusProcessName busProcessName : list1) { + String assignee = ""; + if (busProcessName.getPrcId() != null) { + List list2 = taskService.createTaskQuery().processInstanceId(busProcessName.getPrcId()).active().list(); + if (list2.size() > 0) { + for (Task task : list2) { + if (task.getAssignee() != null && !task.getAssignee().equals("")) { + ResponseMessage byId = lawsUserInfoService.getById(task.getAssignee()); + if (byId.getData() != null) { + if (assignee.indexOf(byId.getData().getUname()) == -1) { + assignee += ((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname()) + ","; + } + } + }else{ + String end = this.isEnd(busProcessName.getPrcId()); + if(end.equals("0")){ + ResponseMessage> listUser = lawsUserInfoService.getManagerByOrgIdNew("企业标准管理工程师"); + if(listUser.getData()!=null){ +// List qbgcs = new ArrayList<>(); + for (OrgEO orgEO : listUser.getData()) { + assignee+=orgEO.getRoleName()+"-"+orgEO.getUserName(); + } +// String str= StringUtils.join(qbgcs, ","); +// assignee+=str; + } + } + } + } + } + if (assignee != null && !assignee.equals("")) { + busProcessName.setTaskAssignee(assignee.substring(0, assignee.length() - 1)); + } + String end = this.isEnd(busProcessName.getPrcId()); + busProcessName.setIsEnd(end); + if(end.equals("1")&&busProcessName.getEndTime()==null ){ + BusProcessName byId = iBusProcessNameService.getById(busProcessName.getId()); + busProcessName.setEndTime(byId.getEndTime()); + } + List userTask = historyService.createHistoricActivityInstanceQuery() + .activityType("userTask") + .processInstanceId(busProcessName.getPrcId()) + .finished().orderByHistoricActivityInstanceEndTime().desc().list(); + if (userTask.size() > 0) { + if (end.equals("1")) { + ResponseMessage byId = lawsUserInfoService.getById(userTask.get(0).getAssignee()); + if (byId.getData() != null) { + busProcessName.setTaskBackAssignee(((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname())); + } + } else { + ResponseMessage byId = lawsUserInfoService.getById(userTask.get(0).getAssignee()); + if (byId.getData() != null) { + busProcessName.setTaskBackAssignee(((byId.getData().getOrgName() != null && !byId.getData().getOrgName().equals("")) ? byId.getData().getOrgName() + "-" + byId.getData().getUname() : byId.getData().getUname())); + } + } + } else { + busProcessName.setTaskBackAssignee(""); + } + } + } + page.setList(list1); + page.setCount(Long.valueOf(list.size())); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } else { + List list2 = new ArrayList(); + page.setList(list2); + page.setCount(Long.valueOf(list.size())); + page.setPageSize(taskCommonQuery.getSize()); + page.setPageNo(taskCommonQuery.getCurrent()); + } + return page; + } + + /** + * 开始分页 + * + * @param list + * @param pageNum 页码 + * @param pageSize 每页多少条数据 + * @return + */ + public static List startPage(List list, Integer pageNum, + Integer pageSize) { + if (list == null) { + return null; + } + if (list.size() == 0) { + return null; + } + + Integer count = list.size(); // 记录总数 + Integer pageCount = 0; // 页数 + if (count % pageSize == 0) { + pageCount = count / pageSize; + } else { + pageCount = count / pageSize + 1; + } + + int fromIndex = 0; // 开始索引 + int toIndex = 0; // 结束索引 + + if (pageNum != pageCount) { + fromIndex = (pageNum - 1) * pageSize; + toIndex = fromIndex + pageSize; + } else { + fromIndex = (pageNum - 1) * pageSize; + toIndex = count; + } + + List pageList = list.subList(fromIndex, toIndex); + + return pageList; + } + + @ApiOperation(value = "强制撤回", notes = "强制撤回") + @GetMapping("/forceRecall") + public Wrapper forceRecall(String prcId) { + runtimeService.deleteProcessInstance(prcId, "用户强制撤回"); + Map map = new HashMap(); + map.put("P_ID", prcId); + iBusProcessNewService.removeByMap(map); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PRC_ID", prcId); + BusProcessName one = iBusProcessNameService.getOne(queryWrapper); + iBusProcessNameService.removeById(one.getId()); + one.setPrcId(null); + one.setPrcNum(null); + one.setPrcName(null); + one.setOverTime(null); + iBusProcessNameService.save(one); + return WrapMapper.ok("撤回成功"); + } + + /** + * 本接口仅提供法规系统调用 + * + * @param pId + */ + @ApiOperation(value = "政策法规入库评估查看最后数据") + @GetMapping("/zcfgrkpgDetail") + public List zcfgrkpgDetail(String pId) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("P_ID", pId); + queryWrapper.isNull("TASK_ID"); + List list = iBusProcessNewService.list(queryWrapper); + return list; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param pId + */ + @ApiOperation(value = "发送我的动态") + @GetMapping("/saveNewPersonMsg") + public List saveNewPersonMsg(String pId) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("P_ID", pId); + queryWrapper.isNull("TASK_ID"); + List list = iBusProcessNewService.list(queryWrapper); + return list; + } + + @ApiOperation(value = "测试1") + @GetMapping("/test1") + public String test1(String roleId, String userId, String hierarchy) { + String userId1 = lawsUserInfoService.getUserId(roleId, userId, hierarchy); + return userId1; + } + + @ApiOperation(value = "测试2") + @GetMapping("/test2") + public ResponseMessage> test2(String roleName) { + ResponseMessage> managerByOrgIdNew = lawsUserInfoService.getManagerByOrgIdNew(roleName); + return managerByOrgIdNew; + } + + @ApiOperation(value = "测试3") + @GetMapping("/test3") + public String test3(String accessId) { + String userId1 = lawsUserInfoService.queryUser(accessId); + return userId1; + } + + @ApiOperation(value = "测试4") + @GetMapping("/test4") + public String test4(String roleId) { + String userId1 = lawsUserInfoService.getUserByRoleId(roleId); + return userId1; + } + + + @GetMapping("/getStandCode") + public Set getStandCode() { + Set standCode = new HashSet<>(); + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.isNotNull("PRC_ID"); + //企标制修订申请流程 + queryWrapper.eq("PRC_TYPE", "6"); + List list_6 = iBusProcessNameService.list(queryWrapper); + for (BusProcessName busProcessName : list_6) { + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("P_ID", busProcessName.getPrcId()); + List itemList = iBusProcessNewService.list(queryWrapper1); + if (itemList.size() > 0) { + JSONObject jsonObject = JSON.parseObject(itemList.get(0).getMesg()); + Map qbzxdForm = (Map) jsonObject.get("qbzxdForm"); + standCode.add(qbzxdForm.get("standCode")); + } + } + return standCode; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param taskIds + */ + @ApiOperation(value = "行政管理要求评估流程详情") + @GetMapping("/inboundLiaisonDetailForXZYQ") + public BusProcessNew inboundLiaisonDetailForXZYQ(String taskIds) { + + List taskIdList = new ArrayList<>(Arrays.asList(taskIds.split(","))); + List list = iBusProcessNewService.findNoExecuteBusProcessNewForEnd(taskIdList); + if (list.isEmpty()) { + return null; + } + BusProcessNew processNew = new BusProcessNew(); + BeanUtils.copyProperties(list.get(0), processNew); + + JSONObject object3 = JSONObject.parseObject(list.get(0).getMesg()); + JSONArray arr2 = new JSONArray(); + object3.put("tableList", arr2); + Map> map = new HashMap(); + for (BusProcessNew busProcessNew : list) { + JSONObject object = JSONObject.parseObject(busProcessNew.getMesg()); + JSONArray array = object.getJSONArray("tableList"); + if(map.containsKey(((JSONObject)array.get(0)).getString("resId"))){ + List list2 = (List)map.get(((JSONObject)array.get(0)).getString("resId")); + ((JSONObject) array.get(0)).put("taskId",busProcessNew.getTaskId()); + list2.add((JSONObject) array.get(0)); + }else{ + List list1 = new ArrayList(); + ((JSONObject) array.get(0)).put("taskId",busProcessNew.getTaskId()); + list1.add((JSONObject) array.get(0)); + map.put(((JSONObject)array.get(0)).getString("resId"),list1); + } + } + + JSONArray array = new JSONArray(); + for(String key:map.keySet()){ + List ojb = map.get(key); + List objectList = new ArrayList<>(); + for(JSONObject object:ojb){ + if(object.getJSONArray("itemsList").size()>0){ + ((JSONObject)object.getJSONArray("itemsList").get(0)).put("taskId",object.getString("taskId")); + objectList.add((JSONObject)object.getJSONArray("itemsList").get(0)); + } + } + JSONObject jsonObject = ojb.get(0); + jsonObject.put("itemsList",JSONArray.parseArray(JSON.toJSONString(objectList))); + array.add(jsonObject); + } + object3.put("tableList",array); + processNew.setMesg(object3.toJSONString()); + return processNew; + } + + /** + * 本接口仅提供法规系统调用 + * + * @param busMes + */ + @ApiOperation(value = "行政管理要求评估流程保存") + @PostMapping("/saveTaskForXZYQ") + public Wrapper saveTaskForXZYQ(@RequestBody BusMes busMes) { + JSONObject object = JsonUtil.jsonStrToJsonObject(busMes.getJson()); + List list = Arrays.asList(busMes.getTaskIds().split(",")); + for(String str:list){ + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("TASK_ID", str); + List busProcessNewList = iBusProcessNewService.list(queryWrapper); + if (busProcessNewList != null && !busProcessNewList.isEmpty()) { + BusProcessNew one = busProcessNewList.get(0); + JSONArray taskBreak = object.getJSONArray("tableList"); + String sss = ""; + //循环政策数据 + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + //有条款 + for(Object obj1:arry){ + JSONObject objObject1 = (JSONObject) obj1; + if(objObject1.getString("taskId").equals(str)){ + JSONArray array = new JSONArray(); + JSONObject object1 = new JSONObject(); + object1.putAll(object); + array.add(objObject1); + object1.getJSONArray("tableList").getJSONObject(0).put("itemsList",array); + sss += JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect); + } + } + }else{ + //无条款 + if(objObject.getString("taskId").equals(str)){ + JSONArray array = new JSONArray(); + JSONObject object1 = new JSONObject(); + object1.putAll(object); + array.add(objObject); + object1.put("tableList",array); + sss += JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect); + } + } + } + one.setMesg(sss); + iBusProcessNewService.saveOrUpdate(one); + } + } + return WrapMapper.error("保存成功"); + } + + + @ApiOperation(value = "自动催办与手动催办") + @PostMapping("/queryBusProcessNameForEnd") + public List queryBusProcessNameForEnd(@RequestBody String taskId) { + return iBusProcessNameService.findBusProcessNameForEnd(taskId); + } + + +// @ApiOperation(value = "查询流程信息", notes = "根据流程流程编号查询名称等信息") +// @ApiImplicitParams({@ApiImplicitParam(name = "prcNum", value = "流程编号")}) +// @PostMapping("/findProcessNameByPrcNum") +// public List findProcessNameByPrcNum(@RequestBody String taskId) { +// return iBusProcessNameService.findBusProcessNameForEnd(taskId); +// } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_auth/AuUsrFeignService.java b/src/main/java/com/ydw/bat/wkflow/business_auth/AuUsrFeignService.java new file mode 100644 index 00000000..86bb4dd7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_auth/AuUsrFeignService.java @@ -0,0 +1,26 @@ +package com.ydw.bat.wkflow.business_auth; + +import java.util.List; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import com.tmsps.fk.common.wrapper.Wrapper; + +@Component +@FeignClient(value = "${wkfow.auth}",path="/fk-auth",url="") +@RequestMapping("/api/usr") +public interface AuUsrFeignService { + + @GetMapping("/departManager") + public Wrapper> getDepartManager(@RequestParam("currentUsrId") String currentUsrId); + + @GetMapping("/generalManager") + public Wrapper> getGeneralManager(); + + @GetMapping("/finance") + public Wrapper> getFinance(); +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_auth/JsonData.java b/src/main/java/com/ydw/bat/wkflow/business_auth/JsonData.java new file mode 100644 index 00000000..a9678b25 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_auth/JsonData.java @@ -0,0 +1,19 @@ +package com.ydw.bat.wkflow.business_auth; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/11 20:23 + * @Version 1.0 + */ +public class JsonData { + + String json; + + public String getJson() { + return json; + } + + public void setJson(String json) { + this.json = json; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_auth/LawsUserInfoService.java b/src/main/java/com/ydw/bat/wkflow/business_auth/LawsUserInfoService.java new file mode 100644 index 00000000..c989be2e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_auth/LawsUserInfoService.java @@ -0,0 +1,87 @@ +package com.ydw.bat.wkflow.business_auth; + +import com.github.pagehelper.PageInfo; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import feign.Headers; +import feign.Param; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.*; + +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Component +@FeignClient(value = "LAWSSystem2",path="/api",url="") +@RequestMapping("/") +public interface LawsUserInfoService { + + @GetMapping("sys/org/getManagerByOrgId") + public ResponseMessage> getManagerByOrgId(@RequestParam("roleName") String currentUsrId, @RequestParam("orgId") String orgId); + + @GetMapping("sys/org/getOrgByUserId") + public ResponseMessage getOrgByUserId(@RequestParam("userId") String userId); + + /** + * 废止(企标复审) + * @param standCode + * @param standName + * @return + */ + @GetMapping("lawss/sarBussionessStand/listByPage") + public ResponseMessage> standList(@RequestParam("standCode")String standCode, @RequestParam("standName")String standName); + + @PostMapping("lawss/sarBussionessStand/addOrUpdateStandState") + void addOrUpdateStandState(SarBussionessStandStateEO sarBussionessStandStateEO); + + @GetMapping("lawss/sarBussStandPlan/listByPage") + public ResponseMessage> standPlanList(@RequestParam("standCode")String standCode, @RequestParam("standName")String standName); + + @GetMapping("sys/user/getById") + public ResponseMessage getById(@RequestParam("id") String id); + + @GetMapping("lawss/sarProductInfo/queryMap") + public ResponseMessage>> queryMap(); + + @GetMapping("sys/org/getUserId") + public String getUserId(@RequestParam("roleId")String roleId, + @RequestParam("userId")String userId, + @RequestParam("hierarchy")String hierarchy); + + @GetMapping("sys/org/getManagerByOrgIdNew") + public ResponseMessage> getManagerByOrgIdNew(@RequestParam("roleName") String currentUsrId); + + @GetMapping("lawss/sarProductUser/queryUser") + public String queryUser(@RequestParam("accessId") String accessId); + + @GetMapping("sys/org/getUserByRoleId") + public String getUserByRoleId(@RequestParam("roleId") String roleId); + + @GetMapping("sys/org/getLoginUserId") + public String getLoginUserId(); + + @GetMapping("lawss/activiti/activiti_define_start1") + public Map activiti_define_start(@RequestParam("id") String id,@RequestParam("userId") String userId); + + @PostMapping("person/personMsg/saveNew") + public String saveNewPersonMsg(PersonMsgEO personMsgEO); + + @PostMapping("lawss/mail/sendMail") + public ResponseMessage sendMail(@RequestParam("userId") Set userId,@RequestParam("msg") String msg); + + @GetMapping("sys/role/getParentIds") + public ResponseMessage getParentIds(@RequestParam("id") String id); + + @PostMapping("sys/role/getFoByDREs") + void getFoByDREs(@RequestParam("ids") String ids,@RequestParam("msg") String msg); + + @PostMapping("sys/role/xxxxx") + void xxxx (@RequestParam("standList") List standList,@RequestParam("projectList") List projectList); + + @GetMapping("lawss/mail/sendMailByUserIdFeign") + public ResponseMessage sendEmail(@RequestParam("userId") String userId, @RequestParam("msg") String msg, @RequestParam("title") String title); +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/category/controller/CategoryController.java b/src/main/java/com/ydw/bat/wkflow/business_main/category/controller/CategoryController.java new file mode 100644 index 00000000..c40040fe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/category/controller/CategoryController.java @@ -0,0 +1,108 @@ +package com.ydw.bat.wkflow.business_main.category.controller; + +import java.util.Date; +import java.util.List; + +import javax.validation.Valid; + +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.ModelQuery; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.category.dto.CategoryQuery; +import com.ydw.bat.wkflow.business_main.category.entity.Category; +import com.ydw.bat.wkflow.business_main.category.service.ICategoryService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "流程分类管理") +@RestController +@RequestMapping("/category/category") +public class CategoryController { + + @Autowired + private ICategoryService iCategoryService; + @Autowired + private RepositoryService repositoryService; + + @ApiOperation(value = "流程分类列表") + @GetMapping("/list") + public Wrapper> list() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderBy(true, true, "CODE"); + List list = iCategoryService.list(queryWrapper); + return WrapMapper.ok(list); + } + + @ApiOperation(value = "流程分类分页列表") + @PostMapping("/page") + public Wrapper> list(@RequestBody(required = false) CategoryQuery categoryQuery) { + + IPage page = iCategoryService.page(categoryQuery,categoryQuery.makeQueryWrapper()); + + return WrapMapper.ok(page); + } + + @ApiOperation(value = "添加流程分类") + @PostMapping("/add") + public Wrapper add(@ApiParam @Valid @RequestBody Category category) { + category.setCreateTime(new Date()); + iCategoryService.save(category); + + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "删除流程分类") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/delete") + public Wrapper delete(String objectId) { + ModelQuery modelQuery = repositoryService.createModelQuery(); + modelQuery.modelCategory(objectId); + long total = modelQuery.count(); + if(total>0){ + return WrapMapper.error("流程分类中还存在流程,不允许删除"); + }else{ + iCategoryService.removeById(objectId); + return WrapMapper.ok("删除成功"); + } + } + + @ApiOperation(value = "编辑获取流程分类数据") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/edit_form") + public Wrapper editForm(String objectId) { + Category opFunc = iCategoryService.getById(objectId); + return WrapMapper.ok(opFunc); + } + + @ApiOperation(value = "编辑流程分类") + @PostMapping("/edit") + public Wrapper edit(@Valid @RequestBody Category category) { + Category categoryDb = iCategoryService.getById(category.getObjectId()); + categoryDb.setType(category.getType()); + categoryDb.setCode(category.getCode()); + iCategoryService.saveOrUpdate(categoryDb); + + return WrapMapper.ok("保存成功"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/category/dto/CategoryQuery.java b/src/main/java/com/ydw/bat/wkflow/business_main/category/dto/CategoryQuery.java new file mode 100644 index 00000000..69aec7b0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/category/dto/CategoryQuery.java @@ -0,0 +1,23 @@ +package com.ydw.bat.wkflow.business_main.category.dto; + +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import io.swagger.annotations.ApiModel; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "CategoryQuery 对象", description = "") +public class CategoryQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + public Wrapper makeQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderBy(true, true, "CODE"); + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/category/entity/Category.java b/src/main/java/com/ydw/bat/wkflow/business_main/category/entity/Category.java new file mode 100644 index 00000000..0709efbe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/category/entity/Category.java @@ -0,0 +1,53 @@ +package com.ydw.bat.wkflow.business_main.category.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * + *

+ * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_category") +@ApiModel(value = "Category对象", description = "") +public class Category { + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "编码 排序用") + @TableField("CODE") + private String code; + + @ApiModelProperty(value = "类型名称") + @TableField("TYPE") + private String type; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/category/mapper/CategoryMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/category/mapper/CategoryMapper.java new file mode 100644 index 00000000..9e6dc174 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/category/mapper/CategoryMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.category.mapper; + +import com.ydw.bat.wkflow.business_main.category.entity.Category; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface CategoryMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/category/service/ICategoryService.java b/src/main/java/com/ydw/bat/wkflow/business_main/category/service/ICategoryService.java new file mode 100644 index 00000000..8014d0dc --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/category/service/ICategoryService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.category.service; + +import com.ydw.bat.wkflow.business_main.category.entity.Category; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface ICategoryService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/category/service/impl/CategoryServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/category/service/impl/CategoryServiceImpl.java new file mode 100644 index 00000000..aa6af974 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/category/service/impl/CategoryServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.category.service.impl; + +import com.ydw.bat.wkflow.business_main.category.entity.Category; +import com.ydw.bat.wkflow.business_main.category.mapper.CategoryMapper; +import com.ydw.bat.wkflow.business_main.category.service.ICategoryService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Service +public class CategoryServiceImpl extends ServiceImpl implements ICategoryService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessController.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessController.java new file mode 100644 index 00000000..dfe2ee7a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessController.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_main.datas.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-11-05 + */ +@RestController +@RequestMapping("/datas/bus-process") +public class BusProcessController { + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessEntrustController.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessEntrustController.java new file mode 100644 index 00000000..3c6db45f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessEntrustController.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_main.datas.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-12-11 + */ +@RestController +@RequestMapping("/datas/bus-process-entrust") +public class BusProcessEntrustController { + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNameController.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNameController.java new file mode 100644 index 00000000..4afed5ca --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNameController.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.business_main.datas.controller; + + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import io.swagger.annotations.ApiOperation; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-11-11 + */ +@RestController +@RequestMapping("/datas/bus-process-name") +public class BusProcessNameController { + +// @Autowired +// private IBusProcessNameService iBusProcessNameService; +// +// @ApiOperation(value = "查询待办任务") +// @GetMapping("/queryBusProcessNameForEnd") +// public List queryBusProcessNameForEnd() { +// return iBusProcessNameService.findBusProcessNameForEnd(); +// } + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNewController.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNewController.java new file mode 100644 index 00000000..44064b20 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/BusProcessNewController.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.business_main.datas.controller; + + +import com.tmsps.fk.common.base.action.BaseAction; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.impl.BusProcessNewServiceImpl; +import com.ydw.bat.wkflow.util.WebUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-11-10 + */ +@Api(description = "业务数据查询") +@RestController +@RequestMapping("/datas/bus-process-new") +public class BusProcessNewController extends BaseAction { + + @Autowired + private IBusProcessNewService iBusProcessNewService; + + @ApiOperation(value = "查询待办任务") + @GetMapping("/queryTask") + public List QueryTask(String userId,String pId) { + List tasks = iBusProcessNewService.QueryTask(userId, pId); + return tasks; + } + + @ApiOperation(value = "待办任务详情") + @GetMapping("/todotask") + public List todotask(String userId,String pId) { + List findtodotask = iBusProcessNewService.findtodotask(userId, pId); + return findtodotask; + } + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/DatasController.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/DatasController.java new file mode 100644 index 00000000..43116b0b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/DatasController.java @@ -0,0 +1,79 @@ +package com.ydw.bat.wkflow.business_main.datas.controller; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.datas.dto.DatasQuery; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.mapper.DatasMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SessionTool; +import com.ydw.bat.wkflow.util.TjTools; +import com.ydw.bat.wkflow.util.date.DateTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "我的业务管理") +@RestController +@RequestMapping("/datas/datas") +public class DatasController { + + @Autowired + private IDatasService datasService; + @Autowired + private DatasMapper datasMapper; + + @ApiOperation(value = "我的业务列表") + @PostMapping("/list") + public Wrapper> list(@RequestBody DatasQuery datasQuery) { + datasQuery.setAssigner(SessionTool.getSessionAdminId()); + datasQuery.setType("填写单"); + IPage ipage = datasService.page(datasQuery, datasQuery.makeQueryWrapper()); + + return WrapMapper.ok(ipage); + } + + @ApiOperation(value = "业务统计") + @PostMapping("/statistics") + public Wrapper> statistics(@RequestBody DatasQuery datasQuery) { + System.err.println(datasQuery); + datasQuery.setType("填写单"); + datasQuery.setName("请假单"); + if(ChkUtil.isNull(datasQuery.getDate())) { + if("年".equals(datasQuery.getFormatType())) { + datasQuery.setDate(DateTools.getYear()+""); + }else { + datasQuery.setDate(DateTools.getYearMonth()); + } + } + String dataFormat = ""; + if("年".equals(datasQuery.getFormatType())) { + dataFormat = "%c"; + }else { + dataFormat = "%e"; + } + // 获取创建时间 + List> list = datasMapper.selectCreateTimeList(dataFormat, datasQuery.makeQueryWrapper()); + Map map = TjTools.groupBy(list, "date"); + return WrapMapper.ok(map); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/HiDatasController.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/HiDatasController.java new file mode 100644 index 00000000..f633181d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/controller/HiDatasController.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_main.datas.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author 冯晓东 + * @since 2020-03-23 + */ +@RestController +@RequestMapping("/datas/hi-datas") +public class HiDatasController { + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/dto/DatasQuery.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/dto/DatasQuery.java new file mode 100644 index 00000000..87dca41b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/dto/DatasQuery.java @@ -0,0 +1,63 @@ +package com.ydw.bat.wkflow.business_main.datas.dto; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import com.tmsps.fk.common.util.ChkUtil; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "DatasQuery对象", description = "") +public class DatasQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "表单名称") + private String name; + @ApiModelProperty(value = "操作人员") + private String assigner; + @ApiModelProperty(value = "类型:填写单 or 审批单") + private String type; + @ApiModelProperty(value = "流程分类") + private String category_id; + @ApiModelProperty(value = "表单id") + private String formKid; + @ApiModelProperty(value = "统计时间", example = "年-月 | 年") + private String date; + @ApiModelProperty(value = "统计时间类型: 月 or 年") + private String formatType; + + public Wrapper makeQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ChkUtil.isNotNull(name)) { + queryWrapper.like("FORM_NAME", name); + } + if (ChkUtil.isNotNull(assigner)) { + queryWrapper.eq("ASSIGNER", assigner); + } + if (ChkUtil.isNotNull(type)) { + queryWrapper.eq("TYPE", type); + } + if (ChkUtil.isNotNull(category_id)) { + queryWrapper.eq("CATEGORY_ID", category_id); + } + if(ChkUtil.isNotNull(formKid)) { + queryWrapper.eq("FORM_KID", formKid); + } + if(ChkUtil.isNotNull(date)) { + if("月".equals(formatType)) { + queryWrapper.like("DATE_FORMAT(CREATE_TIME,'%Y-%m')", date); + }else { + queryWrapper.like("DATE_FORMAT(CREATE_TIME,'%Y')", date); + } + } + queryWrapper.orderByDesc("CREATE_TIME"); + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileEO.java new file mode 100644 index 00000000..3c5704a6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileEO.java @@ -0,0 +1,216 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Serializable; +import java.util.Date; + +/** + * 功能:ATT_FILE AttFileEOEntity
+ * 作者:code generator
+ * 日期: 2018-09-07
+ * 版权所有:版权归北京卡达克数据技术中心所有。
+ */ +public class AttFileEO{ + + private static final long serialVersionUID = 1284335706608668758L; + + private static final Logger logger = LoggerFactory.getLogger(AttFileEO.class); + + private String id; + private String fileName; + private String oldFileName; + private String fileSuffix; + private String filePath; + private Integer validFlag; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + + private String tableName; + + private String resId; + + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
+ *

字段列表:

+ *
  • id -> id
  • + *
  • fileName -> file_name
  • + *
  • oldFileName -> old_file_name
  • + *
  • fileSuffix -> file_suffix
  • + *
  • filePath -> file_path
  • + *
  • validFlag -> valid_flag
  • + *
  • creationTime -> creation_time
  • + *
  • modifyTime -> modify_time
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ + return null; + } + switch (fieldName) { + case "id": return "id"; + case "fileName": return "file_name"; + case "oldFileName": return "old_file_name"; + case "fileSuffix": return "file_suffix"; + case "filePath": return "file_path"; + case "validFlag": return "valid_flag"; + case "creationTime": return "creation_time"; + case "modifyTime": return "modify_time"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • file_name -> fileName
  • + *
  • old_file_name -> oldFileName
  • + *
  • file_suffix -> fileSuffix
  • + *
  • file_path -> filePath
  • + *
  • valid_flag -> validFlag
  • + *
  • creation_time -> creationTime
  • + *
  • modify_time -> modifyTime
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ + return null; + } + switch (columnName) { + case "id": return "id"; + case "file_name": return "fileName"; + case "old_file_name": return "oldFileName"; + case "file_suffix": return "fileSuffix"; + case "file_path": return "filePath"; + case "valid_flag": return "validFlag"; + case "creation_time": return "creationTime"; + case "modify_time": return "modifyTime"; + default: return null; + } + } + + /** **/ + public String getId() { + int tableNameIndex = this.id.lastIndexOf("_"); + if(tableNameIndex!= -1){ + String tableName = this.id.substring(0, tableNameIndex); + this.tableName=tableName; + }else{ + logger.error("文件ID格式错误:"+this.id); + } + return this.id; + } + + /** **/ + public void setId(String id) { + if(tableName!=null && !tableName.isEmpty()){ + this.id = tableName+"_"+id; + } + //此处注意保存时表结构是否存在 + this.id=id; + } + + /** **/ + public String getFileName() { + return this.fileName; + } + + /** **/ + public void setFileName(String fileName) { + this.fileName = fileName; + } + + /** **/ + public String getOldFileName() { + return this.oldFileName; + } + + /** **/ + public void setOldFileName(String oldFileName) { + this.oldFileName = oldFileName; + } + + /** **/ + public String getFileSuffix() { + return this.fileSuffix; + } + + /** **/ + public void setFileSuffix(String fileSuffix) { + this.fileSuffix = fileSuffix; + } + + /** **/ + public String getFilePath() { + return this.filePath; + } + + /** **/ + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getTableName() { + if(this.tableName !=null && !this.tableName.isEmpty()){ + return this.tableName; + }else{ + int tableNameIndex = this.id.lastIndexOf("_"); + if(tableNameIndex !=-1){ + String tableName = this.id.substring(0, tableNameIndex); + this.tableName=tableName; + }else{ + logger.error("文件ID格式错误:"+this.id); + } + return this.tableName; + } + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public static long getSerialVersionUID() { + return serialVersionUID; + } + + public String getResId() { + return resId; + } + + public void setResId(String resId) { + this.resId = resId; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileVo.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileVo.java new file mode 100644 index 00000000..58cb00b2 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/AttFileVo.java @@ -0,0 +1,90 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +public class AttFileVo { + + private String id; + private String fileName; + private String oldFileName; + private String fileSuffix; + private String filePath; + private String attId; + + private String name; + //识别文件名中的标准号和名称 + private String standNum; + private String standName; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getOldFileName() { + return oldFileName; + } + + public void setOldFileName(String oldFileName) { + this.oldFileName = oldFileName; + } + + public String getFileSuffix() { + return fileSuffix; + } + + public void setFileSuffix(String fileSuffix) { + this.fileSuffix = fileSuffix; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getName() { + this.name = this.oldFileName; + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public String getAttId() { + this.attId=this.id; + return this.attId; + } + + public void setAttId(String attId) { + this.attId = attId; + } + + public String getStandNum() { + return standNum; + } + + public void setStandNum(String standNum) { + this.standNum = standNum; + } + + public String getStandName() { + return standName; + } + + public void setStandName(String standName) { + this.standName = standName; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusMes.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusMes.java new file mode 100644 index 00000000..56218029 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusMes.java @@ -0,0 +1,114 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +public class BusMes { + + private String userId; + + private String taskId; + + private String json; + + private String taskIds; + + private String pId; + + private String prcType; + + private String createUser; + + private String createUserName; + + public String getDept() { + return dept; + } + + public void setDept(String dept) { + this.dept = dept; + } + + private String dept; + + private String userName; + + private String id; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } + + public String getJson() { + return json; + } + + public void setJson(String json) { + this.json = json; + } + + public String getTaskIds() { + return taskIds; + } + + public void setTaskIds(String taskIds) { + this.taskIds = taskIds; + } + + public String getpId() { + return pId; + } + + public void setpId(String pId) { + this.pId = pId; + } + + public String getCreateUser() { + return createUser; + } + + public void setCreateUser(String createUser) { + this.createUser = createUser; + } + + public String getPrcType() { + return prcType; + } + + public void setPrcType(String prcType) { + this.prcType = prcType; + } + + public String getCreateUserName() { + return createUserName; + } + + public void setCreateUserName(String createUserName) { + this.createUserName = createUserName; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcess.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcess.java new file mode 100644 index 00000000..fd146680 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcess.java @@ -0,0 +1,47 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-11-05 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("BUS_PROCESS") +@ApiModel(value="BusProcess对象", description="") +public class BusProcess implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "ID", type = IdType.UUID) + private String id; + + @TableField("PID") + private String pid; + + @TableField("USERID") + private String userid; + + @TableField("FLAG") + private Integer flag; + + @TableField("SID") + private String sid; + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessEntrust.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessEntrust.java new file mode 100644 index 00000000..e048cb98 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessEntrust.java @@ -0,0 +1,64 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-12-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("BUS_PROCESS_ENTRUST") +@ApiModel(value="BusProcessEntrust对象", description="") +public class BusProcessEntrust implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "ID", type = IdType.UUID) + private String id; + + @ApiModelProperty(value = "委托人员") + @TableField("USER_ID") + private String userId; + + @ApiModelProperty(value = "被委托人员") + @TableField("EN_USER_ID") + private String enUserId; + + @TableField("TASK_ID") + private String taskId; + + @TableField("PRC_ID") + private String prcId; + + @TableField("TASK_NAME") + private String taskName; + + @TableField("PRC_NAME") + private String prcName; + + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis());; + + @TableField("VALID_FLAG") + private String validFlag; + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessName.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessName.java new file mode 100644 index 00000000..c2cd07ab --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessName.java @@ -0,0 +1,91 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-11-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("BUS_PROCESS_NAME") +@ApiModel(value="BusProcessName对象", description="") +public class BusProcessName implements Serializable { + + private static final long serialVersionUID=1L; + + @TableId(value = "ID", type = IdType.UUID) + private String id; + + @TableField("PRC_NAME") + private String prcName; + + @TableField("PRC_ID") + private String prcId; + + @TableField("PRC_MES") + private String prcMes; + + @TableField("OVER_TIME") + private String overTime; + + @TableField("PRC_NUM") + private String prcNum; + + @TableField("CREAT_TIME") + private String creatTime; + + @TableField("CREAT_USER") + private String creatUser; + + @TableField("PRC_TYPE") + private String prcType; + + @TableField("CREATE_USER_NAME") + private String creatUserName; + + @TableField("MES") + private String mes; + + @TableField("END_TIME") + private String endTime; + + @TableField(exist = false) + private String taskIds; + + @TableField(exist = false) + private String taskInfo; + + @TableField(exist = false) + private String taskAssignee; + + @TableField(exist = false) + private String isEnd; + + @TableField(exist = false) + private String taskBackAssignee; + + @TableField(exist = false) + private String acceptTime; + + @TableField(exist = false) + private String endTaskTime; + + @TableField(exist = false) + private String startTaskTime; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessNew.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessNew.java new file mode 100644 index 00000000..2b315f98 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/BusProcessNew.java @@ -0,0 +1,87 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-11-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("BUS_PROCESS_NEW") +@ApiModel(value="BusProcessNew对象", description="") +public class BusProcessNew implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键") + @TableId(value = "ID", type = IdType.UUID) + private String id; + + @ApiModelProperty(value = "资源类型") + @TableField("MSG_TYPE") + private String msgType; + + @ApiModelProperty(value = "标准id") + @TableField("STAND_ID") + private String standId; + + @ApiModelProperty(value = "条款id") + @TableField("CLAUSE_ID") + private String clauseId; + + @ApiModelProperty(value = "处理人") + @TableField("USER_ID") + private String userId; + + @ApiModelProperty(value = "信息") + @TableField("MESG") + private String mesg; + + @ApiModelProperty(value = "节点信息") + @TableField("TASK_INFO") + private String taskInfo; + + @ApiModelProperty(value = "父级id") + @TableField("PARENT_ID") + private String parentId; + + @ApiModelProperty(value = "任务id") + @TableField("TASK_ID") + private String taskId; + + @ApiModelProperty(value = "流程实例id") + @TableField("P_ID") + private String pId; + + @ApiModelProperty(value = "完成注记") + @TableField("FINISH_FLAG") + private String finishFlag; + + @ApiModelProperty(value = "审批意见") + @TableField("COMMIT_FLAG") + private String commitFlag; + + @ApiModelProperty(value = "审批意见") + @TableField("COMMIT_TEXT") + private String commitText; + + @ApiModelProperty(value = "子流程ID") + @TableField("SUB_ID") + private String subId; +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/Datas.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/Datas.java new file mode 100644 index 00000000..1915a1e2 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/Datas.java @@ -0,0 +1,119 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_datas") +@ApiModel(value = "Datas对象", description = "") +public class Datas { + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "流程实例ID") + @TableField("ACTI_PROC_INST_ID") + private String actiProcInstId; + + @ApiModelProperty(value = "排序") + @TableField("SORTZ") + private int sortz; + + @ApiModelProperty(value = "任务ID") + @TableField("ACTI_TASK_ID") + private String actiTaskId; + + @ApiModelProperty(value = "表单提交json") + @TableField("FORM_JSON") + private String formJson; + + @ApiModelProperty(value = "表单ID") + @TableField("FORM_KID") + private String formKid; + + @ApiModelProperty(value = "表单名称") + @TableField("FORM_NAME") + private String formName; + + @ApiModelProperty(value = "表单的同类标识,从t_form表拷贝而来", example = "同时下发到 人事+财务,人事与财务的审批单互相不可见,通过show_key做标识区分") + @TableField("SHOW_KEY") + private String showKey; + + @ApiModelProperty(value = "类型ID") + @TableField("CATEGORY_ID") + private String categoryId; + + @ApiModelProperty(value = "类型名称") + @TableField("CATEGORY_NAME") + private String categoryName; + + @ApiModelProperty(value = "表单填写Json名称") + @TableField("FORM_VALS_JSON") + private String formValsJson; + + @ApiModelProperty(value = "表单附件json名称") + @TableField("FORM_FILES_JSON") + private String formFilesJson; + + @TableField("REFER_KID") + private String referKid; + + @ApiModelProperty(value = "重置状态:知道同一类表单,表单重置:statuz为 -100") + @TableField("STATUZ") + private int statuz; + + @ApiModelProperty(value = "类型:填写单 or 审批单") + @TableField("TYPE") + private String type; + + @ApiModelProperty(value = "操作人员") + @TableField("ASSIGNER") + private String assigner; + + @ApiModelProperty(value = "表单提交html") + @TableField("HTML") + private String html; + + @ApiModelProperty(value = "表单提交只读 html代码") + @TableField("HTML_READONLY") + private String htmlReadonly; + + @ApiModelProperty(value = "运行类型: html or json") + @TableField("RUN_TYPE") + private String runType; + + @ApiModelProperty(value = "工作流节点id") + @TableField("RESOURCE_ID") + private String resourceId; +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/HiDatas.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/HiDatas.java new file mode 100644 index 00000000..7319d994 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/HiDatas.java @@ -0,0 +1,109 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * 参考 https://www.devdoc.cn/activiti-table-act_ru_variable.html 获取activiti表结构 + *

    + * + * @author 冯晓东 + * @since 2020-03-23 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_hi_datas") +@ApiModel(value="HiDatas对象", description="") +public class HiDatas implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "Datas的id") + @TableField("DATAS_ID") + private String datasId; + + @ApiModelProperty(value = "历史节点表数据") + @TableField("ACT_HI_ACTINST") + private String actHiActinst; + + @ApiModelProperty(value = "历史附件表数据") + @TableField("ACT_HI_ATTACHMENT") + private String actHiAttachment; + + @ApiModelProperty(value = "历史意见表数据") + @TableField("ACT_HI_COMMENT") + private String actHiComment; + + @ApiModelProperty(value = "历史详情表数据") + @TableField("ACT_HI_DETAIL") + private String actHiDetail; + + @ApiModelProperty(value = "历史流程人员表数据") + @TableField("ACT_HI_IDENTITYLINK") + private String actHiIdentitylink; + + @ApiModelProperty(value = "历史流程实例表数据") + @TableField("ACT_HI_PROCINST") + private String actHiProcinst; + + @ApiModelProperty(value = "历史任务实例表数据") + @TableField("ACT_HI_TASKINST") + private String actHiTaskinst; + + @ApiModelProperty(value = "历史变量表数据") + @TableField("ACT_HI_VARINST") + private String actHiVarinst; + + @ApiModelProperty(value = "throwEvent、catchEvent时间监听信息表数据") + @TableField("ACT_RU_EVENT_SUBSCR") + private String actRuEventSubscr; + + @ApiModelProperty(value = "运行时流程执行实例表数据") + @TableField("ACT_RU_EXECUTION") + private String actRuExecution; + + @ApiModelProperty(value = "运行时流程人员表数据") + @TableField("ACT_RU_IDENTITYLINK") + private String actRuIdentitylink; + + @ApiModelProperty(value = "运行时定时任务数据表数据") + @TableField("ACT_RU_JOB") + private String actRuJob; + + @ApiModelProperty(value = "运行时任务节点表数据") + @TableField("ACT_RU_TASK") + private String actRuTask; + + @ApiModelProperty(value = "运行时流程变量数据表数据") + @TableField("ACT_RU_VARIABLE") + private String actRuVariable; + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/MenuEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/MenuEO.java new file mode 100644 index 00000000..b1a62b54 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/MenuEO.java @@ -0,0 +1,178 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + + +import java.util.Date; + +/** + * 功能:TS_MENU MenuEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class MenuEO{ + + private static final long serialVersionUID = 2497292638985614077L; + + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private String remarks; + private String permission; + private Integer isShow; + private String icon; + private String href; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • remarks -> remarks
  • + *
  • permission -> permission
  • + *
  • isShow -> is_show
  • + *
  • icon -> icon
  • + *
  • href -> href
  • + *
  • parentIds -> parent_ids
  • + *
  • parentId -> parent_id
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "remarks": return "remarks"; + case "permission": return "permission"; + case "isShow": return "is_show"; + case "icon": return "icon"; + case "href": return "href"; + case "parentIds": return "parent_ids"; + case "parentId": return "parent_id"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • remarks -> remarks
  • + *
  • permission -> permission
  • + *
  • is_show -> isShow
  • + *
  • icon -> icon
  • + *
  • href -> href
  • + *
  • parent_ids -> parentIds
  • + *
  • parent_id -> parentId
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "remarks": return "remarks"; + case "permission": return "permission"; + case "is_show": return "isShow"; + case "icon": return "icon"; + case "href": return "href"; + case "parent_ids": return "parentIds"; + case "parent_id": return "parentId"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getRemarks() { + return this.remarks; + } + + /** **/ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** **/ + public String getPermission() { + return this.permission; + } + + /** **/ + public void setPermission(String permission) { + this.permission = permission; + } + + /** **/ + public Integer getIsShow() { + return this.isShow; + } + + /** **/ + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + + /** **/ + public String getIcon() { + return this.icon; + } + + /** **/ + public void setIcon(String icon) { + this.icon = icon; + } + + /** **/ + public String getHref() { + return this.href; + } + + /** **/ + public void setHref(String href) { + this.href = href; + } + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/OrgEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/OrgEO.java new file mode 100644 index 00000000..add2a791 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/OrgEO.java @@ -0,0 +1,300 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; + +/** + * 功能:TS_ORG OrgEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class OrgEO { + + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private Integer isShow; + private String parentIds; + private String pId; + private String shotName; + private String remarks; + private Integer orgDesc; + private String orgType; + private String orgCode; + private String orgName; + private String id; + + //补充字段 + private String ssoId; + private String ssoOrgId; + private String userName; + private String usId; + private String roleId; + private String roleName; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • isShow -> is_show
  • + *
  • parentIds -> parent_ids
  • + *
  • parentId -> parent_id
  • + *
  • shotName -> shot_name
  • + *
  • remarks -> remarks
  • + *
  • orgDesc -> org_desc
  • + *
  • orgType -> org_type
  • + *
  • orgCode -> org_code
  • + *
  • orgName -> org_name
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "isShow": return "is_show"; + case "parentIds": return "parent_ids"; + case "parentId": return "parent_id"; + case "shotName": return "shot_name"; + case "remarks": return "remarks"; + case "orgDesc": return "org_desc"; + case "orgType": return "org_type"; + case "orgCode": return "org_code"; + case "orgName": return "org_name"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • is_show -> isShow
  • + *
  • parent_ids -> parentIds
  • + *
  • parent_id -> parentId
  • + *
  • shot_name -> shotName
  • + *
  • remarks -> remarks
  • + *
  • org_desc -> orgDesc
  • + *
  • org_type -> orgType
  • + *
  • org_code -> orgCode
  • + *
  • org_name -> orgName
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "is_show": return "isShow"; + case "parent_ids": return "parentIds"; + case "parent_id": return "parentId"; + case "shot_name": return "shotName"; + case "remarks": return "remarks"; + case "org_desc": return "orgDesc"; + case "org_type": return "orgType"; + case "org_code": return "orgCode"; + case "org_name": return "orgName"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + if(modifyTime==null){ + return new Date(); + }else{ + return this.modifyTime; + } + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + if(creationTime == null){ + return new Date(); + }else{ + return this.creationTime; + } + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Integer getIsShow() { + return this.isShow; + } + + /** **/ + public void setIsShow(Integer isShow) { + this.isShow = isShow; + } + + /** **/ + public String getParentIds() { + return this.parentIds; + } + + /** **/ + public void setParentIds(String parentIds) { + this.parentIds = parentIds; + } + + + public String getpId() { + return pId; + } + + public void setpId(String pId) { + this.pId = pId; + } + + /** **/ + public String getShotName() { + return this.shotName; + } + + /** **/ + public void setShotName(String shotName) { + this.shotName = shotName; + } + + /** **/ + public String getRemarks() { + return this.remarks; + } + + /** **/ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** **/ + public Integer getOrgDesc() { + return this.orgDesc; + } + + /** **/ + public void setOrgDesc(Integer orgDesc) { + this.orgDesc = orgDesc; + } + + /** **/ + public String getOrgType() { + return this.orgType; + } + + /** **/ + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + /** **/ + public String getOrgCode() { + return this.orgCode; + } + + /** **/ + public void setOrgCode(String orgCode) { + this.orgCode = orgCode; + } + + /** **/ + public String getOrgName() { + return this.orgName; + } + + /** **/ + public void setOrgName(String orgName) { + this.orgName = orgName; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + + public String getSsoId() { + return ssoId; + } + + public void setSsoId(String ssoId) { + this.ssoId = ssoId; + } + + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getUsId() { + return usId; + } + + public void setUsId(String usId) { + this.usId = usId; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } + + public String getRoleName() { + return roleName; + } + + public void setRoleName(String roleName) { + this.roleName = roleName; + } + + public String getSsoOrgId() { + return ssoOrgId; + } + + public void setSsoOrgId(String ssoOrgId) { + this.ssoOrgId = ssoOrgId; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/PersonMsgEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/PersonMsgEO.java new file mode 100644 index 00000000..afff1816 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/PersonMsgEO.java @@ -0,0 +1,240 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:TS_PERSON_MSG PersonMsgEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class PersonMsgEO{ + + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + //@org.springframework.format.annotation.DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private Integer readFlag; + private String msgContent; + private String msgTitle; + private String userId; + private String id; + private String userIds; + + // 发送预警判断是否出现在产品中时使用 + private String warningId; + private String warningType; + + // 与流程相关,流程编号 + private String processnum; + + //消息类型 + private String msgType; + //业务id + private String busiId; + //消息结果 + private String msgResult; + //返回地址 + private String returnAddress; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • readFlag -> read_flag
  • + *
  • msgContent -> msg_content
  • + *
  • msgTitle -> msg_title
  • + *
  • userId -> user_id
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "readFlag": return "read_flag"; + case "msgContent": return "msg_content"; + case "msgTitle": return "msg_title"; + case "userId": return "user_id"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • read_flag -> readFlag
  • + *
  • msg_content -> msgContent
  • + *
  • msg_title -> msgTitle
  • + *
  • user_id -> userId
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "read_flag": return "readFlag"; + case "msg_content": return "msgContent"; + case "msg_title": return "msgTitle"; + case "user_id": return "userId"; + case "id": return "id"; + default: return null; + } + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Integer getReadFlag() { + return this.readFlag; + } + + /** **/ + public void setReadFlag(Integer readFlag) { + this.readFlag = readFlag; + } + + /** **/ + public String getMsgContent() { + return this.msgContent; + } + + /** **/ + public void setMsgContent(String msgContent) { + this.msgContent = msgContent; + } + + public String getMsgTitle() { + return msgTitle; + } + + public void setMsgTitle(String msgTitle) { + this.msgTitle = msgTitle; + } + + /** **/ + public String getUserId() { + return this.userId; + } + + /** **/ + public void setUserId(String userId) { + this.userId = userId; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public String getWarningId() { + return warningId; + } + + public void setWarningId(String warningId) { + this.warningId = warningId; + } + + public String getWarningType() { + return warningType; + } + + public void setWarningType(String warningType) { + this.warningType = warningType; + } + + public String getProcessnum() { + return processnum; + } + + public void setProcessnum(String processnum) { + this.processnum = processnum; + } + + public String getMsgType() { + return msgType; + } + + public void setMsgType(String msgType) { + this.msgType = msgType; + } + + public String getBusiId() { + return busiId; + } + + public void setBusiId(String busiId) { + this.busiId = busiId; + } + + public String getMsgResult() { + return msgResult; + } + + public void setMsgResult(String msgResult) { + this.msgResult = msgResult; + } + + public String getReturnAddress() { + return returnAddress; + } + + public void setReturnAddress(String returnAddress) { + this.returnAddress = returnAddress; + } + + public String getUserIds() { + return userIds; + } + + public void setUserIds(String userIds) { + this.userIds = userIds; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/ResponseMessage.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/ResponseMessage.java new file mode 100644 index 00000000..4291a09a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/ResponseMessage.java @@ -0,0 +1,58 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + + + public class ResponseMessage { + private String respCode; + private String respMsg; + private T data; + private boolean ok; + + public ResponseMessage() { + } + + public ResponseMessage(String respCode, String message) { + this.respCode = respCode; + this.respMsg = message; + } + + public ResponseMessage(String respCode, String message, boolean ok) { + this.respCode = respCode; + this.respMsg = message; + this.ok = ok; + } + + public ResponseMessage(String respCode, String message, boolean ok, T data) { + this.respCode = respCode; + this.respMsg = message; + this.ok = ok; + this.data = data; + } + + public String getRespCode() { + return this.respCode; + } + + public void setRespCode(String respCode) { + this.respCode = respCode; + } + + public String getMessage() { + return this.respMsg; + } + + public void setMessage(String message) { + this.respMsg = message; + } + + public T getData() { + return this.data; + } + + public void setData(T data) { + this.data = data; + } + + public boolean isOk() { + return this.ok; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/RoleEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/RoleEO.java new file mode 100644 index 00000000..eea94aa8 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/RoleEO.java @@ -0,0 +1,299 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 功能:TS_ROLE RoleEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class RoleEO{ + + private static final long serialVersionUID = -1386892031737294731L; + + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private Integer validFlag; + private String operUser; + private String extInfo; + private String remarks; + private Integer isDefault; + private Integer useFlag; + private String roleType; + private String name; + private String id; + + private String operUserName; + + private List menuEOList = new ArrayList<>(); + private List menuEOIdList = new ArrayList<>(); + + private String orgUseName; + + private Integer disableFlag; + + private Integer unlockFlag; + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • operUser -> oper_user
  • + *
  • extInfo -> ext_info
  • + *
  • remarks -> remarks
  • + *
  • isDefault -> is_default
  • + *
  • useFlag -> use_flag
  • + *
  • roleType -> role_type
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "disableFlag": return "disable_flag"; + case "unlockFlag": return "unlock_flag"; + case "operUser": return "oper_user"; + case "extInfo": return "ext_info"; + case "remarks": return "remarks"; + case "isDefault": return "is_default"; + case "useFlag": return "use_flag"; + case "roleType": return "role_type"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • oper_user -> operUser
  • + *
  • ext_info -> extInfo
  • + *
  • remarks -> remarks
  • + *
  • is_default -> isDefault
  • + *
  • use_flag -> useFlag
  • + *
  • role_type -> roleType
  • + *
  • name -> name
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "disable_flag": return "disableFlag"; + case "unlock_flag": return "unlockFlag"; + case "oper_user": return "operUser"; + case "ext_info": return "extInfo"; + case "remarks": return "remarks"; + case "is_default": return "isDefault"; + case "use_flag": return "useFlag"; + case "role_type": return "roleType"; + case "name": return "name"; + case "id": return "id"; + default: return null; + } + } + public RoleEO(){} + public RoleEO(Date modifyTime, Date creationTime, Integer validFlag, String operUser, String extInfo, String remarks, Integer isDefault, Integer useFlag, String roleType, String name, String id, List menuEOList, List menuEOIdList, Integer disableFlag, Integer unlockFlag) { + this.modifyTime = modifyTime; + this.creationTime = creationTime; + this.validFlag = validFlag; + this.operUser = operUser; + this.extInfo = extInfo; + this.remarks = remarks; + this.isDefault = isDefault; + this.useFlag = useFlag; + this.roleType = roleType; + this.name = name; + this.id = id; + this.menuEOList = menuEOList; + this.menuEOIdList = menuEOIdList; + this.disableFlag=disableFlag; + this.unlockFlag=unlockFlag; + } + + /** **/ + public Date getModifyTime() { + if(modifyTime==null){ + return new Date(); + }else{ + return this.modifyTime; + } + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Date getCreationTime() { + if(creationTime == null){ + return new Date(); + }else{ + return this.creationTime; + } + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getOperUser() { + return this.operUser; + } + + /** **/ + public void setOperUser(String operUser) { + this.operUser = operUser; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + /** **/ + public String getRemarks() { + return this.remarks; + } + + /** **/ + public void setRemarks(String remarks) { + this.remarks = remarks; + } + + /** **/ + public Integer getIsDefault() { + return this.isDefault; + } + + /** **/ + public void setIsDefault(Integer isDefault) { + this.isDefault = isDefault; + } + + /** **/ + public Integer getUseFlag() { + return this.useFlag; + } + + /** **/ + public void setUseFlag(Integer useFlag) { + this.useFlag = useFlag; + } + + /** **/ + public String getRoleType() { + return this.roleType; + } + + /** **/ + public void setRoleType(String roleType) { + this.roleType = roleType; + } + + /** **/ + public String getName() { + return this.name; + } + + /** **/ + public void setName(String name) { + this.name = name; + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + public List getMenuEOList() { + return menuEOList; + } + + public void setMenuEOList(List menuEOList) { + this.menuEOList = menuEOList; + } + + public List getMenuEOIdList() { + return menuEOIdList; + } + + public void setMenuEOIdList(List menuEOIdList) { + this.menuEOIdList = menuEOIdList; + } + + public RoleEO(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public String getOperUserName() { + return operUserName; + } + + public void setOperUserName(String operUserName) { + this.operUserName = operUserName; + } + + public void setOrgUseName(String orgUseName) { + this.orgUseName =orgUseName; + } + + public String getOrgUseName(){ + return this.orgUseName; + } + + public void setDisableFlag(Integer disableFlag){ + this.disableFlag=disableFlag; + } + + public Integer getDisableFlag(){ + return this.disableFlag; + } + + public void setUnlockFlag(Integer unlockFlag){ + this.unlockFlag=unlockFlag; + } + + public Integer getUnlockFlag(){ + return this.unlockFlag; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussStandPlanEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussStandPlanEO.java new file mode 100644 index 00000000..dccc394a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussStandPlanEO.java @@ -0,0 +1,627 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; +import java.util.List; + +/** + * 功能:SAR_BUSS_STAND_PLAN SarBussStandPlanEOEntity
    + * 作者:code generator
    + * 日期: 2020-11-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class SarBussStandPlanEO{ + + private String id; + private String standCode;//标准编号 + private String replacedStandNum;//被代替标准编号 + private String planType;//计划类型 + private String planStatus;//计划状态 + private String cnName;//中文名称 + private String enName;//英文名称 + private String standSort;//标准类别 + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date planStartTime;// 计划开始时间 + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date planEndTime;// 计划结束时间 + private String compilersUser;//标准起草组组员 + private String standLevel;//标准密级 + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date putTime;//发布时间 + private String compileUnit;//涉及的会签部门 + private String planSource;//标准制修订来源 + private String planReason;//制修订原因 + private String testWork;//验证工作 + private String planImpact;//项目影响 + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + private Integer validFlag; + private String planReasonFile;//标准制修订来源附件 + private String testWorkFile;//制修订原因附件 + private String planImpactFile;//验证工作附件 + + private List planReasonFileList; + private List testWorkFileList; + private List planImpactFileLis; + //用来显示的 + private String standSortShow; + private String compilersUserName; + private String standLevelShow; + private String compileUnitName; + private String planSourceShow; + private String type; + //新加字段 + private String draftUser;//起草人 + private String draftingUnit;//起草单位 + private String draftUserName; + private String draftingUnitName; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date actualEndTime;//实际结束时间 + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • standCode -> stand_code
  • + *
  • replacedStandNum -> replaced_stand_num
  • + *
  • planType -> plan_type
  • + *
  • cnName -> cn_name
  • + *
  • enName -> en_name
  • + *
  • standSort -> stand_sort
  • + *
  • planStartTime -> plan_start_time
  • + *
  • planEndTime -> plan_end_time
  • + *
  • compilersUser -> compilers_user
  • + *
  • standLevel -> stand_level
  • + *
  • putTime -> put_time
  • + *
  • compileUnit -> compile_unit
  • + *
  • planSource -> plan_source
  • + *
  • planReason -> plan_reason
  • + *
  • testWork -> test_work
  • + *
  • planImpact -> plan_impact
  • + *
  • creationTime -> creation_time
  • + *
  • modifyTime -> modify_time
  • + *
  • validFlag -> valid_flag
  • + *
  • planReasonFile -> plan_reason_file
  • + *
  • testWorkFile -> test_work_file
  • + *
  • planImpactFile -> plan_impact_file
  • + *
  • planStatus -> plan_status
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null) return null; + switch (fieldName) { + case "id": + return "id"; + case "standCode": + return "stand_code"; + case "replacedStandNum": + return "replaced_stand_num"; + case "planType": + return "plan_type"; + case "cnName": + return "cn_name"; + case "enName": + return "en_name"; + case "standSort": + return "stand_sort"; + case "planStartTime": + return "plan_start_time"; + case "planEndTime": + return "plan_end_time"; + case "compilersUser": + return "compilers_user"; + case "standLevel": + return "stand_level"; + case "putTime": + return "put_time"; + case "compileUnit": + return "compile_unit"; + case "planSource": + return "plan_source"; + case "planReason": + return "plan_reason"; + case "testWork": + return "test_work"; + case "planImpact": + return "plan_impact"; + case "creationTime": + return "creation_time"; + case "modifyTime": + return "modify_time"; + case "validFlag": + return "valid_flag"; + case "planReasonFile": + return "plan_reason_file"; + case "testWorkFile": + return "test_work_file"; + case "planImpactFile": + return "plan_impact_file"; + case "planStatus": + return "plan_status"; + case "draftUser": + return "draft_user"; + case "draftingUnit": + return "drafting_unit"; + case "actualEndTime": + return "actual_end_time"; + default: + return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • stand_code -> standCode
  • + *
  • replaced_stand_num -> replacedStandNum
  • + *
  • plan_type -> planType
  • + *
  • cn_name -> cnName
  • + *
  • en_name -> enName
  • + *
  • stand_sort -> standSort
  • + *
  • plan_start_time -> planStartTime
  • + *
  • plan_end_time -> planEndTime
  • + *
  • compilers_user -> compilersUser
  • + *
  • stand_level -> standLevel
  • + *
  • put_time -> putTime
  • + *
  • compile_unit -> compileUnit
  • + *
  • plan_source -> planSource
  • + *
  • plan_reason -> planReason
  • + *
  • test_work -> testWork
  • + *
  • plan_impact -> planImpact
  • + *
  • creation_time -> creationTime
  • + *
  • modify_time -> modifyTime
  • + *
  • valid_flag -> validFlag
  • + *
  • plan_reason_file -> planReasonFile
  • + *
  • test_work_file -> testWorkFile
  • + *
  • plan_impact_file -> planImpactFile
  • + *
  • plan_status -> planStatus
  • + */ + public static String columnToField(String columnName) { + if (columnName == null) return null; + switch (columnName) { + case "id": + return "id"; + case "stand_code": + return "standCode"; + case "replaced_stand_num": + return "replacedStandNum"; + case "plan_type": + return "planType"; + case "cn_name": + return "cnName"; + case "en_name": + return "enName"; + case "stand_sort": + return "standSort"; + case "plan_start_time": + return "planStartTime"; + case "plan_end_time": + return "planEndTime"; + case "compilers_user": + return "compilersUser"; + case "stand_level": + return "standLevel"; + case "put_time": + return "putTime"; + case "compile_unit": + return "compileUnit"; + case "plan_source": + return "planSource"; + case "plan_reason": + return "planReason"; + case "test_work": + return "testWork"; + case "plan_impact": + return "planImpact"; + case "creation_time": + return "creationTime"; + case "modify_time": + return "modifyTime"; + case "valid_flag": + return "validFlag"; + case "plan_reason_file": + return "planReasonFile"; + case "test_work_file": + return "testWorkFile"; + case "plan_impact_file": + return "planImpactFile"; + case "plan_status": + return "planStatus"; + case "draft_user": + return "draftUser"; + case "drafting_unit": + return "draftingUnit"; + case "actual_end_time": + return "actualEndTime"; + default: + return null; + } + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + /** **/ + public String getStandCode() { + return this.standCode; + } + + /** **/ + public void setStandCode(String standCode) { + this.standCode = standCode; + } + + /** **/ + public String getReplacedStandNum() { + return this.replacedStandNum; + } + + /** **/ + public void setReplacedStandNum(String replacedStandNum) { + this.replacedStandNum = replacedStandNum; + } + + /** **/ + public String getPlanType() { + return this.planType; + } + + /** **/ + public void setPlanType(String planType) { + this.planType = planType; + } + + /** **/ + public String getCnName() { + return this.cnName; + } + + /** + * + **/ + public void setCnName(String cnName) { + this.cnName = cnName; + } + + /** **/ + public String getEnName() { + return this.enName; + } + + /** + * + **/ + public void setEnName(String enName) { + this.enName = enName; + } + + /** + * + **/ + public String getStandSort() { + return this.standSort; + } + + /** + * + **/ + public void setStandSort(String standSort) { + this.standSort = standSort; + } + + /** + * + **/ + public Date getPlanStartTime() { + return this.planStartTime; + } + + /** + * + **/ + public void setPlanStartTime(Date planStartTime) { + this.planStartTime = planStartTime; + } + + /** + * + **/ + public Date getPlanEndTime() { + return this.planEndTime; + } + + /** + * + **/ + public void setPlanEndTime(Date planEndTime) { + this.planEndTime = planEndTime; + } + + /** + * + **/ + public String getCompilersUser() { + return this.compilersUser; + } + + /** + * + **/ + public void setCompilersUser(String compilersUser) { + this.compilersUser = compilersUser; + } + + /** + * + **/ + public String getStandLevel() { + return this.standLevel; + } + + /** + * + **/ + public void setStandLevel(String standLevel) { + this.standLevel = standLevel; + } + + /** **/ + public Date getPutTime() { + return this.putTime; + } + + /** **/ + public void setPutTime(Date putTime) { + this.putTime = putTime; + } + + /** + * + **/ + public String getCompileUnit() { + return this.compileUnit; + } + + /** + * + **/ + public void setCompileUnit(String compileUnit) { + this.compileUnit = compileUnit; + } + + /** + * + **/ + public String getPlanSource() { + return this.planSource; + } + + /** + * + **/ + public void setPlanSource(String planSource) { + this.planSource = planSource; + } + + /** **/ + public String getPlanReason() { + return this.planReason; + } + + /** **/ + public void setPlanReason(String planReason) { + this.planReason = planReason; + } + + /** **/ + public String getTestWork() { + return this.testWork; + } + + /** **/ + public void setTestWork(String testWork) { + this.testWork = testWork; + } + + /** **/ + public String getPlanImpact() { + return this.planImpact; + } + + /** **/ + public void setPlanImpact(String planImpact) { + this.planImpact = planImpact; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Integer getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public String getPlanReasonFile() { + return this.planReasonFile; + } + + /** **/ + public void setPlanReasonFile(String planReasonFile) { + this.planReasonFile = planReasonFile; + } + + /** **/ + public String getTestWorkFile() { + return this.testWorkFile; + } + + /** **/ + public void setTestWorkFile(String testWorkFile) { + this.testWorkFile = testWorkFile; + } + + /** **/ + public String getPlanImpactFile() { + return this.planImpactFile; + } + + /** **/ + public void setPlanImpactFile(String planImpactFile) { + this.planImpactFile = planImpactFile; + } + + /** **/ + public String getPlanStatus() { + return this.planStatus; + } + + /** **/ + public void setPlanStatus(String planStatus) { + this.planStatus = planStatus; + } + + public String getStandSortShow() { + return standSortShow; + } + + public void setStandSortShow(String standSortShow) { + this.standSortShow = standSortShow; + } + + public String getCompilersUserName() { + return compilersUserName; + } + + public void setCompilersUserName(String compilersUserName) { + this.compilersUserName = compilersUserName; + } + + public String getStandLevelShow() { + return standLevelShow; + } + + public void setStandLevelShow(String standLevelShow) { + this.standLevelShow = standLevelShow; + } + + public String getCompileUnitName() { + return compileUnitName; + } + + public void setCompileUnitName(String compileUnitName) { + this.compileUnitName = compileUnitName; + } + + public List getPlanReasonFileList() { + return planReasonFileList; + } + + public void setPlanReasonFileList(List planReasonFileList) { + this.planReasonFileList = planReasonFileList; + } + + public List getTestWorkFileList() { + return testWorkFileList; + } + + public void setTestWorkFileList(List testWorkFileList) { + this.testWorkFileList = testWorkFileList; + } + + public List getPlanImpactFileLis() { + return planImpactFileLis; + } + + public void setPlanImpactFileLis(List planImpactFileLis) { + this.planImpactFileLis = planImpactFileLis; + } + + public String getPlanSourceShow() { + return planSourceShow; + } + + public void setPlanSourceShow(String planSourceShow) { + this.planSourceShow = planSourceShow; + } + + public String getDraftUser() { + return draftUser; + } + + public void setDraftUser(String draftUser) { + this.draftUser = draftUser; + } + + public String getDraftingUnit() { + return draftingUnit; + } + + public void setDraftingUnit(String draftingUnit) { + this.draftingUnit = draftingUnit; + } + + public Date getActualEndTime() { + return actualEndTime; + } + + public void setActualEndTime(Date actualEndTime) { + this.actualEndTime = actualEndTime; + } + + public String getDraftUserName() { + return draftUserName; + } + + public void setDraftUserName(String draftUserName) { + this.draftUserName = draftUserName; + } + + public String getDraftingUnitName() { + return draftingUnitName; + } + + public void setDraftingUnitName(String draftingUnitName) { + this.draftingUnitName = draftingUnitName; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandEO.java new file mode 100644 index 00000000..34d801a4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandEO.java @@ -0,0 +1,468 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.*; + +/** + * 功能:SAR_BUSSIONESS_STAND SarBussionessStandEOEntity
    + * 作者:code generator
    + * 日期: 2018-09-03
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class SarBussionessStandEO{ + + private String modifyTime; + private String creationTime; + private Integer validFlag; + private String standStatus; + private String replacedStandNum; + private String replaceStandNum; + private String firstPutTime; + private String putTime; + private String issueTime; + private String standEnName; + private String standName; + //标准编码 + private String standCode; + private String id; + //目录ID 非标准信息表中的字段 + private String menuId; + private String menuParentId; + private String standStatusShow; // 标准状态下拉框 --单选 + private String standNatrueShow; + private String standSortShow; + private String applyCountryShow; + private List standFileList = new ArrayList(); + private List opinionFilesList = new ArrayList(); + private List relevanceFileList = new ArrayList(); + private String collectId; + //文件的类型 + private String standFileClassify; + //文件的下载id + private String attId; + //记录是否修改了替代文件号 + private int upReplaceNumFlag; + //记录是否修改了文件号 + private int upNumFlag; + // 数据库新加的字段 + private String applyCountry;//适用国家/地区 + private String standNature;//标准性质 + private String standSort;//标准类别 + private String remark;//备注 + private String standYear;//备注 + private Map attrInfoMap = new LinkedHashMap<>(); //属性表字段与值 + private String sarStandAttrEOStr; //新增修改时属性表信息 + private String fileIds; //全部文件ID + private List attrInfoList = new ArrayList<>(); + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modifyTime -> modify_time
  • + *
  • creationTime -> creation_time
  • + *
  • validFlag -> valid_flag
  • + *
  • putUser -> put_user
  • + *
  • citationUser -> citation_user
  • + *
  • responsibleUnit -> responsible_unit
  • + *
  • standFile -> stand_file
  • + *
  • tags -> tags
  • + *
  • standStatus -> stand_status
  • + *
  • replacedStandNum -> replaced_stand_num
  • + *
  • replaceStandNum -> replace_stand_num
  • + *
  • quoteStand -> quote_stand
  • + *
  • firstPutTime -> first_put_time
  • + *
  • putYear -> put_year
  • + *
  • putTime -> put_time
  • + *
  • issueTime -> issue_time
  • + *
  • energyKind -> energy_kind
  • + *
  • applyArctic -> apply_arctic
  • + *
  • standEnName -> stand_en_name
  • + *
  • standName -> stand_name
  • + *
  • standCode -> stand_code
  • + *
  • classifyCode -> classify_code
  • + *
  • standSubclass -> stand_subclass
  • + *
  • standGenera -> stand_genera
  • + *
  • id -> id
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null){ return null;} + switch (fieldName) { + case "modifyTime": return "modify_time"; + case "creationTime": return "creation_time"; + case "validFlag": return "valid_flag"; + case "putUser": return "put_user"; + case "citationUser": return "citation_user"; + case "responsibleUnit": return "responsible_unit"; + case "standFile": return "stand_file"; + case "tags": return "tags"; + case "standStatus": return "stand_status"; + case "replacedStandNum": return "replaced_stand_num"; + case "replaceStandNum": return "replace_stand_num"; + case "quoteStand": return "quote_stand"; + case "firstPutTime": return "first_put_time"; + case "putYear": return "put_year"; + case "putTime": return "put_time"; + case "issueTime": return "issue_time"; + case "energyKind": return "energy_kind"; + case "applyArctic": return "apply_arctic"; + case "standEnName": return "stand_en_name"; + case "standName": return "stand_name"; + case "standCode": return "stand_code"; + case "classifyCode": return "classify_code"; + case "standSubclass": return "stand_subclass"; + case "standGenera": return "stand_genera"; + case "id": return "id"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • modify_time -> modifyTime
  • + *
  • creation_time -> creationTime
  • + *
  • valid_flag -> validFlag
  • + *
  • put_user -> putUser
  • + *
  • citation_user -> citationUser
  • + *
  • responsible_unit -> responsibleUnit
  • + *
  • stand_file -> standFile
  • + *
  • tags -> tags
  • + *
  • stand_status -> standStatus
  • + *
  • replaced_stand_num -> replacedStandNum
  • + *
  • replace_stand_num -> replaceStandNum
  • + *
  • quote_stand -> quoteStand
  • + *
  • first_put_time -> firstPutTime
  • + *
  • put_year -> putYear
  • + *
  • put_time -> putTime
  • + *
  • issue_time -> issueTime
  • + *
  • energy_kind -> energyKind
  • + *
  • apply_arctic -> applyArctic
  • + *
  • stand_en_name -> standEnName
  • + *
  • stand_name -> standName
  • + *
  • stand_code -> standCode
  • + *
  • classify_code -> classifyCode
  • + *
  • stand_subclass -> standSubclass
  • + *
  • stand_genera -> standGenera
  • + *
  • id -> id
  • + */ + public static String columnToField(String columnName) { + if (columnName == null){ return null;} + switch (columnName) { + case "modify_time": return "modifyTime"; + case "creation_time": return "creationTime"; + case "valid_flag": return "validFlag"; + case "put_user": return "putUser"; + case "citation_user": return "citationUser"; + case "responsible_unit": return "responsibleUnit"; + case "stand_file": return "standFile"; + case "tags": return "tags"; + case "stand_status": return "standStatus"; + case "replaced_stand_num": return "replacedStandNum"; + case "replace_stand_num": return "replaceStandNum"; + case "quote_stand": return "quoteStand"; + case "first_put_time": return "firstPutTime"; + case "put_year": return "putYear"; + case "put_time": return "putTime"; + case "issue_time": return "issueTime"; + case "energy_kind": return "energyKind"; + case "apply_arctic": return "applyArctic"; + case "stand_en_name": return "standEnName"; + case "stand_name": return "standName"; + case "stand_code": return "standCode"; + case "classify_code": return "classifyCode"; + case "stand_subclass": return "standSubclass"; + case "stand_genera": return "standGenera"; + case "id": return "id"; + default: return null; + } + } + + public String getModifyTime() { + return modifyTime; + } + + public void setModifyTime(String modifyTime) { + this.modifyTime = modifyTime; + } + + public String getCreationTime() { + return creationTime; + } + + public void setCreationTime(String creationTime) { + this.creationTime = creationTime; + } + + public String getPutTime() { + return putTime; + } + + public void setPutTime(String putTime) { + this.putTime = putTime; + } + + public Integer getValidFlag() { + return validFlag; + } + + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public String getStandStatus() { + return standStatus; + } + + public void setStandStatus(String standStatus) { + this.standStatus = standStatus; + } + + public String getReplacedStandNum() { + return replacedStandNum; + } + + public void setReplacedStandNum(String replacedStandNum) { + this.replacedStandNum = replacedStandNum; + } + + public String getReplaceStandNum() { + return replaceStandNum; + } + + public void setReplaceStandNum(String replaceStandNum) { + this.replaceStandNum = replaceStandNum; + } + + public String getFirstPutTime() { + return firstPutTime; + } + + public void setFirstPutTime(String firstPutTime) { + this.firstPutTime = firstPutTime; + } + + public String getIssueTime() { + return issueTime; + } + + public void setIssueTime(String issueTime) { + this.issueTime = issueTime; + } + + public String getStandEnName() { + return standEnName; + } + + public void setStandEnName(String standEnName) { + this.standEnName = standEnName; + } + + public String getStandName() { + return standName; + } + + public void setStandName(String standName) { + this.standName = standName; + } + + public String getStandCode() { + return standCode; + } + + public void setStandCode(String standCode) { + this.standCode = standCode; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getMenuId() { + return menuId; + } + + public void setMenuId(String menuId) { + this.menuId = menuId; + } + + public String getMenuParentId() { + return menuParentId; + } + + public void setMenuParentId(String menuParentId) { + this.menuParentId = menuParentId; + } + + public String getStandStatusShow() { + return standStatusShow; + } + + public void setStandStatusShow(String standStatusShow) { + this.standStatusShow = standStatusShow; + } + + public String getStandNatrueShow() { + return standNatrueShow; + } + + public void setStandNatrueShow(String standNatrueShow) { + this.standNatrueShow = standNatrueShow; + } + + public String getStandSortShow() { + return standSortShow; + } + + public void setStandSortShow(String standSortShow) { + this.standSortShow = standSortShow; + } + + public String getApplyCountryShow() { + return applyCountryShow; + } + + public void setApplyCountryShow(String applyCountryShow) { + this.applyCountryShow = applyCountryShow; + } + + public List getStandFileList() { + return standFileList; + } + + public void setStandFileList(List standFileList) { + this.standFileList = standFileList; + } + + public List getOpinionFilesList() { + return opinionFilesList; + } + + public void setOpinionFilesList(List opinionFilesList) { + this.opinionFilesList = opinionFilesList; + } + + public List getRelevanceFileList() { + return relevanceFileList; + } + + public void setRelevanceFileList(List relevanceFileList) { + this.relevanceFileList = relevanceFileList; + } + + public String getCollectId() { + return collectId; + } + + public void setCollectId(String collectId) { + this.collectId = collectId; + } + + public String getStandFileClassify() { + return standFileClassify; + } + + public void setStandFileClassify(String standFileClassify) { + this.standFileClassify = standFileClassify; + } + + public String getAttId() { + return attId; + } + + public void setAttId(String attId) { + this.attId = attId; + } + + public int getUpReplaceNumFlag() { + return upReplaceNumFlag; + } + + public void setUpReplaceNumFlag(int upReplaceNumFlag) { + this.upReplaceNumFlag = upReplaceNumFlag; + } + + public int getUpNumFlag() { + return upNumFlag; + } + + public void setUpNumFlag(int upNumFlag) { + this.upNumFlag = upNumFlag; + } + + public String getApplyCountry() { + return applyCountry; + } + + public void setApplyCountry(String applyCountry) { + this.applyCountry = applyCountry; + } + + public String getStandNature() { + return standNature; + } + + public void setStandNature(String standNature) { + this.standNature = standNature; + } + + public String getStandSort() { + return standSort; + } + + public void setStandSort(String standSort) { + this.standSort = standSort; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public String getStandYear() { + return standYear; + } + + public void setStandYear(String standYear) { + this.standYear = standYear; + } + + public Map getAttrInfoMap() { + return attrInfoMap; + } + + public void setAttrInfoMap(Map attrInfoMap) { + this.attrInfoMap = attrInfoMap; + } + + public String getSarStandAttrEOStr() { + return sarStandAttrEOStr; + } + + public void setSarStandAttrEOStr(String sarStandAttrEOStr) { + this.sarStandAttrEOStr = sarStandAttrEOStr; + } + + public String getFileIds() { + return fileIds; + } + + public void setFileIds(String fileIds) { + this.fileIds = fileIds; + } + + public List getAttrInfoList() { + return attrInfoList; + } + + public void setAttrInfoList(List attrInfoList) { + this.attrInfoList = attrInfoList; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandStateEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandStateEO.java new file mode 100644 index 00000000..3300c174 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarBussionessStandStateEO.java @@ -0,0 +1,60 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/10 15:07 + * @Version 1.0 + */ +public class SarBussionessStandStateEO{ + + private String id; + private String standName; + private String standCode; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date reviewTime; + private Integer reviewResults; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getStandName() { + return standName; + } + + public void setStandName(String standName) { + this.standName = standName; + } + + public String getStandCode() { + return standCode; + } + + public void setStandCode(String standCode) { + this.standCode = standCode; + } + + public Date getReviewTime() { + return reviewTime; + } + + public void setReviewTime(Date reviewTime) { + this.reviewTime = reviewTime; + } + + public Integer getReviewResults() { + return reviewResults; + } + + public void setReviewResults(Integer reviewResults) { + this.reviewResults = reviewResults; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarStandAttrDetailsEO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarStandAttrDetailsEO.java new file mode 100644 index 00000000..f9c20d79 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/SarStandAttrDetailsEO.java @@ -0,0 +1,285 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.Date; + +/** + * 功能:SAR_STAND_ATTR_DETAILS SarStandAttrDetailsEOEntity
    + * 作者:code generator
    + * 日期: 2020-08-17
    + * 版权所有:版权归北京卡达克数据技术中心所有。
    + */ +public class SarStandAttrDetailsEO{ + + private String id; + private String attrField; + private String attrName; + private String attrType; + private Long orderNum; + private String isEdit; + private String creationUser; + private String validFlag; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private Date creationTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + private Date modifyTime; + private Long attrLen; + private String attrValue; + private String isMust; + private String isShowImp; + private String showRegionId; + private String selVal; + private String sarType; + private String isSearch; + private String isWarn; + private String areaName; + + /** + * java字段名转换为原始数据库列名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • attrField -> attr_field
  • + *
  • attrName -> attr_name
  • + *
  • attrType -> attr_type
  • + *
  • orderNum -> order_num
  • + *
  • isEdit -> is_edit
  • + *
  • creationUser -> creation_user
  • + *
  • validFlag -> valid_flag
  • + *
  • creationTime -> creation_time
  • + *
  • modifyTime -> modify_time
  • + *
  • attrLen -> attr_len
  • + */ + public static String fieldToColumn(String fieldName) { + if (fieldName == null) return null; + switch (fieldName) { + case "id": return "id"; + case "attrField": return "attr_field"; + case "attrName": return "attr_name"; + case "attrType": return "attr_type"; + case "orderNum": return "order_num"; + case "isEdit": return "is_edit"; + case "creationUser": return "creation_user"; + case "validFlag": return "valid_flag"; + case "creationTime": return "creation_time"; + case "modifyTime": return "modify_time"; + case "attrLen": return "attr_len"; + default: return null; + } + } + + /** + * 原始数据库列名转换为java字段名。如果不存在则返回null
    + *

    字段列表:

    + *
  • id -> id
  • + *
  • attr_field -> attrField
  • + *
  • attr_name -> attrName
  • + *
  • attr_type -> attrType
  • + *
  • order_num -> orderNum
  • + *
  • is_edit -> isEdit
  • + *
  • creation_user -> creationUser
  • + *
  • valid_flag -> validFlag
  • + *
  • creation_time -> creationTime
  • + *
  • modify_time -> modifyTime
  • + *
  • attr_len -> attrLen
  • + */ + public static String columnToField(String columnName) { + if (columnName == null) return null; + switch (columnName) { + case "id": return "id"; + case "attr_field": return "attrField"; + case "attr_name": return "attrName"; + case "attr_type": return "attrType"; + case "order_num": return "orderNum"; + case "is_edit": return "isEdit"; + case "creation_user": return "creationUser"; + case "valid_flag": return "validFlag"; + case "creation_time": return "creationTime"; + case "modify_time": return "modifyTime"; + case "attr_len": return "attrLen"; + default: return null; + } + } + + /** **/ + public String getId() { + return this.id; + } + + /** **/ + public void setId(String id) { + this.id = id; + } + + /** **/ + public String getAttrField() { + return this.attrField; + } + + /** **/ + public void setAttrField(String attrField) { + this.attrField = attrField; + } + + /** **/ + public String getAttrName() { + return this.attrName; + } + + /** **/ + public void setAttrName(String attrName) { + this.attrName = attrName; + } + + /** **/ + public String getAttrType() { + return this.attrType; + } + + /** **/ + public void setAttrType(String attrType) { + this.attrType = attrType; + } + + /** **/ + public Long getOrderNum() { + return this.orderNum; + } + + /** **/ + public void setOrderNum(Long orderNum) { + this.orderNum = orderNum; + } + + /** **/ + public String getIsEdit() { + return this.isEdit; + } + + /** **/ + public void setIsEdit(String isEdit) { + this.isEdit = isEdit; + } + + /** **/ + public String getCreationUser() { + return this.creationUser; + } + + /** **/ + public void setCreationUser(String creationUser) { + this.creationUser = creationUser; + } + + /** **/ + public String getValidFlag() { + return this.validFlag; + } + + /** **/ + public void setValidFlag(String validFlag) { + this.validFlag = validFlag; + } + + /** **/ + public Date getCreationTime() { + return this.creationTime; + } + + /** **/ + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + /** **/ + public Date getModifyTime() { + return this.modifyTime; + } + + /** **/ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + /** **/ + public Long getAttrLen() { + return this.attrLen; + } + + /** **/ + public void setAttrLen(Long attrLen) { + this.attrLen = attrLen; + } + + public String getAttrValue() { + return attrValue; + } + + public void setAttrValue(String attrValue) { + this.attrValue = attrValue; + } + + public String getIsMust() { + return isMust; + } + + public void setIsMust(String isMust) { + this.isMust = isMust; + } + + public String getIsShowImp() { + return isShowImp; + } + + public void setIsShowImp(String isShowImp) { + this.isShowImp = isShowImp; + } + + public String getShowRegionId() { + return showRegionId; + } + + public void setShowRegionId(String showRegionId) { + this.showRegionId = showRegionId; + } + + public String getSelVal() { + return selVal; + } + + public void setSelVal(String selVal) { + this.selVal = selVal; + } + + public String getSarType() { + return sarType; + } + + public void setSarType(String sarType) { + this.sarType = sarType; + } + + public String getIsSearch() { + return isSearch; + } + + public void setIsSearch(String isSearch) { + this.isSearch = isSearch; + } + + public String getIsWarn() { + return isWarn; + } + + public void setIsWarn(String isWarn) { + this.isWarn = isWarn; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/UserVO.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/UserVO.java new file mode 100644 index 00000000..857e5f05 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/entity/UserVO.java @@ -0,0 +1,329 @@ +package com.ydw.bat.wkflow.business_main.datas.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class UserVO { + + private Integer validFlag; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date modifyTime; + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date creationTime; + private String operUser; + private String extInfo; + private String workNum; + private String email; + private String userSource; + private String uname; + private String password; + private String account; + private String usid; + // 扩展字段 + private List rolesstr = new ArrayList<>(); + private List roles = new ArrayList<>(); + private List orgsstr = new ArrayList<>(); + private List orgs = new ArrayList<>(); + private List roleIdList = new ArrayList<>(); + private List roleNameList = new ArrayList<>(); + private String orgId; + private String orgName; + private String rname; + private String roleId; + private String roleName; + private Integer disableFlag; + private Integer unlockFlag; + private String userType; + private String mobilePhone; + private String officePhone; + private String address; + private String faxAddress; + private String userInfoId; + private List roleEOList = new ArrayList<>(); + private List orgIdList = new ArrayList<>(); + private List orgEOList = new ArrayList<>(); + private String orgType; + + public String getUserInfoId() { + return userInfoId; + } + + public void setUserInfoId(String userInfoId) { + this.userInfoId = userInfoId; + } + + public Integer getValidFlag() { + return validFlag; + } + + public void setValidFlag(Integer validFlag) { + this.validFlag = validFlag; + } + + public Date getModifyTime() { + return modifyTime; + } + + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } + + public Date getCreationTime() { + return creationTime; + } + + public void setCreationTime(Date creationTime) { + this.creationTime = creationTime; + } + + public String getOperUser() { + return operUser; + } + + public void setOperUser(String operUser) { + this.operUser = operUser; + } + + public String getExtInfo() { + return extInfo; + } + + public void setExtInfo(String extInfo) { + this.extInfo = extInfo; + } + + public String getWorkNum() { + return workNum; + } + + public void setWorkNum(String workNum) { + this.workNum = workNum; + } + + public List getRolesstr() { + return rolesstr; + } + + public void setRolesstr(List rolesstr) { + this.rolesstr = rolesstr; + } + + public List getOrgsstr() { + return orgsstr; + } + + public void setOrgsstr(List orgsstr) { + this.orgsstr = orgsstr; + } + + public List getOrgs() { + return orgs; + } + + public void setOrgs(List orgs) { + this.orgs = orgs; + } + + public String getRname() { + return rname; + } + + public void setRname(String rname) { + this.rname = rname; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getUserSource() { + return userSource; + } + + public void setUserSource(String userSource) { + this.userSource = userSource; + } + + public String getUname() { + return uname; + } + + public void setUname(String uname) { + this.uname = uname; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getUsid() { + return usid; + } + + public void setUsid(String usid) { + this.usid = usid; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + if(roles!=null &&roles.size()>0){ + List roleNameList=new ArrayList(); + for(RoleEO role:roles){ + roleNameList.add(role.getName()); + } + this.rolesstr=roleNameList; + } + } + + public void setDisableFlag(Integer disableFlag){ + this.disableFlag=disableFlag; + } + + public Integer getDisableFlag(){ + return this.disableFlag; + } + + public void setUnlockFlag(Integer unlockFlag){ + this.unlockFlag=unlockFlag; + } + + public Integer getUnlockFlag(){ + return this.unlockFlag; + } + + public void setUserType(String userType){ + this.userType=userType; + } + + public String getUserType(){ + return this.userType; + } + + public void setOrgId(String orgId){ + this.orgId=orgId; + } + + public String getOrgId(){ + return this.orgId; + } + + public void setOrgName(String orgName){ + this.orgName=orgName; + } + + public String getOrgName(){ + return this.orgName; + } + + public void setRoleId(String roleId){ this.roleId=roleId;} + + public String getRoleId(){return this.roleId;} + + public String getRoleName(){return this.roleName;} + + public void setRoleName(String roleName){this.roleName=roleName;} + + public String getMobilePhone() { + return mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + public String getOfficePhone() { + return officePhone; + } + + public void setOfficePhone(String officePhone) { + this.officePhone = officePhone; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getFaxAddress() { + return faxAddress; + } + + public void setFaxAddress(String faxAddress) { + this.faxAddress = faxAddress; + } + + public List getRoleIdList() { + return roleIdList; + } + + public void setRoleIdList(List roleIdList) { + this.roleIdList = roleIdList; + } + + public List getRoleNameList() { + return roleNameList; + } + + public void setRoleNameList(List roleNameList) { + this.roleNameList = roleNameList; + } + + + public String getOrgType() { + return orgType; + } + + public void setOrgType(String orgType) { + this.orgType = orgType; + } + + public List getRoleEOList() { + return roleEOList; + } + + public void setRoleEOList(List roleEOList) { + this.roleEOList = roleEOList; + } + + public List getOrgIdList() { + return orgIdList; + } + + public void setOrgIdList(List orgIdList) { + this.orgIdList = orgIdList; + } + + public List getOrgEOList() { + return orgEOList; + } + + public void setOrgEOList(List orgEOList) { + this.orgEOList = orgEOList; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessEntrustMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessEntrustMapper.java new file mode 100644 index 00000000..77576d0a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessEntrustMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.datas.mapper; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEntrust; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-12-11 + */ +public interface BusProcessEntrustMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessMapper.java new file mode 100644 index 00000000..338df36a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.datas.mapper; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-11-05 + */ +public interface BusProcessMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNameMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNameMapper.java new file mode 100644 index 00000000..9abffa86 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNameMapper.java @@ -0,0 +1,22 @@ +package com.ydw.bat.wkflow.business_main.datas.mapper; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-11-11 + */ +public interface BusProcessNameMapper extends BaseMapper { + + //查询符合要求的 name 信息 + List findBusProcessNameForEnd(String taskId); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNewMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNewMapper.java new file mode 100644 index 00000000..fedd1769 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/BusProcessNewMapper.java @@ -0,0 +1,29 @@ +package com.ydw.bat.wkflow.business_main.datas.mapper; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-11-10 + */ +public interface BusProcessNewMapper extends BaseMapper { + + /** + * 根据taskIds查询未完成的任务数据 + * @param taskIds + * @return + */ + List findNoExecuteBusProcessNew(@Param("taskIds")List taskIds); + + List findNoExecuteBusProcessNewForEnd(@Param("taskIds")List taskIds); +// String queryTaskName(@Param("id")String id); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/DatasMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/DatasMapper.java new file mode 100644 index 00000000..e9d12f90 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/DatasMapper.java @@ -0,0 +1,27 @@ +package com.ydw.bat.wkflow.business_main.datas.mapper; + +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface DatasMapper extends BaseMapper { + + List> selectOverTimeUndoPids(@Param(Constants.WRAPPER) Wrapper queryWrapper); + + List> selectCreateTimeList(String dataFormat, @Param(Constants.WRAPPER) Wrapper queryWrapper); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/HiDatasMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/HiDatasMapper.java new file mode 100644 index 00000000..fd6e0427 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/mapper/HiDatasMapper.java @@ -0,0 +1,18 @@ +package com.ydw.bat.wkflow.business_main.datas.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ydw.bat.wkflow.business_main.datas.entity.HiDatas; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-23 + */ +public interface HiDatasMapper extends BaseMapper { + + void deleteHiDatas(String processInstanceId); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessEntrustService.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessEntrustService.java new file mode 100644 index 00000000..70925397 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessEntrustService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.datas.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEntrust; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-12-11 + */ +public interface IBusProcessEntrustService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNameService.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNameService.java new file mode 100644 index 00000000..ef1a600f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNameService.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.datas.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-11-11 + */ +public interface IBusProcessNameService extends IService { + + List findBusProcessNameForEnd(String prcNum); +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNewService.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNewService.java new file mode 100644 index 00000000..d97452f8 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessNewService.java @@ -0,0 +1,32 @@ +package com.ydw.bat.wkflow.business_main.datas.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.baomidou.mybatisplus.extension.service.IService; +import org.activiti.engine.task.Task; + +import java.util.List; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-11-10 + */ +public interface IBusProcessNewService extends IService { + + List findtodotask(String userId, String pId); + + List QueryTask(String userId, String pId); + + /** + * 根据taskId集合查下任务 + * @param taskIdList + * @return + */ + List findTaskDetailByTaskIds(List taskIdList); + + List findNoExecuteBusProcessNewForEnd(List taskIdList); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessService.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessService.java new file mode 100644 index 00000000..967cf9c0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IBusProcessService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.datas.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-11-05 + */ +public interface IBusProcessService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IDatasService.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IDatasService.java new file mode 100644 index 00000000..b9ccdfb4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IDatasService.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.datas.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface IDatasService extends IService { + + void deleteOverTimeTasks(); + + void rollBack(Datas datas); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IHiDatasService.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IHiDatasService.java new file mode 100644 index 00000000..c3bca786 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/IHiDatasService.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.datas.service; + +import com.ydw.bat.wkflow.business_main.datas.entity.HiDatas; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-23 + */ +public interface IHiDatasService extends IService { + + HiDatas createHistoryActivitTablesDatas(String objectId, String pId); + + void rollBack(HiDatas hiDatas, String pId); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessEntrustServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessEntrustServiceImpl.java new file mode 100644 index 00000000..d93a7b10 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessEntrustServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.datas.service.impl; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessEntrust; +import com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessEntrustMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessEntrustService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-12-11 + */ +@Service +public class BusProcessEntrustServiceImpl extends ServiceImpl implements IBusProcessEntrustService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNameServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNameServiceImpl.java new file mode 100644 index 00000000..6b082b8a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNameServiceImpl.java @@ -0,0 +1,31 @@ +package com.ydw.bat.wkflow.business_main.datas.service.impl; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessNameMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-11-11 + */ +@Service +public class BusProcessNameServiceImpl extends ServiceImpl implements IBusProcessNameService { + + @Autowired + BusProcessNameMapper busProcessNameMapper; + + public List findBusProcessNameForEnd(String taskId){ + //该接口中,CREATE_USER_NAME 存放 BusProcessNew 中的 userId + return busProcessNameMapper.findBusProcessNameForEnd(taskId); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNewServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNewServiceImpl.java new file mode 100644 index 00000000..0615c20b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessNewServiceImpl.java @@ -0,0 +1,71 @@ +package com.ydw.bat.wkflow.business_main.datas.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessNewMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.TreeSet; +import java.util.stream.Collectors; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-11-10 + */ +@Service +public class BusProcessNewServiceImpl extends ServiceImpl implements IBusProcessNewService { + + private TaskService taskService; + + /* + * @Author yuzhong + * @Description + * @Date 2020/11/11 + * 返回待办信息详情 + */ + @Override + public List findtodotask(String userId,String pId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("FINISH_FLAG","0"); + queryWrapper.eq("P_ID",pId); + queryWrapper.eq("USER_ID",userId); + List taskList = this.list(queryWrapper); + return taskList; + } + + /* + * @Author yuzhong + * @Description + * @Date 2020/11/11 + * 返回待办任务列表 + */ + public List QueryTask(String userId,String pId){ + List list = taskService.createTaskQuery().processInstanceId(pId).taskCandidateUser(userId).list(); + //list根据人员去重 + list = list.stream().collect( Collectors.collectingAndThen(Collectors.toCollection(() -> + new TreeSet<>(Comparator.comparing(o -> o.getAssignee()))), + ArrayList::new)); + return list; + } + + @Override + public List findTaskDetailByTaskIds(List taskIdList) { + return baseMapper.findNoExecuteBusProcessNew(taskIdList); + } + + @Override + public List findNoExecuteBusProcessNewForEnd(List taskIdList) { + return baseMapper.findNoExecuteBusProcessNewForEnd(taskIdList); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessServiceImpl.java new file mode 100644 index 00000000..d173fb06 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/BusProcessServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.datas.service.impl; + +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.ydw.bat.wkflow.business_main.datas.mapper.BusProcessMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-11-05 + */ +@Service +public class BusProcessServiceImpl extends ServiceImpl implements IBusProcessService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/DatasServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/DatasServiceImpl.java new file mode 100644 index 00000000..ae7d1529 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/DatasServiceImpl.java @@ -0,0 +1,69 @@ +package com.ydw.bat.wkflow.business_main.datas.service.impl; + +import java.sql.Timestamp; +import java.util.List; +import java.util.Map; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.RuntimeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.mapper.DatasMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.date.DateTools; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Service +public class DatasServiceImpl extends ServiceImpl implements IDatasService { + + @Autowired + private DatasMapper datasMapper; + @Autowired + private RuntimeService runtimeService; + @Autowired + private HistoryService historyService; + + @Transactional + @Override + public void deleteOverTimeTasks() { + // TODO 删除超过24小时的未做任务 + // 查找超时未处理的流程实例 + QueryWrapper queryWrapper = new QueryWrapper<>(); + Timestamp now = new Timestamp(System.currentTimeMillis()); + queryWrapper.isNull("ahp.END_TIME_"); + queryWrapper.between("ahp.START_TIME_", DateTools.addDay(now, -2), DateTools.addDay(now, -1)); + queryWrapper.isNull("td.OBJECT_ID"); + List> list = datasMapper.selectOverTimeUndoPids(queryWrapper); + for (Map map : list) { + String processInstanceId = map.get("processInstanceId") + ""; + // 删除流程 + runtimeService.deleteProcessInstance(processInstanceId, "用户撤销"); + // 删除历史审批 + historyService.deleteHistoricProcessInstance(processInstanceId); + } + + } + + @Transactional + @Override + public void rollBack(Datas datas) { + // TODO 删除任务记录数据 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_PROC_INST_ID", datas.getActiProcInstId()); + queryWrapper.ge("CREATE_TIME", datas.getCreateTime()); + this.remove(queryWrapper); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/HiDatasServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/HiDatasServiceImpl.java new file mode 100644 index 00000000..fff708ad --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/datas/service/impl/HiDatasServiceImpl.java @@ -0,0 +1,167 @@ +package com.ydw.bat.wkflow.business_main.datas.service.impl; + +import java.lang.reflect.Field; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.HiDatas; +import com.ydw.bat.wkflow.business_main.datas.mapper.HiDatasMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IHiDatasService; +import com.ydw.bat.wkflow.util.date.DateTools; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-23 + */ +@Service +public class HiDatasServiceImpl extends ServiceImpl implements IHiDatasService { + + @Autowired + private JdbcTemplate jt; + + @Override + public HiDatas createHistoryActivitTablesDatas(String objectId, String pId) { + // TODO 生成工作流当前相关数据记录 + HiDatas hiDatas = new HiDatas(); + hiDatas.setDatasId(objectId); + // 保存工作流表结构的数据 + Field[] fields = HiDatas.class.getDeclaredFields(); + for (Field field : fields) { + String name = field.getName(); + if ("objectId".equals(name) || "isDeleted".equals(name) || "createTime".equals(name) + || "datasId".equals(name) || "serialVersionUID".equals(name) || "actRuJob".equals(name)) { + continue; + } + field.setAccessible(true); + TableField tableField = field.getAnnotation(TableField.class); + String actTable = tableField.value(); + List> list = this.selectFieldDatas(actTable, pId); + String value = ""; + if (!list.isEmpty()) { + value = JsonUtil.toJson(list); + } + try { + field.set(hiDatas, value); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + this.save(hiDatas); + return hiDatas; + } + + private List> selectFieldDatas(String actTable, String pId) { + // TODO 获取工作流数据 + String sql = "select * from @table where PROC_INST_ID_=? "; + sql = sql.replace("@table", actTable); + List> list = jt.queryForList(sql, pId); + return list; + } + + @Transactional + @Override + public void rollBack(HiDatas hiDatas, String pId) { + // TODO 回退 + if (ChkUtil.isNull(hiDatas)) { + return; + } + // 删除工作流原有数据 + this.deleteFieldDatas("ACT_HI_ACTINST", pId); + this.deleteFieldDatas("ACT_HI_ATTACHMENT", pId); + this.deleteFieldDatas("ACT_HI_COMMENT", pId); + this.deleteFieldDatas("ACT_HI_DETAIL", pId); + this.deleteFieldDatas("ACT_HI_IDENTITYLINK", pId); + this.deleteFieldDatas("ACT_HI_PROCINST", pId); + this.deleteFieldDatas("ACT_HI_TASKINST", pId); + this.deleteFieldDatas("ACT_HI_VARINST", pId); + this.deleteFieldDatas("ACT_RU_EVENT_SUBSCR", pId); + this.deleteFieldDatas("ACT_RU_IDENTITYLINK", pId); + this.deleteFieldDatas("ACT_RU_TASK", pId); + this.deleteFieldDatas("ACT_RU_VARIABLE", pId); + this.deleteFieldDatas("ACT_RU_EXECUTION", pId); + // 创建目标任务的相关数据 + this.createFieldDatas("ACT_RU_EXECUTION", hiDatas.getActRuExecution()); + this.createFieldDatas("ACT_RU_VARIABLE", hiDatas.getActRuVariable()); + this.createFieldDatas("ACT_RU_TASK", hiDatas.getActRuTask()); + this.createFieldDatas("ACT_RU_IDENTITYLINK", hiDatas.getActRuIdentitylink()); + this.createFieldDatas("ACT_RU_EVENT_SUBSCR", hiDatas.getActRuEventSubscr()); + this.createFieldDatas("ACT_HI_VARINST", hiDatas.getActHiVarinst()); + this.createFieldDatas("ACT_HI_TASKINST", hiDatas.getActHiTaskinst()); + this.createFieldDatas("ACT_HI_PROCINST", hiDatas.getActHiProcinst()); + this.createFieldDatas("ACT_HI_IDENTITYLINK", hiDatas.getActHiIdentitylink()); + this.createFieldDatas("ACT_HI_DETAIL", hiDatas.getActHiDetail()); + this.createFieldDatas("ACT_HI_COMMENT", hiDatas.getActHiComment()); + this.createFieldDatas("ACT_HI_ATTACHMENT", hiDatas.getActHiAttachment()); + this.createFieldDatas("ACT_HI_ACTINST", hiDatas.getActHiActinst()); + } + + @SuppressWarnings("unchecked") + @Transactional + private void createFieldDatas(String table, String data) { + // TODO 还原工作流相关数据 + if (ChkUtil.isNull(data)) { + return; + } + JSONArray array = JSONArray.parseArray(data); + for (Object object : array) { + String sql = "insert into @table "; + String fields = "("; + String values = "("; + Map map = (Map) object; + for (String key : map.keySet()) { + fields += "," + key; + Object val = map.get(key); + if (key.indexOf("TIME_") > 0) { + val = DateTools.formatDateTime(new Date(Long.parseLong(val + ""))); + } + if(ChkUtil.isNull(val)) { + val = ""; + } + values += ",'" + val + "'"; + } + fields += ")"; + values += ")"; + fields = fields.replaceFirst(",", ""); + values = values.replaceFirst(",", ""); + sql = sql + fields + " values " + values; + sql = sql.replace("@table", table); + jt.execute(sql); + } + } + + @Transactional + private void deleteFieldDatas(String actTable, String pId) { + // TODO 删除工作流相关数据 + if("ACT_RU_EXECUTION".equals(actTable)) { + String sql = "delete from @table where PROC_INST_ID_=? and IS_ACTIVE_=1 "; + sql = sql.replace("@table", actTable); + jt.update(sql, pId); + + sql = sql.replace("IS_ACTIVE_=1", "IS_ACTIVE_=0"); + jt.update(sql, pId); + + return; + } + String sql = "delete from @table where PROC_INST_ID_=? "; + sql = sql.replace("@table", actTable); + jt.update(sql, pId); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate/controller/DelegateController.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/controller/DelegateController.java new file mode 100644 index 00000000..66438a49 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/controller/DelegateController.java @@ -0,0 +1,127 @@ +package com.ydw.bat.wkflow.business_main.delegate.controller; + +import java.util.Map; +import javax.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.delegate.dto.DelegateQuery; +import com.ydw.bat.wkflow.business_main.delegate.entity.Delegate; +import com.ydw.bat.wkflow.business_main.delegate.service.IDelegateService; +import com.ydw.bat.wkflow.business_main.delegate_business.entity.DelegateBusiness; +import com.ydw.bat.wkflow.business_main.delegate_business.service.IDelegateBusinessService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "委托管理") +@RestController +@RequestMapping("/delegate/delegate") +public class DelegateController { + + @Autowired + private IDelegateService iDelegateService; + + @Autowired + private IDelegateBusinessService iDelegateBusinessService; + + @ApiOperation(value = "委托管理列表") + @PostMapping("/list") + public Wrapper> list(@RequestBody DelegateQuery delegateQuery) { + IPage list = iDelegateService.page(delegateQuery, delegateQuery.makeQueryWrapper()); + + return WrapMapper.ok(list); + } + + @ApiOperation(value = "添加委托") + @PostMapping("/add") + public Wrapper add(@ApiParam @Valid @RequestBody Delegate delegate) { + iDelegateService.save(delegate); + + JSONArray array = JSON.parseArray(delegate.getBusiness()); + for (int i = 0; i < array.size(); i++) { + @SuppressWarnings("unchecked") + Map map = (Map) array.get(i); + String id = map.get("id").toString(); + String name = map.get("name").toString(); + DelegateBusiness db = new DelegateBusiness(); + db.setBusinessKey(id); + db.setBusinessName(name); + db.setDelegateId(delegate.getObjectId()); + iDelegateBusinessService.save(db); + } + + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "删除委托") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/delete") + public Wrapper delete(String objectId) { + iDelegateService.removeById(objectId); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "编辑获取委托") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/edit_form") + public Wrapper editForm(String objectId) { + Delegate opFunc = iDelegateService.getById(objectId); + return WrapMapper.ok(opFunc); + } + + @ApiOperation(value = "编辑委托") + @PostMapping("/edit") + public Wrapper edit(@Valid @RequestBody Delegate delegate) { + Delegate delegateDb = iDelegateService.getById(delegate.getObjectId()); + delegateDb.setBusiness(delegate.getBusiness()); + delegateDb.setEnd(delegate.getEnd()); + delegateDb.setStart(delegate.getStart()); + delegateDb.setReason(delegate.getReason()); + delegateDb.setUserdName(delegate.getUserdName()); + delegateDb.setUserName(delegate.getUserName()); + delegateDb.setStatuz(delegate.getStatuz()); + delegateDb.setTitle(delegate.getTitle()); + delegateDb.setUser(delegate.getUser()); + delegateDb.setUserd(delegate.getUserd()); + iDelegateService.saveOrUpdate(delegateDb); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("DELEGATE_ID", delegate.getObjectId()); + iDelegateBusinessService.remove(queryWrapper); + JSONArray array = JSON.parseArray(delegate.getBusiness()); + for (int i = 0; i < array.size(); i++) { + @SuppressWarnings("unchecked") + Map map = (Map) array.get(i); + String id = map.get("id").toString(); + String name = map.get("name").toString(); + DelegateBusiness db = new DelegateBusiness(); + db.setBusinessKey(id); + db.setBusinessName(name); + db.setDelegateId(delegate.getObjectId()); + iDelegateBusinessService.save(db); + } + + return WrapMapper.ok("保存成功"); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate/dto/DelegateQuery.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/dto/DelegateQuery.java new file mode 100644 index 00000000..737be0ab --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/dto/DelegateQuery.java @@ -0,0 +1,70 @@ +package com.ydw.bat.wkflow.business_main.delegate.dto; + +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import com.tmsps.fk.common.util.ChkUtil; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "DelegateQuery对象", description = "") +public class DelegateQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "委托业务") + private String business; + @ApiModelProperty(value = "委托事项") + private String title; + @ApiModelProperty(value = "委托人") + private String user; + @ApiModelProperty(value = "被委托人") + private String userd; + @ApiModelProperty(value = "开始时间") + private long start; + @ApiModelProperty(value = "结束时间") + private long end; + @ApiModelProperty(value = "委托状态 : 启用 or 停用") + private String statuz; + @ApiModelProperty(value = "委托原因") + private String reason; + + public Wrapper makeQueryWrapper() { + + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ChkUtil.isNotNull(business)) { + queryWrapper.like("BUSINESS", business); + } + if (ChkUtil.isNotNull(title)) { + queryWrapper.like("TITLE", title); + } + if (ChkUtil.isNotNull(user)) { + queryWrapper.like("USER_NAME", user); + } + if (ChkUtil.isNotNull(userd)) { + queryWrapper.like("USERD_NAME", userd); + } + if (ChkUtil.isNotNull(start)&&start!=0) { + queryWrapper.ge("START", start); + } + if (ChkUtil.isNotNull(end)&&end!=0) { + queryWrapper.le("END", end); + } + if (ChkUtil.isNotNull(statuz)) { + queryWrapper.like("STATUZ", statuz); + } + if (ChkUtil.isNotNull(reason)) { + queryWrapper.like("REASON", reason); + } + + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate/entity/Delegate.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/entity/Delegate.java new file mode 100644 index 00000000..7efb9f29 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/entity/Delegate.java @@ -0,0 +1,88 @@ +package com.ydw.bat.wkflow.business_main.delegate.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_delegate") +@ApiModel(value = "Delegate对象", description = "") +public class Delegate implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "委托事项") + @TableField("TITLE") + private String title; + + @ApiModelProperty(value = "委托业务") + @TableField("BUSINESS") + private String business; + + @ApiModelProperty(value = "开始时间") + @TableField("START") + private long start; + + @ApiModelProperty(value = "结束时间") + @TableField("END") + private long end; + + @ApiModelProperty(value = "委托原因") + @TableField("REASON") + private String reason; + + @ApiModelProperty(value = "委托状态 : 启用 or 停用") + @TableField("STATUZ") + private String statuz; + + @ApiModelProperty(value = "委托人id") + @TableField("USER") + private String user; + + @ApiModelProperty(value = "委托人") + @TableField("USER_NAME") + private String userName; + + @ApiModelProperty(value = "被委托人id") + @TableField("USERD") + private String userd; + + @ApiModelProperty(value = "被委托人") + @TableField("USERD_NAME") + private String userdName; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate/mapper/DelegateMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/mapper/DelegateMapper.java new file mode 100644 index 00000000..f8e3d245 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/mapper/DelegateMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.delegate.mapper; + +import com.ydw.bat.wkflow.business_main.delegate.entity.Delegate; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface DelegateMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/IDelegateService.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/IDelegateService.java new file mode 100644 index 00000000..702203ac --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/IDelegateService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.delegate.service; + +import com.ydw.bat.wkflow.business_main.delegate.entity.Delegate; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface IDelegateService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/impl/DelegateServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/impl/DelegateServiceImpl.java new file mode 100644 index 00000000..4db7a5b9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate/service/impl/DelegateServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.delegate.service.impl; + +import com.ydw.bat.wkflow.business_main.delegate.entity.Delegate; +import com.ydw.bat.wkflow.business_main.delegate.mapper.DelegateMapper; +import com.ydw.bat.wkflow.business_main.delegate.service.IDelegateService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Service +public class DelegateServiceImpl extends ServiceImpl implements IDelegateService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/controller/DelegateBusinessController.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/controller/DelegateBusinessController.java new file mode 100644 index 00000000..e3e978d7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/controller/DelegateBusinessController.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_main.delegate_business.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +@RestController +@RequestMapping("/delegate_business/delegate-business") +public class DelegateBusinessController { + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/dto/DelegateBusinessQuery.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/dto/DelegateBusinessQuery.java new file mode 100644 index 00000000..29fde7ce --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/dto/DelegateBusinessQuery.java @@ -0,0 +1,34 @@ +package com.ydw.bat.wkflow.business_main.delegate_business.dto; + +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import com.tmsps.fk.common.util.ChkUtil; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value = "DelegateBusinessQuery对象", description = "") +public class DelegateBusinessQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "委托ID") + private String delegate_id; + + public Wrapper makeQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ChkUtil.isNotNull(delegate_id)) { + queryWrapper.eq("DELEGATE_ID", delegate_id); + } + + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/entity/DelegateBusiness.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/entity/DelegateBusiness.java new file mode 100644 index 00000000..523ceaee --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/entity/DelegateBusiness.java @@ -0,0 +1,58 @@ +package com.ydw.bat.wkflow.business_main.delegate_business.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_delegate_business") +@ApiModel(value = "DelegateBusiness对象", description = "") +public class DelegateBusiness implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "委托业务key") + @TableField("BUSINESS_KEY") + private String businessKey; + + @ApiModelProperty(value = "委托ID") + @TableField("DELEGATE_ID") + private String delegateId; + + @ApiModelProperty(value = "委托业务") + @TableField("BUSINESS_NAME") + private String businessName; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/mapper/DelegateBusinessMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/mapper/DelegateBusinessMapper.java new file mode 100644 index 00000000..6df42161 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/mapper/DelegateBusinessMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.delegate_business.mapper; + +import com.ydw.bat.wkflow.business_main.delegate_business.entity.DelegateBusiness; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +public interface DelegateBusinessMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/IDelegateBusinessService.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/IDelegateBusinessService.java new file mode 100644 index 00000000..7a64a893 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/IDelegateBusinessService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.delegate_business.service; + +import com.ydw.bat.wkflow.business_main.delegate_business.entity.DelegateBusiness; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +public interface IDelegateBusinessService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/impl/DelegateBusinessServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/impl/DelegateBusinessServiceImpl.java new file mode 100644 index 00000000..16747ba3 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/delegate_business/service/impl/DelegateBusinessServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.delegate_business.service.impl; + +import com.ydw.bat.wkflow.business_main.delegate_business.entity.DelegateBusiness; +import com.ydw.bat.wkflow.business_main.delegate_business.mapper.DelegateBusinessMapper; +import com.ydw.bat.wkflow.business_main.delegate_business.service.IDelegateBusinessService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +@Service +public class DelegateBusinessServiceImpl extends ServiceImpl implements IDelegateBusinessService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/file/controller/FileController.java b/src/main/java/com/ydw/bat/wkflow/business_main/file/controller/FileController.java new file mode 100644 index 00000000..ea6cce91 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/file/controller/FileController.java @@ -0,0 +1,62 @@ +package com.ydw.bat.wkflow.business_main.file.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.file.entity.File; +import com.ydw.bat.wkflow.business_main.file.service.IFileService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "文件管理") +@RestController +@RequestMapping("/file/file") +public class FileController { + + @Autowired + private IFileService fileService; + + @ApiOperation(value = "上传文件") + @ApiImplicitParam(name = "file", value = "上传文件") + @PostMapping("/upload") + public Wrapper upload(@RequestParam MultipartFile file) throws Exception { + File save_file = fileService.saveFile(file); + return WrapMapper.ok(save_file); + } + + @ApiOperation(value = "下载文件") + @ApiImplicitParams({ @ApiImplicitParam(name = "file_id", value = "文件id"), + @ApiImplicitParam(name = "mw", value = "宽"), + @ApiImplicitParam(name = "mh", value = "高") }) + @GetMapping("/download") + public void download(String file_id, String mw, String mh) throws Exception { + fileService.download(file_id); + + } + + @ApiOperation(value = "查看图片") + @ApiImplicitParam(name = "file_id", value = "文件id") + @GetMapping("/img") + public void showImg(String file_id, String mw, String mh) + throws Exception { + fileService.showImg(file_id, mw, mh); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/file/entity/File.java b/src/main/java/com/ydw/bat/wkflow/business_main/file/entity/File.java new file mode 100644 index 00000000..7fb7a12f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/file/entity/File.java @@ -0,0 +1,74 @@ +package com.ydw.bat.wkflow.business_main.file.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_file") +@ApiModel(value = "File对象", description = "") +public class File { + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "源文件名") + @TableField("FILE_NAME") + private String fileName; + + @ApiModelProperty(value = "保存文件名") + @TableField("NEW_FILE_NAME") + private String newFileName; + + @ApiModelProperty(value = "保存文件夹") + @TableField("FOLDER") + private String folder; + + @ApiModelProperty(value = "保存路径") + @TableField("FOLDER_URL") + private String folderUrl; + + @ApiModelProperty(value = "文件类型") + @TableField("CONTENT_TYPE") + private String contentType; + + @ApiModelProperty(value = "文件大小") + @TableField("SIZE") + private long size; + + @ApiModelProperty(value = "备注") + @TableField("NOTE") + private String note; + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/file/mapper/FileMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/file/mapper/FileMapper.java new file mode 100644 index 00000000..aa13f99c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/file/mapper/FileMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.file.mapper; + +import com.ydw.bat.wkflow.business_main.file.entity.File; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface FileMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/file/service/IFileService.java b/src/main/java/com/ydw/bat/wkflow/business_main/file/service/IFileService.java new file mode 100644 index 00000000..712d40fe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/file/service/IFileService.java @@ -0,0 +1,27 @@ +package com.ydw.bat.wkflow.business_main.file.service; + +import com.ydw.bat.wkflow.business_main.file.entity.File; + +import java.io.IOException; + +import org.springframework.web.multipart.MultipartFile; + +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface IFileService extends IService { + + File saveFile(MultipartFile file) throws IllegalStateException, IOException; + + void download(String file_id) throws IOException; + + void showImg(String file_id, String mw, String mh) throws IOException; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/file/service/impl/FileServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/file/service/impl/FileServiceImpl.java new file mode 100644 index 00000000..b6df30c7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/file/service/impl/FileServiceImpl.java @@ -0,0 +1,178 @@ +package com.ydw.bat.wkflow.business_main.file.service.impl; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URLEncoder; + +import javax.servlet.ServletOutputStream; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.image.ImgTools; +import com.ydw.bat.wkflow.business_main.file.entity.File; +import com.ydw.bat.wkflow.business_main.file.mapper.FileMapper; +import com.ydw.bat.wkflow.business_main.file.service.IFileService; +import com.ydw.bat.wkflow.business_main.system.entity.System; +import com.ydw.bat.wkflow.business_main.system.service.ISystemService; +import com.ydw.bat.wkflow.util.WebUtil; +import com.ydw.bat.wkflow.util.date.DateTools; +import com.ydw.bat.wkflow.util.file.FileTools; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Service +public class FileServiceImpl extends ServiceImpl implements IFileService { + + @Autowired + private ISystemService systemService; + + @Override + public File saveFile(MultipartFile file) throws IllegalStateException, IOException { + // TODO 保存文件 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("NAME", "DATA-PATH"); + System system = systemService.getOne(queryWrapper); + String path = system.getValue(); + String suffix = FileTools.getSuffix(file.getOriginalFilename()); + + String file_name = file.getOriginalFilename(); + + String new_file_name = DateTools.getCreated() + "." + suffix; + int year = DateTools.getYear(); + int month = DateTools.getMonth(); + String folder = year + java.io.File.separator + month; + String folder_url = year + "/" + month; + // 保存文件 + File tf = new File(); + if (ChkUtil.isNotNull(file_name)) { + tf.setFileName(file_name); + } else { + if (ChkUtil.isNotNull(suffix)) { + tf.setFileName(file.getOriginalFilename().substring(0, file.getOriginalFilename().lastIndexOf(".")) + + "." + suffix); + } else { + tf.setFileName(file.getOriginalFilename()); + } + } + tf.setNewFileName(new_file_name); + tf.setFolder(folder); + tf.setFolderUrl(folder_url); + tf.setContentType(file.getContentType()); + tf.setSize(file.getSize()); + // 获取保存路径 + java.io.File newFile = new java.io.File(path + java.io.File.separator + folder + java.io.File.separator + tf.getNewFileName()); + if (!newFile.getParentFile().exists()) { + newFile.getParentFile().mkdirs(); + } + file.transferTo(newFile); + this.save(tf); + return null; + } + + @Override + public void download(String file_id) throws IOException { + // TODO 下载文件 + File file = null; + if (ChkUtil.isNotNull(file_id)) { + file = this.getById(file_id); + } + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("NAME", "DATA-PATH"); + System system = systemService.getOne(queryWrapper); + String DATA_PATH = system.getValue(); + + ServletOutputStream os = WebUtil.getReponse().getOutputStream(); + FileInputStream fis = null; + java.io.File img = null; + try { + if (file != null) { + String folderName = DATA_PATH + java.io.File.separator + file.getFolder() + java.io.File.separator; + img = new java.io.File(folderName, file.getNewFileName()); + } + if (img == null || !img.exists()) { + String folderName = DATA_PATH + java.io.File.separator + "model" + java.io.File.separator; + img = new java.io.File(folderName, "default.png"); + } + // 设置页面不缓存 + WebUtil.getReponse().setHeader("Pragma", "No-cache"); + WebUtil.getReponse().setHeader("Cache-Control", "no-cache"); + WebUtil.getReponse().setDateHeader("Expires", 0); + WebUtil.getReponse().setHeader("content-disposition", + "attachment;filename=" + URLEncoder.encode(file.getFileName(), "UTF-8")); + + fis = new FileInputStream(img); + byte[] b = new byte[10240]; + int len = -1; + while ((len = fis.read(b)) != -1) { + os.write(b, 0, len); + } + + } catch (Exception e) { + log.debug("文件找不到:" + e); + e.printStackTrace(); + } finally { + os.close(); + if (fis != null) { + fis.close(); + } + } + } + + @Override + public void showImg(String file_id, String mw, String mh) throws IOException { + // TODO 查看图片 + File file = null; + if (ChkUtil.isNotNull(file_id)) { + file = this.getById(file_id); + } + + ServletOutputStream os = WebUtil.getReponse().getOutputStream(); + // 获取保存路径 + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("NAME", "DATA-PATH"); + System system = systemService.getOne(queryWrapper); + String DATA_PATH = system.getValue(); + java.io.File img = null; + try { + if (file != null) { + String folderName = DATA_PATH + java.io.File.separator + file.getFolderUrl() + java.io.File.separator; + img = new java.io.File(folderName, file.getNewFileName()); + } + if (img == null || !img.exists()) { + String folderName = DATA_PATH + java.io.File.separator + "model" + java.io.File.separator; + img = new java.io.File(folderName, "default.png"); + } + + int height = ChkUtil.getInteger(mh); + int width = ChkUtil.getInteger(mw); + height = height < 0 ? 0 : height; + width = width < 0 ? 0 : width; + + // 设置页面不缓存 + WebUtil.getReponse().setHeader("Pragma", "No-cache"); + WebUtil.getReponse().setHeader("Cache-Control", "no-cache"); + WebUtil.getReponse().setDateHeader("Expires", 0); + + ImgTools.thumbnail_w_h(img, width, height, os); + + } catch (Exception e) { + log.debug("图片找不到:" + e); + e.printStackTrace(); + } finally { + os.close(); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormAccessoryController.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormAccessoryController.java new file mode 100644 index 00000000..33afcbf3 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormAccessoryController.java @@ -0,0 +1,88 @@ +package com.ydw.bat.wkflow.business_main.form.controller; + + +import java.util.List; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.form.dto.FormAccessoryQuery; +import com.ydw.bat.wkflow.business_main.form.entity.FormAccessory; +import com.ydw.bat.wkflow.business_main.form.service.IFormAccessoryService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +@Api(description = "表单模板管理") +@RestController +@RequestMapping("/file/form-accessory") +public class FormAccessoryController { + + @Autowired + private IFormAccessoryService formAccessoryService; + + @ApiOperation(value = "表单模板列表") + @PostMapping("/list") + public Wrapper> list(@RequestBody FormAccessoryQuery formAccessoryQuery) { + + List list = formAccessoryService.list(formAccessoryQuery.makeQueryWrapper()); + + return WrapMapper.ok(list); + } + + @ApiOperation(value = "添加表单模板") + @PostMapping("/add") + public Wrapper add(@ApiParam @Valid @RequestBody FormAccessory formAccessory) { + formAccessoryService.save(formAccessory); + + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "删除表单模板") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/delete") + public Wrapper delete(String objectId) { + formAccessoryService.removeById(objectId); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "编辑获取表单模板数据") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/edit_form") + public Wrapper editForm(String objectId) { + FormAccessory opFunc = formAccessoryService.getById(objectId); + return WrapMapper.ok(opFunc); + } + + @ApiOperation(value = "编辑表单模板") + @PostMapping("/edit") + public Wrapper edit(@Valid @RequestBody FormAccessory formAccessory) { + FormAccessory formAccessoryDb = formAccessoryService.getById(formAccessory.getObjectId()); + formAccessoryDb.setFileId(formAccessory.getFileId()); + formAccessoryDb.setFileName(formAccessory.getFileName()); + formAccessoryDb.setIsRequired(formAccessory.getIsRequired()); + formAccessoryDb.setSortz(formAccessory.getSortz()); + formAccessoryService.saveOrUpdate(formAccessoryDb); + + return WrapMapper.ok("保存成功"); + } +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormApiController.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormApiController.java new file mode 100644 index 00000000..d2327bc7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormApiController.java @@ -0,0 +1,47 @@ +package com.ydw.bat.wkflow.business_main.form.controller; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "表单管理") +@RestController +@RequestMapping("/api/form") +public class FormApiController { + + @Autowired + private IFormService formService; + + @ApiOperation(value = "表单菜单管理") + @GetMapping("/list") + public Wrapper> list() { + + QueryWrapper
    queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("IS_MENU", "是"); + queryWrapper.eq("IS_SET", "是"); + List list = formService.list(queryWrapper); + + return WrapMapper.ok(list); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormController.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormController.java new file mode 100644 index 00000000..6e808769 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormController.java @@ -0,0 +1,102 @@ +package com.ydw.bat.wkflow.business_main.form.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.form.dto.FormQuery; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.mapper.FormMapper; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "表单管理") +@RestController +@RequestMapping("/form/form") +public class FormController { + + @Autowired + private IFormService formService; + @Autowired + private FormMapper formMapper; + + @ApiOperation(value = "表单管理") + @PostMapping("/list") + public Wrapper> list(@RequestBody FormQuery formQuery) { + + List list = formMapper.selectListPage(formQuery, formQuery.makeQueryWrapper()); + + Map map = new HashMap<>(); + map.put("records", list); + map.put("current", formQuery.getCurrent()); + map.put("size", formQuery.getSize()); + map.put("total", formQuery.getTotal()); + return WrapMapper.ok(map); + } + + @ApiOperation(value = "添加表单") + @PostMapping("/add") + public Wrapper add(@ApiParam @Valid @RequestBody Form form) { + formService.saveForm(form); + + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "删除表单") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/delete") + public Wrapper delete(String objectId) { + formService.removeById(objectId); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "编辑获取表单数据") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/edit_form") + public Wrapper editForm(String objectId) { + Form form = formService.getById(objectId); + return WrapMapper.ok(form); + } + + @ApiOperation(value = "编辑表单") + @PostMapping("/edit") + public Wrapper edit(@Valid @RequestBody Form form) { + formService.updateForm(form); + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "更改表单模式") + @ApiImplicitParams({ @ApiImplicitParam(name = "objectId", value = "主键id"), + @ApiImplicitParam(name = "runType", value = "表单模式: html or json") }) + @GetMapping("/change_runType") + public Wrapper change_runType(String objectId, String runType) { + Form formDb = formService.getById(objectId); + formDb.setRunType(runType); + formService.saveOrUpdate(formDb); + return WrapMapper.ok("模式操作成功"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormVariableController.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormVariableController.java new file mode 100644 index 00000000..b1872ddd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/controller/FormVariableController.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_main.form.controller; + + +import org.springframework.web.bind.annotation.RequestMapping; + +import org.springframework.web.bind.annotation.RestController; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-19 + */ +@RestController +@RequestMapping("/form/form-variable") +public class FormVariableController { + +} + diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormAccessoryQuery.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormAccessoryQuery.java new file mode 100644 index 00000000..5836530d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormAccessoryQuery.java @@ -0,0 +1,35 @@ +package com.ydw.bat.wkflow.business_main.form.dto; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import com.tmsps.fk.common.util.ChkUtil; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class FormAccessoryQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "模板名称") + private String name; + @ApiModelProperty(value = "表单ID") + private String formId; + + public Wrapper makeQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ChkUtil.isNotNull(name)) { + queryWrapper.like("FILE_NAME", name); + } + if (ChkUtil.isNotNull(formId)) { + queryWrapper.eq("FORM_ID", formId); + } + queryWrapper.orderBy(true, true, "SORTZ"); + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormQuery.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormQuery.java new file mode 100644 index 00000000..7309f863 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/dto/FormQuery.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.business_main.form.dto; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.base.dto.BaseVueQuery; +import com.tmsps.fk.common.util.ChkUtil; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = false) +public class FormQuery extends BaseVueQuery { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "表单名称") + private String name; + @ApiModelProperty(value = "流程名称") + private String modelName; + @ApiModelProperty(value = "流程类型id") + private String categoryId; + @ApiModelProperty(value = "所属模型id") + private String modelId; + @ApiModelProperty(value = "流程id") + private String procdefId; + + public Wrapper makeQueryWrapper() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (ChkUtil.isNotNull(name)) { + queryWrapper.like("NAME", name); + } + if (ChkUtil.isNotNull(modelName)) { + queryWrapper.like("model.NAME_", modelName); + } + if (ChkUtil.isNotNull(categoryId)) { + queryWrapper.eq("CATEGORY_ID", categoryId); + } + if (ChkUtil.isNotNull(modelId)) { + queryWrapper.eq("MODEL_ID", modelId); + } + if (ChkUtil.isNotNull(procdefId)) { + queryWrapper.eq("proc.ID_", procdefId); + } + queryWrapper.eq("IS_DELETED", 0); + queryWrapper.orderByDesc("CREATE_TIME"); + return queryWrapper; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/Form.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/Form.java new file mode 100644 index 00000000..109c8a34 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/Form.java @@ -0,0 +1,93 @@ +package com.ydw.bat.wkflow.business_main.form.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_form") +@ApiModel(value = "Form对象", description = "") +public class Form { + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "表单名称") + @TableField("NAME") + private String name; + + @ApiModelProperty(value = "表单的同类标识", example = "同时下发到 人事+财务,人事与财务的审批单互相不可见,通过show_key做标识区分") + @TableField("SHOW_KEY") + private String showKey; + + @ApiModelProperty(value = "编码 排序用") + @TableField("CODE") + private String code; + + @ApiModelProperty(value = "所属模型id") + @TableField("MODEL_ID") + private String modelId; + + @ApiModelProperty(value = "所属类型id") + @TableField("CATEGORY_ID") + private String categoryId; + + @ApiModelProperty(value = "运行类型: html or json") + @TableField("RUN_TYPE") + private String runType; + + @ApiModelProperty(value = "原版网页json") + @TableField("WIDGET_JSON") + private String widgetJson; + + @ApiModelProperty(value = "生成表单json") + @TableField("JSON") + private String json; + + @ApiModelProperty(value = "动态注入json 预留") + @TableField("JSON_EVAL") + private String jsonEval; + + @ApiModelProperty(value = "同步生成html代码") + @TableField("HTML") + private String html; + + @ApiModelProperty(value = "同步生成只读 html代码") + @TableField("HTML_READONLY") + private String htmlReadonly; + + @ApiModelProperty(value = "流程名称") + @TableField(exist = false) + private String modelName; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormAccessory.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormAccessory.java new file mode 100644 index 00000000..f43c27e0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormAccessory.java @@ -0,0 +1,69 @@ +package com.ydw.bat.wkflow.business_main.form.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * 表单附件(表单模板) + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_form_accessory") +@ApiModel(value="FormAccessory对象", description="") +public class FormAccessory implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "表单ID") + @TableField("FORM_ID") + private String formId; + + @ApiModelProperty(value = "模板名称") + @TableField("FILE_NAME") + private String fileName; + + @ApiModelProperty(value = "模板文件ID") + @TableField("FILE_ID") + private String fileId; + + @ApiModelProperty(value = "排序") + @TableField("SORTZ") + private int sortz; + + @ApiModelProperty(value = "是否必须上传: 是 or 否") + @TableField("IS_REQUIRED") + private String isRequired; + + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormVariable.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormVariable.java new file mode 100644 index 00000000..b25916c1 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/entity/FormVariable.java @@ -0,0 +1,70 @@ +package com.ydw.bat.wkflow.business_main.form.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-19 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_form_variable") +@ApiModel(value="FormVariable对象", description="") +public class FormVariable implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(System.currentTimeMillis()); + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "模板id") + @TableField("MODEL_ID") + private String modelId; + + @ApiModelProperty(value = "模板节点id") + @TableField("RESOURCE_ID") + private String resourceId; + + @ApiModelProperty(value = "办理时长") + @TableField("HANDLE_TIME") + private String handleTime; + + @ApiModelProperty(value = "超时处理方式") + @TableField("HANDLE_TYPE") + private String handleType; + + @ApiModelProperty(value = "表单id") + @TableField("FORM_ID") + private String formId; + + @ApiModelProperty(value = "是否第一个节点: 是 or 否") + @TableField("IS_FIRST") + private String isFirst; +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormAccessoryMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormAccessoryMapper.java new file mode 100644 index 00000000..035e2c9d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormAccessoryMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.form.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ydw.bat.wkflow.business_main.form.entity.FormAccessory; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +public interface FormAccessoryMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormMapper.java new file mode 100644 index 00000000..29de6aac --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormMapper.java @@ -0,0 +1,25 @@ +package com.ydw.bat.wkflow.business_main.form.mapper; + +import java.util.List; + +import org.apache.ibatis.annotations.Param; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.ydw.bat.wkflow.business_main.form.entity.Form; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface FormMapper extends BaseMapper { + + List selectListPage(IPage formQuery, @Param(Constants.WRAPPER) Wrapper makeQueryWrapper); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormVariableMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormVariableMapper.java new file mode 100644 index 00000000..94e6b57a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/mapper/FormVariableMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.form.mapper; + +import com.ydw.bat.wkflow.business_main.form.entity.FormVariable; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-19 + */ +public interface FormVariableMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormAccessoryService.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormAccessoryService.java new file mode 100644 index 00000000..68cca665 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormAccessoryService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.form.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ydw.bat.wkflow.business_main.form.entity.FormAccessory; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +public interface IFormAccessoryService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormService.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormService.java new file mode 100644 index 00000000..33bd7c25 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormService.java @@ -0,0 +1,22 @@ +package com.ydw.bat.wkflow.business_main.form.service; + +import javax.validation.Valid; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ydw.bat.wkflow.business_main.form.entity.Form; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +public interface IFormService extends IService { + + void saveForm(@Valid Form form); + + void updateForm(@Valid Form form); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormVariableService.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormVariableService.java new file mode 100644 index 00000000..0acbd2a9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/IFormVariableService.java @@ -0,0 +1,18 @@ +package com.ydw.bat.wkflow.business_main.form.service; + +import com.ydw.bat.wkflow.business_main.form.entity.FormVariable; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-19 + */ +public interface IFormVariableService extends IService { + + void createAndUpdateFormVariable(byte[] bytes, String modelId); + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormAccessoryServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormAccessoryServiceImpl.java new file mode 100644 index 00000000..489e94f9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormAccessoryServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.form.service.impl; + +import com.ydw.bat.wkflow.business_main.form.entity.FormAccessory; +import com.ydw.bat.wkflow.business_main.form.mapper.FormAccessoryMapper; +import com.ydw.bat.wkflow.business_main.form.service.IFormAccessoryService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-13 + */ +@Service +public class FormAccessoryServiceImpl extends ServiceImpl implements IFormAccessoryService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormServiceImpl.java new file mode 100644 index 00000000..ffacdec0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormServiceImpl.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.business_main.form.service.impl; + +import javax.validation.Valid; + +import org.activiti.engine.RepositoryService; +import org.activiti.engine.repository.Model; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.mapper.FormMapper; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Service +public class FormServiceImpl extends ServiceImpl implements IFormService { + + @Autowired + private RepositoryService repositoryService; + + @Override + public void saveForm(@Valid Form form) { + // TODO 保存表单 + Model model = repositoryService.createModelQuery().modelId(form.getModelId()).singleResult(); + form.setCategoryId(model.getCategory()); + this.save(form); + } + + @Override + public void updateForm(@Valid Form form) { + // TODO 编辑表单 + Model model = repositoryService.createModelQuery().modelId(form.getModelId()).singleResult(); + + Form formDb = this.getById(form.getObjectId()); + formDb.setName(form.getName()); + formDb.setCode(form.getCode()); + formDb.setModelId(form.getModelId()); + formDb.setCategoryId(model.getCategory()); + formDb.setRunType(form.getRunType()); + this.saveOrUpdate(formDb); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormVariableServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormVariableServiceImpl.java new file mode 100644 index 00000000..a487e128 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/form/service/impl/FormVariableServiceImpl.java @@ -0,0 +1,130 @@ +package com.ydw.bat.wkflow.business_main.form.service.impl; + +import java.io.IOException; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.form.entity.FormVariable; +import com.ydw.bat.wkflow.business_main.form.mapper.FormVariableMapper; +import com.ydw.bat.wkflow.business_main.form.service.IFormVariableService; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-19 + */ +@Service +public class FormVariableServiceImpl extends ServiceImpl + implements IFormVariableService { + + @Autowired + private ObjectMapper objectMapper; + + @Transactional + @Override + public void createAndUpdateFormVariable(byte[] bytes, String modelId) { + // TODO 生成/更新 模板变量 + // 根据modelId获取 FormVariable对象列表 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("MODEL_ID", modelId); + List list = this.list(queryWrapper); + for (FormVariable formVariable : list) { + this.removeById(formVariable.getObjectId()); + } + ObjectNode editorJsonNode; + try { + editorJsonNode = (ObjectNode) objectMapper.readTree(new String(bytes, "utf-8")); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + JSONObject json = JsonUtil.jsonStrToJsonObject(editorJsonNode.toString()); + JSONArray childShapes = json.getJSONArray("childShapes"); + if (childShapes == null || childShapes.size() == 0) { + return; + } + String firstTask = null; + for (int i = 0; i < childShapes.size(); i++) { + JSONObject node = childShapes.getJSONObject(i); + // 获取节点类型 + JSONObject stencil = node.getJSONObject("stencil"); + if ("StartNoneEvent".equals(stencil.getString("id"))) { + // 获取outgoing + JSONArray outgoingArr = node.getJSONArray("outgoing"); + JSONObject resource = outgoingArr.getJSONObject(0); + firstTask = this.getFirstUserTaskResourceId(resource.getString("resourceId"), childShapes); + } + if ("UserTask".equals(stencil.getString("id"))) { + // 获取节点id + String resourceId = node.getString("resourceId"); + // 获取属性配置 + JSONObject propJson = node.getJSONObject("properties"); + // 新建表单变量表 + FormVariable formVariable = new FormVariable(); + formVariable.setFormId(propJson.getString("formkeydefinition")); + formVariable.setHandleTime(propJson.getString("doduedatedefinition")); + formVariable.setHandleType(propJson.getString("handledatedefinition")); + if(firstTask!=null){ + if (firstTask.equals(resourceId)) { + formVariable.setIsFirst("是"); + }else { + formVariable.setIsFirst("否"); + } + }else{ + formVariable.setIsFirst("否"); + } + formVariable.setModelId(modelId); + formVariable.setResourceId(resourceId); + this.save(formVariable); + } + + } + } + + private String getFirstUserTaskResourceId(String targetResourceId, JSONArray nodes) { + // TODO 获取收个任务resourceId + JSONObject node = this.getResource(targetResourceId, nodes); + if ("UserTask".equals(node.getString("stencil"))) { + return node.getString("resourceId"); + } + JSONArray outgoingArr = node.getJSONArray("outgoing"); + JSONObject resource = outgoingArr.getJSONObject(0); + return this.getFirstUserTaskResourceId(resource.getString("resourceId"), nodes); + } + + private JSONObject getResource(String targetResourceId, JSONArray nodes) { + // TODO 获取节点 + for (int i = 0; i < nodes.size(); i++) { + JSONObject node = nodes.getJSONObject(i); + // 获取节点id + String resourceId = node.getString("resourceId"); + if (targetResourceId.equals(resourceId)) { + // 获取节点类型 + JSONObject stencil = node.getJSONObject("stencil"); + // 获取outgoing + JSONArray outgoingArr = node.getJSONArray("outgoing"); + JSONObject targetNode = new JSONObject(); + targetNode.put("stencil", stencil.getString("id")); + targetNode.put("resourceId", resourceId); + targetNode.put("outgoing", outgoingArr); + return targetNode; + } + } + return null; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/system/controller/SystemController.java b/src/main/java/com/ydw/bat/wkflow/business_main/system/controller/SystemController.java new file mode 100644 index 00000000..20adb66b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/system/controller/SystemController.java @@ -0,0 +1,83 @@ +package com.ydw.bat.wkflow.business_main.system.controller; + +import java.util.List; +import javax.validation.Valid; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.system.service.ISystemService; +import com.ydw.bat.wkflow.business_main.system.entity.System; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-11 + */ +@Api(description = "系统设置") +@RestController +@RequestMapping("/system/system") +public class SystemController { + + @Autowired + private ISystemService iSystemService; + + @ApiOperation(value = "系统设置列表") + @GetMapping("/list") + public Wrapper> list() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.orderBy(true, true, "CREATE_TIME"); + List list = iSystemService.list(); + + return WrapMapper.ok(list); + } + + @ApiOperation(value = "添加系统设置") + @PostMapping("/add") + public Wrapper add(@ApiParam @Valid @RequestBody System system) { + iSystemService.save(system); + + return WrapMapper.ok("保存成功"); + } + + @ApiOperation(value = "删除系统设置") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/delete") + public Wrapper delete(String objectId) { + iSystemService.removeById(objectId); + return WrapMapper.ok("删除成功"); + } + + @ApiOperation(value = "编辑获取系统设置数据") + @ApiImplicitParam(name = "objectId", value = "主键id") + @GetMapping("/edit_form") + public Wrapper editForm(String objectId) { + System system = iSystemService.getById(objectId); + return WrapMapper.ok(system); + } + + @ApiOperation(value = "编辑系统设置") + @PostMapping("/edit") + public Wrapper edit(@Valid @RequestBody System system) { + System systemDb = iSystemService.getById(system.getObjectId()); + systemDb.setName(system.getName()); + systemDb.setValue(system.getValue()); + systemDb.setNote(system.getNote()); + iSystemService.saveOrUpdate(systemDb); + + return WrapMapper.ok("保存成功"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/system/entity/System.java b/src/main/java/com/ydw/bat/wkflow/business_main/system/entity/System.java new file mode 100644 index 00000000..18da5dc4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/system/entity/System.java @@ -0,0 +1,58 @@ +package com.ydw.bat.wkflow.business_main.system.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; +import java.util.Date; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

    + * + *

    + * + * @author 冯晓东 + * @since 2020-03-11 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("t_system") +@ApiModel(value = "System对象", description = "") +public class System implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "OBJECT_ID", type = IdType.UUID) + private String objectId; + + @ApiModelProperty(value = "创建时间") + @TableField("CREATE_TIME") + private Date createTime = new Date(java.lang.System.currentTimeMillis()); + + @ApiModelProperty(value = "是否被删除(0:否;1:是)") + @TableLogic(value = "0", delval = "1") + @TableField("IS_DELETED") + private int isDeleted; + + @ApiModelProperty(value = "设置对象") + @TableField("NAME") + private String name; + + @ApiModelProperty(value = "值") + @TableField("VALUE") + private String value; + + @ApiModelProperty(value = "备注") + @TableField("NOTE") + private String note; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/system/mapper/SystemMapper.java b/src/main/java/com/ydw/bat/wkflow/business_main/system/mapper/SystemMapper.java new file mode 100644 index 00000000..a0ee3839 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/system/mapper/SystemMapper.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.system.mapper; + +import com.ydw.bat.wkflow.business_main.system.entity.System; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

    + * Mapper 接口 + *

    + * + * @author 冯晓东 + * @since 2020-03-11 + */ +public interface SystemMapper extends BaseMapper { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/system/service/ISystemService.java b/src/main/java/com/ydw/bat/wkflow/business_main/system/service/ISystemService.java new file mode 100644 index 00000000..ce6c0a65 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/system/service/ISystemService.java @@ -0,0 +1,16 @@ +package com.ydw.bat.wkflow.business_main.system.service; + +import com.ydw.bat.wkflow.business_main.system.entity.System; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

    + * 服务类 + *

    + * + * @author 冯晓东 + * @since 2020-03-11 + */ +public interface ISystemService extends IService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_main/system/service/impl/SystemServiceImpl.java b/src/main/java/com/ydw/bat/wkflow/business_main/system/service/impl/SystemServiceImpl.java new file mode 100644 index 00000000..c925e5d9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_main/system/service/impl/SystemServiceImpl.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_main.system.service.impl; + +import com.ydw.bat.wkflow.business_main.system.entity.System; +import com.ydw.bat.wkflow.business_main.system.mapper.SystemMapper; +import com.ydw.bat.wkflow.business_main.system.service.ISystemService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

    + * 服务实现类 + *

    + * + * @author 冯晓东 + * @since 2020-03-11 + */ +@Service +public class SystemServiceImpl extends ServiceImpl implements ISystemService { + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormEditorController.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormEditorController.java new file mode 100644 index 00000000..dc062b8d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormEditorController.java @@ -0,0 +1,130 @@ +package com.ydw.bat.wkflow.business_wkflow.form.controller; + +import javax.annotation.Resource; + +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; +import com.ydw.bat.wkflow.business_wkflow.form.dto.FormPreviewDto; +import com.ydw.bat.wkflow.util.WebUtil; +import com.ydw.bat.wkflow.util.form.FormReadTools; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "表单同步、调试、保存") +@RestController +@RequestMapping("/form/editor") +public class FormEditorController extends BaseAction { + + @Autowired + private IFormService formService; + @Resource + private TaskService taskService; + + @ApiOperation(value = "将json 数据同步并生成 html") + @GetMapping("/sync") + public Wrapper sync(@ApiParam("要同步的表单ID") String form_id) { + Form form = formService.getById(form_id); + // 替换表单提交文件 + form.setHtml(FormReadTools.replaceSubmitModel(form.getJson())); + // 替换表单只读文件 + form.setHtmlReadonly(FormReadTools.replaceReadModel(form.getJson())); + formService.saveOrUpdate(form); + + return WrapMapper.ok("同步成功!"); + } + + @ApiOperation(value = "将html设置到session中") + @PostMapping("/setToSession") + public Wrapper setToSession(FormPreviewDto formPreviewDto) { + WebUtil.getSession().setAttribute("html", formPreviewDto.getHtml()); + return WrapMapper.ok(); + } + + @ApiOperation(value = "预览接口") + @GetMapping("/preview") + public String preview() { + String html = (String) WebUtil.getSession().getAttribute("html"); + WebUtil.getSession().setAttribute("html", null); + return html; + } + + @ApiOperation(value = "更新html的值") + @PostMapping("/updateHtml") + public Wrapper updateHtml(FormPreviewDto formPreviewDto) { + String formId = formPreviewDto.getFormId(); + if (ChkUtil.isNotNull(formPreviewDto.getTaskId()) && !"null".equals(formPreviewDto.getTaskId())) { + Task task = taskService.createTaskQuery().taskId(formPreviewDto.getTaskId()).singleResult(); + formId = task.getFormKey(); + } + Form form = formService.getById(formId); + form.setHtml(formPreviewDto.getHtml()); + formService.saveOrUpdate(form); + return WrapMapper.ok(); + } + + @ApiOperation(value = "更新只读html的值") + @PostMapping("/updateHtmlReadonly") + public Wrapper updateHtmlReadonly(FormPreviewDto formPreviewDto) { + String formId = formPreviewDto.getFormId(); + if (ChkUtil.isNotNull(formPreviewDto.getTaskId()) && !"null".equals(formPreviewDto.getTaskId())) { + Task task = taskService.createTaskQuery().taskId(formPreviewDto.getTaskId()).singleResult(); + formId = task.getFormKey(); + } + Form form = formService.getById(formId); + form.setHtmlReadonly(formPreviewDto.getHtml()); + formService.saveOrUpdate(form); + return WrapMapper.ok(); + } + + @ApiOperation(value = "获取表单html") + @GetMapping("/getFormHtml") + public String getFormHtml(FormPreviewDto formPreviewDto) { + String formId = formPreviewDto.getFormId(); + if (ChkUtil.isNotNull(formPreviewDto.getTaskId()) && !"null".equals(formPreviewDto.getTaskId())) { + Task task = taskService.createTaskQuery().taskId(formPreviewDto.getTaskId()).singleResult(); + formId = task.getFormKey(); + } + Form form = formService.getById(formId); + if (ChkUtil.isNull(form.getHtml())) { + return "您还没有同步表单,请先同步表单"; + } + return form.getHtml(); + } + + @ApiOperation(value = "获取表单只读html") + @GetMapping("/getFormHtmlReadonly") + public String getFormHtmlReadonly(FormPreviewDto formPreviewDto) { + String formId = formPreviewDto.getFormId(); + if (ChkUtil.isNotNull(formPreviewDto.getTaskId()) && !"null".equals(formPreviewDto.getTaskId())) { + Task task = taskService.createTaskQuery().taskId(formPreviewDto.getTaskId()).singleResult(); + formId = task.getFormKey(); + } + Form form = formService.getById(formId); + if (ChkUtil.isNull(form.getHtml())) { + return "您还没有同步表单,请先同步表单"; + } + return form.getHtmlReadonly(); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormJsonController.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormJsonController.java new file mode 100644 index 00000000..a61d62b9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormJsonController.java @@ -0,0 +1,144 @@ +package com.ydw.bat.wkflow.business_wkflow.form.controller; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; +import com.ydw.bat.wkflow.business_wkflow.form.dto.FormJsonDto; +import com.ydw.bat.wkflow.business_wkflow.form.service.FormValsService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; + +/** + *

    + * 获取表单数据 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "获取表单数据") +@RestController +@RequestMapping("/form/json") +public class FormJsonController extends BaseAction { + + @Resource + private TaskService taskService; + @Autowired + private IFormService formService; + @Autowired + private FormValsService formValsService; + + @ApiOperation(value = "获取表单") + @ApiImplicitParam(name = "kid", value = "表单id") + @GetMapping("/init_form") + public Wrapper init_form(String kid) { + Form formPo = formService.getById(kid); + if (ChkUtil.isNull(formPo.getWidgetJson())) { + formPo.setWidgetJson(formPo.getJson()); + formService.updateById(formPo); + } + String jsonStr = formPo.getWidgetJson(); + JSONObject json = JsonUtil.jsonStrToJsonObject(jsonStr); + if (json == null) { + json = new JSONObject(); + } + return WrapMapper.ok(json.toJSONString()); + } + + @ApiOperation(value = "保存表单") + @PostMapping("/save") + public Wrapper save(@Valid @RequestBody FormJsonDto formJsonDto) { + Form formPo = formService.getById(formJsonDto.getKid()); + formPo.setJson(formJsonDto.getJson()); + formPo.setWidgetJson(formJsonDto.getWidget_json()); + formService.updateById(formPo); + return WrapMapper.ok("表单设置成功"); + } + + @ApiOperation(value = "获取表单提交数据") + @ApiImplicitParam(name = "task_id", value = "任务id") + @GetMapping("/get_json_new") + public Wrapper get_json_new(String task_id, String form_id) { + Form formPo = null; + String values = "{}"; + if (ChkUtil.isNotNull(task_id) && !"null".equals(task_id)) { + Task task = taskService.createTaskQuery().taskId(task_id).singleResult(); + // 1. 获取表单参数 + String form_key = task.getFormKey(); + formPo = formService.getById(form_key); + // 2.1 加载草稿 + Datas formValsPo = formValsService.getFormValByTaskId(task_id); + + // 2.2 获取上次表单提交数据 -->改为-->如果是被打回来的表单,加载上一次添加的值,用于修改 + if (formValsPo == null) { + formValsPo = formValsService.getPreFormVals(task.getProcessInstanceId(), form_key); + } + if (formValsPo != null) { + values = formValsPo.getFormValsJson(); + } + Map processVariables = task.getProcessVariables(); + } else { + formPo = formService.getById(form_id); + } + + // 3.组合 + JSONObject result = new JSONObject(); + result.put("form", formPo); + result.put("values", values); + return WrapMapper.ok(result); + } + + @ApiOperation(value = "获取表单") + @ApiImplicitParam(name = "form_key", value = "表单id") + @GetMapping("/get_json_formkey") + public Wrapper get_json_formkey(String form_key) { + Form formPo = formService.getById(form_key); + // 2.获取上次表单提交数据 + Map variables = new HashMap<>(); + + // 3.组合 + JSONObject result = new JSONObject(); + result.put("form", formPo); + result.put("values", variables); + return WrapMapper.ok(result); + } + + @ApiOperation(value = "获取表单html") + @ApiImplicitParams({ @ApiImplicitParam(name = "task_id", value = "任务id"), + @ApiImplicitParam(name = "form_id", value = "表单id") }) + @GetMapping("/getHtml") + public String getHtml(String task_id, String form_id) { + if (ChkUtil.isNotNull(task_id) && !"null".equals(task_id)) { + Task task = taskService.createTaskQuery().taskId(task_id).singleResult(); + form_id = task.getFormKey(); + } + Form formPo = formService.getById(form_id); + + return formPo.getHtml(); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormSubmitController.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormSubmitController.java new file mode 100644 index 00000000..53e551f4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormSubmitController.java @@ -0,0 +1,71 @@ +package com.ydw.bat.wkflow.business_wkflow.form.controller; + +import javax.annotation.Resource; +import javax.validation.Valid; + +import org.activiti.engine.TaskService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_wkflow.form.dto.FormSubmitDto; +import com.ydw.bat.wkflow.business_wkflow.form.service.FormValsService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "表单提交处理") +@RestController +@RequestMapping("/form/workflow") +public class FormSubmitController extends BaseAction { + + @Resource + private TaskService taskService; + @Autowired + private FormValsService formValsService; + + @ApiOperation(value = "保存草稿") + @PostMapping("/saveDoc") + public Wrapper saveDoc(@Valid @RequestBody FormSubmitDto formSubmitDto) { + String form = formSubmitDto.getForm(); + + logger.info("表单保存草稿..."); + JSONObject formJson = JsonUtil.jsonStrToJsonObject(form); + logger.info("formJson--{}", formJson); + // 保存表单以及表单的值 + formValsService.saveFormVals(formSubmitDto, null); + + logger.info("表单保存草稿成功!"); + return WrapMapper.ok("保存成功!"); + } + + @ApiOperation(value = "提交") + @PostMapping("/submit") + public Wrapper submit(@Valid @RequestBody FormSubmitDto formSubmitDto) { + String result = ""; + if (ChkUtil.isNotNull(formSubmitDto.getTask_id()) && !"null".equals(formSubmitDto.getTask_id())) { + // 通过任务进入任务页面提交 + result = formValsService.taskSubmit(formSubmitDto); + }else { + // 直接通过菜单进入任务页面提交 + result = formValsService.startTask(formSubmitDto); + } + return WrapMapper.ok(result); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormValsController.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormValsController.java new file mode 100644 index 00000000..678eae9a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/controller/FormValsController.java @@ -0,0 +1,98 @@ +package com.ydw.bat.wkflow.business_wkflow.form.controller; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.alibaba.fastjson.JSONObject; +import com.tmsps.fk.common.base.action.BaseAction; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; +import com.ydw.bat.wkflow.business_wkflow.form.service.FormValsService; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +/** + *

    + * 前端控制器 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@Api(description = "表单提交处理") +@RestController +@RequestMapping("/form/vals") +public class FormValsController extends BaseAction { + + @Resource + private TaskService taskService; + @Autowired + private IDatasService datasService; + @Autowired + private FormValsService formValsService; + @Autowired + private IFormService formService; + + @ApiOperation(value = "获取已填写的表单数量") + @ApiImplicitParam(name = "task_id", value = "任务id") + @GetMapping("/get_forms") + public Wrapper>> get_forms(String task_id) { + Task task = taskService.createTaskQuery().taskId(task_id).singleResult(); + if (task == null) { + return WrapMapper.ok(); + } + + logger.info(task.toString()); + + String form_key = task.getFormKey(); + Form formPo = formService.getById(form_key); + + Datas formValsPo = formValsService.getFormValByTaskId(task_id); + + List> allBeforFormsList = new ArrayList<>(); + if (formValsPo != null) { + allBeforFormsList = formValsService.getAllBeforForms(task.getProcessInstanceId(), formValsPo.getSortz(), + formPo.getShowKey()); + } else { + allBeforFormsList = formValsService.getAllBeforForms(task.getProcessInstanceId(), task_id, + formPo.getShowKey()); + } + + return WrapMapper.ok(allBeforFormsList); + } + + @ApiOperation(value = "获取已填写的表单") + @ApiImplicitParam(name = "form_val_kid", value = "表单提交数据对象id") + @GetMapping("/get_json_formval") + public Wrapper get_json_formval(String form_val_kid) { + Datas formVals = datasService.getById(form_val_kid); + + JSONObject result = new JSONObject(); + result.put("formVals", formVals); + return WrapMapper.ok(result); + } + + @ApiOperation(value = "获取已填写的表单") + @ApiImplicitParam(name = "form_val_kid", value = "表单提交数据对象id") + @GetMapping("/getHtmlReadonly") + public String getHtmlReadonly(String form_val_kid) { + Datas formVals = datasService.getById(form_val_kid); + return formVals.getHtmlReadonly(); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormJsonDto.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormJsonDto.java new file mode 100644 index 00000000..6d77118b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormJsonDto.java @@ -0,0 +1,21 @@ +package com.ydw.bat.wkflow.business_wkflow.form.dto; + +import javax.validation.constraints.NotBlank; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "FormJsonDto对象", description = "") +@Data +public class FormJsonDto { + + @NotBlank + @ApiModelProperty(value = "表单ID") + private String kid; + @ApiModelProperty(value = "表单设计的json值") + private String widget_json; + @ApiModelProperty(value = "表单显示的json值") + private String json; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormPreviewDto.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormPreviewDto.java new file mode 100644 index 00000000..1a8ef983 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormPreviewDto.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.business_wkflow.form.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@ApiModel(value = "FormPreviewDto表单预览对象", description = "") +@Data +public class FormPreviewDto { + + @ApiModelProperty(value = "表单预览的html") + private String html; + + @ApiModelProperty(value = "表单id") + private String formId; + + @ApiModelProperty(value = "任务id") + private String taskId; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormSubmitDto.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormSubmitDto.java new file mode 100644 index 00000000..2b390b4d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/dto/FormSubmitDto.java @@ -0,0 +1,23 @@ +package com.ydw.bat.wkflow.business_wkflow.form.dto; + +import javax.validation.constraints.NotBlank; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel(value = "FormSubmitDto对象", description = "") +public class FormSubmitDto { + + @ApiModelProperty(value = "任务ID") + private String task_id; + @ApiModelProperty(value = "表单ID") + private String form_id; + @NotBlank + @ApiModelProperty(value = "表单值json") + private String form; + @ApiModelProperty(value = "附件上传列表") + private String form_files_json; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormDuplicateService.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormDuplicateService.java new file mode 100644 index 00000000..0602f80a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormDuplicateService.java @@ -0,0 +1,109 @@ +package com.ydw.bat.wkflow.business_wkflow.form.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.tmsps.fk.common.util.ChkUtil; +import com.ydw.bat.wkflow.business_wkflow.task.service.TaskInjectService; +import com.ydw.bat.wkflow.util.SessionTool; + +/** + * 表单去重 + * + * @author Administrator + * + */ +@Service +public class FormDuplicateService { + + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private TaskService taskService; + @Autowired + private TaskInjectService taskInjectService; + @Autowired + private JdbcTemplate jt; + + // 表单去重 + public void doDuplicateTask(String processInstanceId) { + // 1. 找到当前task + List list = taskService.createTaskQuery().processInstanceId(processInstanceId).list(); + // 0 或者 会签任务 多task 直接返回 + if (list.size() == 0 || list.size() > 1) { + return; + } + Task task = list.get(0); + logger.info("新打开的TaskId-->{}", task.getId()); + + // 3.对比执行人是否一样 || 判断角色是否含有当前人员 + boolean isSamplePerson = isSamplePerson(task); + + if (isSamplePerson) { + logger.info("检测到执行人相同,自动完成审批."); + + task.setAssignee(SessionTool.getSessionAdminId()); + task.setDescription("自动去重跳过"); + taskService.saveTask(task); + // 关闭task + taskService.complete(task.getId()); + // 动态注入下个节点变量 + taskInjectService.injectDynamicData(task); + } + } + + private boolean isSamplePerson(Task task) { + String adminId = SessionTool.getSessionAdminId(); + if (ChkUtil.isNull(adminId) || task == null) { + return false; + } + if (adminId.equals(task.getAssignee())) { + return true; + } + List groupList = findGroupList(task.getId()); + for (String groupId : groupList) { + if (findInfo(groupId, adminId)) { + return true; + } + } + return false; + } + + // 查询角色列表 + public List findGroupList(String taskId) { + String sql = "select t.GROUP_ID_ groupId from ACT_HI_IDENTITYLINK t where t.TASK_ID_=? "; + List> list = jt.queryForList(sql, taskId); + + List groupList = new ArrayList<>(); + for (Map map : list) { + groupList.add(map.get("groupId") + ""); + } + return groupList; + } + + /** + * 根据角色号+用户号, 查询此人是否是同一个人 + * + * @param roleId + * @param userId + * @return + */ + public boolean findInfo(String roleId, String userId) { + if (ChkUtil.isNull(roleId) || ChkUtil.isNull(userId)) { + return false; + } + String sql = "select * from t_role_user t where t.status=0 and t.role_id=? and t.user_id=? "; + List> list = jt.queryForList(sql, roleId, userId); + return list.size() > 0; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormValsService.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormValsService.java new file mode 100644 index 00000000..f7c8491d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/FormValsService.java @@ -0,0 +1,340 @@ +package com.ydw.bat.wkflow.business_wkflow.form.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.validation.Valid; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.RepositoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.repository.Model; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.category.entity.Category; +import com.ydw.bat.wkflow.business_main.category.service.ICategoryService; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.mapper.HiDatasMapper; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.business_main.datas.service.IHiDatasService; +import com.ydw.bat.wkflow.business_main.form.entity.Form; +import com.ydw.bat.wkflow.business_main.form.service.IFormService; +import com.ydw.bat.wkflow.business_wkflow.form.dto.FormSubmitDto; +import com.ydw.bat.wkflow.business_wkflow.task.service.TaskInjectService; +import com.ydw.bat.wkflow.util.SessionTool; + +/** + * 表单值处理 + * + * @author 冯晓东 + * + */ +@Service +public class FormValsService { + + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private RuntimeService runtimeService; + @Autowired + private HistoryService historyService; + @Autowired + private TaskService taskService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private JdbcTemplate jt; + + @Autowired + private IFormService formService; + @Autowired + private ICategoryService categoryService; + @Autowired + private IDatasService datasService; + @Autowired + private IHiDatasService hiDatasService; + + @Autowired + private FormDuplicateService formDuplicateService; + @Autowired + private ModelJsonService modelJsonService; + @Autowired + private TaskInjectService taskInjectService; + + @Autowired + private HiDatasMapper hiDatasMapper; + + @Transactional + public Datas saveFormVals(@Valid FormSubmitDto formSubmitDto, String resourceId) { + String task_id = formSubmitDto.getTask_id(); + Task task = taskService.createTaskQuery().taskId(task_id).singleResult(); + + // 1. 获取表单参数 + String form_key = task.getFormKey(); + Form formPo = formService.getById(form_key); + Category category = categoryService.getById(formPo.getCategoryId()); + // 2.创建表单值 + // 检测是否草稿中 + Datas datas = this.getFormValByTaskId(task_id); + if (datas == null) { + datas = new Datas(); + } + datas.setCategoryId(category.getObjectId()); + datas.setCategoryName(category.getType()); + datas.setFormKid(formPo.getObjectId()); + datas.setShowKey(formPo.getShowKey()); + datas.setFormName(formPo.getName()); + datas.setFormFilesJson(formSubmitDto.getForm_files_json()); + datas.setHtml(formPo.getHtml()); + datas.setHtmlReadonly(formPo.getHtmlReadonly()); + datas.setRunType(formPo.getRunType()); + + // 3.绑定流程 + datas.setAssigner(task.getAssignee());// 赋值操作人 : 改为当前登录用户 + datas.setActiTaskId(task.getId()); + datas.setActiProcInstId(task.getProcessInstanceId()); + datas.setResourceId(resourceId); + + // 4.是否已经有表单流转 + Datas firstFormVals = this.getFirstForm(task.getProcessInstanceId()); + // 如上,按照审批的过程,加排序 + int sortz = this.getFormValsCount(task.getProcessInstanceId()); + datas.setSortz(sortz); + + // 表单json值: 快照 + datas.setFormJson(formPo.getJson()); + // 存储表单值json值:填写的表单值 + datas.setFormValsJson(formSubmitDto.getForm()); + + // 表单类型:填写单 or 审批单 or 流转单 + if (firstFormVals == null || firstFormVals.getFormKid().equals(datas.getFormKid())) { + datas.setType("填写单"); + } else { + datas.setType("审批单"); + } + + // 如果是流转单, 承接的上个id; 比如: 请假单-->销假单 +// datas.setRefer_kid(refer_kid);// 预留接口,目前不知道怎么写 + + // 表单状态: 0 正常 or -100 作废 + if (firstFormVals != null && firstFormVals.getFormKid().equals(datas.getFormKid())) { + // 表单:知道同一类表单,有利于表单重置:statuz为 -100 + firstFormVals.setStatuz(-100); + datasService.updateById(firstFormVals); + } + + datas.setStatuz(0); + datasService.saveOrUpdate(datas); + + return datas; + } + + /** + * .查询第一个表单 + * + * @param processInstanceId + * @return + */ + public Datas getFirstForm(String processInstanceId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("sortz", 0); + queryWrapper.eq("acti_proc_inst_id", processInstanceId); + Datas datas = datasService.getOne(queryWrapper); + return datas; + } + + public List> listFormVals(String processInstanceId) { + String sql = "select t.form_vals_json from t_datas t where t.IS_DELETED=0 and t.acti_proc_inst_id=?"; + List> list = jt.queryForList(sql, processInstanceId); + return list; + } + + public int getFormValsCount(String processInstanceId) { + String sql = "select count(*) cnt from t_datas t where t.IS_DELETED=0 and t.acti_proc_inst_id=?"; + Number cnt = (Number) jt.queryForMap(sql, processInstanceId).get("cnt"); + return cnt.intValue(); + } + + // 查询上一次表单 + public Datas getPreFormVals(String processInstanceId, String form_kid) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("TYPE", "填写单"); + queryWrapper.eq("ACTI_PROC_INST_ID", processInstanceId); + queryWrapper.eq("FORM_KID", form_kid); + List list = datasService.list(queryWrapper); + if (list.size() > 0) { + return list.get(0); + } else { + return null; + } + } + + private String getShowKeySql(String show_key) { + String sql = ""; + if (ChkUtil.isNull(show_key)) { + return sql; + } + sql = " and (show_key is null or show_key='@show_key')".replace("@show_key", show_key); + + return sql; + } + + // 查询之前填写过的表单 + public List> getAllBeforForms(String processInstanceId, int sortz, String show_key) { + String sql = "select * from t_datas t where t.IS_DELETED=0 and t.acti_proc_inst_id=? and t.sortz> list = jt.queryForList(sql, processInstanceId, sortz); + return list; + } + + public List> getAllBeforForms(String processInstanceId, String task_id, String show_key) { + String sql = "select * from t_datas t where t.IS_DELETED=0 and t.acti_proc_inst_id=? and (t.acti_task_id!=? or t.acti_task_id is null) @showKeySql order by t.sortz asc"; + sql = sql.replace("@showKeySql", getShowKeySql(show_key)); + List> list = jt.queryForList(sql, processInstanceId, task_id); + return list; + } + + // 流程撤销 + @Transactional + public void cancelInstance(@Valid String processInstanceId) { + // 删除流程 + runtimeService.deleteProcessInstance(processInstanceId, "用户撤销"); + // 删除历史审批 + historyService.deleteHistoricProcessInstance(processInstanceId); + // 删除库数据 + // UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 + String sql = "update t_datas t set t.IS_DELETED=-100 where t.acti_proc_inst_id=?"; + int update = jt.update(sql, processInstanceId); + logger.info("删除-->{}<--条表单记录", update); + } + + // 查询我填过的/未关联 的表单 + public List> getAllMineFormList(String user_id, String form_kid) { + String sql = "select * from t_datas t where t.IS_DELETED=0 and t.refer_kid is null and t.assigner=? and t.form_kid=? "; + List> list = jt.queryForList(sql, user_id, form_kid); + return list; + } + + // 根据task_id 获取表单 + public Datas getFormValByTaskId(String task_id) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("acti_task_id", task_id); + Datas datas = datasService.getOne(queryWrapper); + return datas; + } + + public String taskSubmit(FormSubmitDto formSubmitDto) { + // TODO 提交任务 + String task_id = formSubmitDto.getTask_id(); + String form = formSubmitDto.getForm(); + // 获取任务 + Task task = taskService.createTaskQuery().taskId(task_id).singleResult(); + if (task == null) { + return "您已提交成功!"; + } + String processInstanceId = task.getProcessInstanceId(); + logger.info("表单提交..."); + task.setAssignee(SessionTool.getSessionAdminId()); + taskService.saveTask(task); + + JSONObject formJson = JsonUtil.jsonStrToJsonObject(form); + Set keySet = formJson.keySet(); + for (String key : keySet) { + Object val = formJson.get(key); + logger.info("{}:{}", key, val); + + taskService.setVariable(task.getId(), key, val); + // 不需要使用了, 已经用 t_datas代替 + // taskService.setVariableLocal(task.getId(), key, val); + } + + // *** 保存表单以及表单的值 , json格式 *** + Datas formValsPo = this.saveFormVals(formSubmitDto, task.getTaskDefinitionKey()); + // 生成工作流当前相关数据记录 + hiDatasService.createHistoryActivitTablesDatas(formValsPo.getObjectId(), processInstanceId); + taskService.complete(task_id); + + // 动态注入 task各种变量参数 + taskInjectService.injectDynamicData(task); + + if ("审批单".equals(formValsPo.getType())) { + logger.info("检查重复审批人, 检测自动去重.暂时不使用."); + // formDuplicateService.doDuplicateTask(processInstanceId); + } + logger.info("根据完成时间,自动设置提醒方式."); + modelJsonService.dueNextTaskPushHandle(processInstanceId); + // 判断流程实例是否完成,若完成则删除相关HiDatas的数据 + this.checkAndDeleteHiDatas(processInstanceId); + return "提交成功!"; + } + + @Transactional + public String startTask(FormSubmitDto formSubmitDto) { + // TODO 启动任务 + // 1. 获取表单参数 + Form formPo = formService.getById(formSubmitDto.getForm_id()); + + // 启动流程 + Model model = repositoryService.createModelQuery().modelId(formPo.getModelId()).singleResult(); + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() + .deploymentId(model.getDeploymentId()).singleResult(); + ProcessInstance process = runtimeService.startProcessInstanceById(processDefinition.getId()); + + Task task = taskService.createTaskQuery().processInstanceId(process.getId()).singleResult(); + String processInstanceId = task.getProcessInstanceId(); + task.setAssignee(SessionTool.getSessionAdminId()); + taskService.saveTask(task); + + // 传入参数 + JSONObject formJson = JsonUtil.jsonStrToJsonObject(formSubmitDto.getForm()); + Set keySet = formJson.keySet(); + for (String key : keySet) { + Object val = formJson.get(key); + logger.info("{}:{}", key, val); + taskService.setVariable(task.getId(), key, val); + } + + formSubmitDto.setTask_id(task.getId()); + // 生成表单提交数据 + Datas formValsPo = this.saveFormVals(formSubmitDto, task.getTaskDefinitionKey()); + // 生成工作流当前相关数据记录 + hiDatasService.createHistoryActivitTablesDatas(formValsPo.getObjectId(), processInstanceId); + taskService.complete(task.getId()); + + // 动态注入 task各种变量参数 + taskInjectService.injectDynamicData(task); + + // 根据完成时间,自动设置提醒方式 + modelJsonService.dueNextTaskPushHandle(processInstanceId); + + // 判断流程实例是否完成,若完成则删除相关HiDatas的数据 + this.checkAndDeleteHiDatas(processInstanceId); + return "提交成功!"; + } + + @Transactional + private void checkAndDeleteHiDatas(String processInstanceId) { + // TODO 判断流程实例是否完成,若完成则删除相关HiDatas的数据 + // 获取流程实例 + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); + if(ChkUtil.isNull(processInstance)) { + // 删除对应的HiDatas + hiDatasMapper.deleteHiDatas(processInstanceId); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/ModelJsonService.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/ModelJsonService.java new file mode 100644 index 00000000..e9ef20f7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/form/service/ModelJsonService.java @@ -0,0 +1,104 @@ +package com.ydw.bat.wkflow.business_wkflow.form.service; + +import java.io.IOException; +import java.util.Calendar; +import java.util.Date; +import java.util.List; +import java.util.Map; + +import org.activiti.engine.RepositoryService; +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; + +@Service +public class ModelJsonService { + + @Autowired + private JdbcTemplate jt; + @Autowired + private TaskService taskService; + @Autowired + private RepositoryService repositoryService; + @Autowired + private ObjectMapper objectMapper; + + // 根据完成时间,自动设置提醒方式. + public void dueNextTaskPushHandle(String processInstanceId) { + // 先找到当前 Task + List list = taskService.createTaskQuery().processInstanceId(processInstanceId).list(); + if (list.size() == 0) { + return; + } + for (Task task : list) { + handleTask(task); + } + + } + + private void handleTask(Task task) { + // 1.定位资源id + String resourceId = task.getTaskDefinitionKey(); + String doduedatedefinition = "0";// 限制时间 + String handledatedefinition = "短信提醒";// 提醒方式 + + // 2. 查找model中的json数据 + String processDefinitionId = task.getProcessDefinitionId();// 例如 qingjia:4:55011 + String processName = processDefinitionId.split(":")[0]; + String sql = "select t.ID_ id from ACT_RE_MODEL t where t.NAME_=?"; + List> list = jt.queryForList(sql, processName); + if (ChkUtil.isNull(list)) { + return; + } + String modelId = list.get(0).get("id") + ""; + + byte[] bytes = repositoryService.getModelEditorSource(modelId); + ObjectNode editorJsonNode; + try { + editorJsonNode = (ObjectNode) objectMapper.readTree(new String(bytes, "utf-8")); + } catch (IOException e) { + e.printStackTrace(); + return; + } + + JSONObject json = JsonUtil.jsonStrToJsonObject(editorJsonNode.toString()); + JSONArray childShapes = json.getJSONArray("childShapes"); + if (childShapes == null || childShapes.size() == 0) { + return; + } + for (int i = 0; i < childShapes.size(); i++) { + JSONObject node = childShapes.getJSONObject(i); + if (resourceId.equals(node.getString("resourceId"))) { + JSONObject propJson = node.getJSONObject("properties"); + doduedatedefinition = propJson.getString("doduedatedefinition"); + handledatedefinition = propJson.getString("handledatedefinition"); + break; + } + } + + int doduedatedefinitionHour = ChkUtil.getInteger(doduedatedefinition); + int handledatedefinitionType = "短信提醒".equals(handledatedefinition) ? 1 : 2; + if (doduedatedefinitionHour <= 0) { + return; + } + + Calendar cal = Calendar.getInstance(); + cal.setTime(new Date()); + cal.add(Calendar.HOUR_OF_DAY, doduedatedefinitionHour); + // 3.查找下个 Task 并设置完成时限 + task.setDueDate(cal.getTime()); + task.setPriority(handledatedefinitionType); + taskService.saveTask(task); + + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/business_wkflow/task/service/TaskInjectService.java b/src/main/java/com/ydw/bat/wkflow/business_wkflow/task/service/TaskInjectService.java new file mode 100644 index 00000000..2e276ebe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/business_wkflow/task/service/TaskInjectService.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.business_wkflow.task.service; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.task.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +/** + * 待办任务注入类,动态修改 Task的assignee等 + * + * @author 冯晓东 + * + */ +@Service +public class TaskInjectService { + + protected Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private RuntimeService runtimeService; + @Autowired + private HistoryService historyService; + + // 动态注入变量参数 + @SuppressWarnings("unused") + public void injectDynamicData(Task task) { + String processInstanceId = task.getProcessInstanceId(); + String executionId = task.getExecutionId(); + // 获取流程实例发起人 + HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processInstanceId).singleResult(); + String startUserId = processInstance.getStartUserId(); + // 存办理人 + String handleper; + try { + + handleper = runtimeService.getVariable(executionId, "handleper") + ""; + handleper = "null".equals(handleper) ? "" : handleper; + } catch (Exception e) { + e.printStackTrace(); + logger.error(e.getLocalizedMessage()); + // 任务已经结束,此时返回 + return; + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/config/DatasTimerController.java b/src/main/java/com/ydw/bat/wkflow/config/DatasTimerController.java new file mode 100644 index 00000000..9053fded --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/config/DatasTimerController.java @@ -0,0 +1,28 @@ +package com.ydw.bat.wkflow.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.web.bind.annotation.RestController; + +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; + +/** + *

    + * 定时判断流程执行情况,超过24小时,删除该流程 + *

    + * + * @author 冯晓东 + * @since 2020-03-10 + */ +@RestController +public class DatasTimerController { + + @Autowired + private IDatasService datasService; + +// @Scheduled(cron = "0 0 0 * * ?") + public void list() { + // TODO 删除超时的流程 +// datasService.deleteOverTimeTasks(); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/config/MybatisPlusConfig.java b/src/main/java/com/ydw/bat/wkflow/config/MybatisPlusConfig.java new file mode 100644 index 00000000..f753daee --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/config/MybatisPlusConfig.java @@ -0,0 +1,28 @@ +package com.ydw.bat.wkflow.config; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; +import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize; + +//Spring boot方式 +@EnableTransactionManagement +@Configuration +@MapperScan("com.ydw.bat.wkflow.business_main.*.mapper") +public class MybatisPlusConfig { + + @Bean + public PaginationInterceptor paginationInterceptor() { + PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); + // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false + // paginationInterceptor.setOverflow(false); + // 设置最大单页限制数量,默认 500 条,-1 不受限制 + // paginationInterceptor.setLimit(500); + // 开启 count 的 join 优化,只针对部分 left join + paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); + return paginationInterceptor; + } +} \ No newline at end of file diff --git a/src/main/java/com/ydw/bat/wkflow/config/SwaggerConfig.java b/src/main/java/com/ydw/bat/wkflow/config/SwaggerConfig.java new file mode 100644 index 00000000..b5173f14 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/config/SwaggerConfig.java @@ -0,0 +1,59 @@ +package com.ydw.bat.wkflow.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.google.common.base.Predicate; + +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * swagger配置 + * + * @author 冯晓东 398479251@qq.com + * + * swagger-ui.html + * + */ +@Configuration +@EnableSwagger2 +public class SwaggerConfig { + + @Bean + public Docket activitiApi() { + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() + .apis(RequestHandlerSelectors.basePackage("com.ydw.bat.wkflow.business_activiti")).paths(allowPaths()) + .build().groupName("activiti接口"); + } + + @Bean + public Docket businessApi() { + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() + .apis(RequestHandlerSelectors.basePackage("com.ydw.bat.wkflow.business_main")).paths(allowPaths()) + .build().groupName("业务接口"); + } + + @Bean + public Docket wkflowApi() { + return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select() + .apis(RequestHandlerSelectors.basePackage("com.ydw.bat.wkflow.business_wkflow")).paths(allowPaths()) + .build().groupName("表单接口"); + } + + private ApiInfo apiInfo() { + Contact contact = new Contact("工作流系统", "http://localhost:17210/bat-wkflow", null); + return new ApiInfoBuilder().contact(contact).title("工作流系统 API").description("activiti接口及工作流相关业务接口") + .version("1.0.0").build(); + } + + private Predicate allowPaths() { + return PathSelectors.any(); + } +} \ No newline at end of file diff --git a/src/main/java/com/ydw/bat/wkflow/config/WebConfig.java b/src/main/java/com/ydw/bat/wkflow/config/WebConfig.java new file mode 100644 index 00000000..ba839a0d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/config/WebConfig.java @@ -0,0 +1,26 @@ +package com.ydw.bat.wkflow.config; + +import org.springframework.context.annotation.Configuration; + +/** + * Web全局配置 + * + * @author 冯晓东 398479251@qq.com + * + */ +@Configuration +public class WebConfig { + /** + * 长度需要>8 + */ + public static final String DESKEY = "des4TbAdminId"; + /** + * 记录 cookie中的session值 + */ + public static final String ADMINSESSION = "ADMINSESSION"; + /** + * 记录 cookie中的session值 + */ + public static final String MEMBERSESSION = "MEMBERSESSION"; + +} diff --git a/src/main/java/com/ydw/bat/wkflow/exception/GlobalExceptionHandler.java b/src/main/java/com/ydw/bat/wkflow/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..75c168fe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/exception/GlobalExceptionHandler.java @@ -0,0 +1,116 @@ +package com.ydw.bat.wkflow.exception; + +import com.tmsps.fk.common.base.enums.ErrorCodeEnum; +import com.tmsps.fk.common.base.exception.BusinessException; +import com.tmsps.fk.common.util.JsonUtil; +import com.tmsps.fk.common.wrapper.WrapMapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import org.activiti.engine.ActivitiException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import com.alibaba.fastjson.JSON; + +/** + * 全局的的异常拦截器 + * + * @author 冯晓东 398479251@qq.com + */ +@RestControllerAdvice +public class GlobalExceptionHandler { + + private Logger log = LoggerFactory.getLogger(getClass()); + + /** + * 参数非法异常. + * + * @return the wrapper + */ + @ExceptionHandler(IllegalArgumentException.class) + @ResponseBody + public Wrapper illegalArgumentException(IllegalArgumentException e) { + log.error("参数非法异常={}", e.getMessage(), e); + return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); + } + + /** + * 参数非法异常. + * + * @return the wrapper + */ + @ExceptionHandler(BindException.class) + @ResponseBody + public Wrapper bindException(BindException e) { + + final StringBuilder errorMsg = new StringBuilder(); + e.getAllErrors().forEach(action -> { + final String fmt = "[%s]%s;"; + String code = JSON.parseObject(JsonUtil.toJson(action.getArguments()[0])).getString("code"); + String msg = String.format(fmt, code, action.getDefaultMessage()); + errorMsg.append(msg); + }); + // log.error("参数非法异常={}", e.getMessage(), e); + return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), errorMsg.toString()); + } + + /** + * 参数非法异常. + * + * @return the wrapper + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseBody + public Wrapper methodArgumentNotValidException(MethodArgumentNotValidException e) { + log.error("参数非法异常={}", e.getMessage(), e); + return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); + } + + /** + * 业务异常. + * + * @return the wrapper + */ + @ExceptionHandler(BusinessException.class) + @ResponseBody + public Wrapper businessException(BusinessException e) { + log.error("业务异常={}", e.getMessage(), e); + return WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage()); + } + + /** + * 全局异常. + * + * @return the wrapper + */ + @ExceptionHandler(Exception.class) + @ResponseBody + public Wrapper exception(Exception e) { + System.err.println(e.getClass()); + log.error("保存全局异常信息 ex={}", e.getMessage(), e); + return WrapMapper.error(e.getMessage()); + } + + /** + * 全局异常. + * + * @return the wrapper + */ + @ExceptionHandler(ActivitiException.class) + @ResponseBody + public Wrapper activitiExceptionNew(Exception e) { + System.err.println(e.getClass()); + if(e.getMessage().indexOf("Exception while invoking TaskListener:")>-1){ + String k = e.getMessage().replaceAll("Exception while invoking TaskListener:",""); + String[] split = e.getMessage().split("Exception while invoking TaskListener:"); + System.err.println(k); + return WrapMapper.error(k); + } + log.error("保存全局异常信息 ex={}", e.getMessage(), e); + return WrapMapper.error(e.getMessage()); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/interceptor/LoginAdminInterceptor.java b/src/main/java/com/ydw/bat/wkflow/interceptor/LoginAdminInterceptor.java new file mode 100644 index 00000000..899ba5cf --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/interceptor/LoginAdminInterceptor.java @@ -0,0 +1,33 @@ +package com.ydw.bat.wkflow.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import com.ydw.bat.wkflow.util.SessionTool; + +/** + * 登陆校验 + * + * @author 冯晓东 398479251@qq.com + * + */ +@Component +public class LoginAdminInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) + throws Exception { + + String adminId = SessionTool.getSessionAdminId(); + System.err.println("----------------"+adminId); + if (adminId == null) { + return false; + } + + return true; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/interceptor/MyWebMvcConfigurer.java b/src/main/java/com/ydw/bat/wkflow/interceptor/MyWebMvcConfigurer.java new file mode 100644 index 00000000..058fa5fe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/interceptor/MyWebMvcConfigurer.java @@ -0,0 +1,20 @@ +package com.ydw.bat.wkflow.interceptor; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * 拦截器配置表 + * + * @author 冯晓东 398479251@qq.com + */ +//@Configuration +public class MyWebMvcConfigurer implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new LoginAdminInterceptor()).addPathPatterns("/cp/**"); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ActivitiConfig.java b/src/main/java/com/ydw/bat/wkflow/listener/ActivitiConfig.java new file mode 100644 index 00000000..051acff0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ActivitiConfig.java @@ -0,0 +1,25 @@ +package com.ydw.bat.wkflow.listener; + +import java.util.ArrayList; +import java.util.List; + +import org.activiti.engine.delegate.event.ActivitiEventListener; +import org.activiti.spring.SpringProcessEngineConfiguration; +import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ActivitiConfig implements ProcessEngineConfigurationConfigurer { + + @Autowired + private GlobalActivitiEventListener globalActivitiEventListener; + + @Override + public void configure(SpringProcessEngineConfiguration processEngineConfiguration) { + List activitiEventListener = new ArrayList(); + activitiEventListener.add(globalActivitiEventListener);// 配置全局监听器 + processEngineConfiguration.setEventListeners(activitiEventListener); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppAfter.java new file mode 100644 index 00000000..3e5b018e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppAfter.java @@ -0,0 +1,69 @@ +package com.ydw.bat.wkflow.listener.AfterTheMeetingManager; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject array = object.getJSONObject("hhglForm"); + boolean flag = true; + if(array.getString("opinion").equals("1")){ + flag=false; + } + + if(!flag){ + delegateTask.setVariable("gjjlFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setMsgType("16"); + array.put("opinionTime",new Date()); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + }else{ + delegateTask.setVariable("gjjlFlag",0); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppFrount.java new file mode 100644 index 00000000..e94cdf70 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/ManagerAppFrount.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.listener.AfterTheMeetingManager; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.business_main.datas.service.impl.BusProcessNameServiceImpl; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + WkFlowSendEmail.sendEmailTodo(delegateTask,"工作组会后管理流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAfter.java new file mode 100644 index 00000000..19ea0ac0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAfter.java @@ -0,0 +1,64 @@ +package com.ydw.bat.wkflow.listener.AfterTheMeetingManager; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class MeetingAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + String dept = object.getJSONObject("prcForm").get("dept").toString(); + + if(delegateTask.getVariable("gjjlUserId")==null){ +// String userByRoleId = lawsUserInfoService.getUserByRoleId(UserRoleEnum.EQSENIORMANAGER.getLable()); + String userByRoleId = object.getJSONObject("hhglForm").getString("usid");; + if(userByRoleId == null){ + throw new ActivitiException("1#2EQ经理不存在,请配置相关角色人员"); + } + delegateTask.setVariable("gjjlUserId",userByRoleId); + } + + JSONObject array = object.getJSONObject("hhglForm"); + if(array.getString("uncommitted").equals("1")){ + delegateTask.setVariable("flag",1); + }else{ + delegateTask.setVariable("flag",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("gjjlUserId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("16"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinAfter.java new file mode 100644 index 00000000..87270719 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinAfter.java @@ -0,0 +1,36 @@ +package com.ydw.bat.wkflow.listener.AfterTheMeetingManager; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class MeetingAppAgeinAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("gjjlUserId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("16"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinFrount.java new file mode 100644 index 00000000..0dd22c52 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppAgeinFrount.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.AfterTheMeetingManager; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class MeetingAppAgeinFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + WkFlowSendEmail.sendEmailTodo(delegateTask,"工作组会后管理流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppFrount.java new file mode 100644 index 00000000..f445d099 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/AfterTheMeetingManager/MeetingAppFrount.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.AfterTheMeetingManager; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class MeetingAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService iBusProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setTaskId(delegateTask.getId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setUserId(delegateTask.getAssignee()); + busBean.save(busProcessNew); + + String prcName = "BZHYHQSQ"+ + new SimpleDateFormat("yyyyMMdd").format(new Date()); + + BusProcessName busProcessName = new BusProcessName(); + busProcessName.setPrcType("16"); + busProcessName.setPrcName(prcName); + iBusProcessNameService.save(busProcessName); +// WkFlowSendEmail.sendEmailTodo(delegateTask,"工作组会后管理流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppAfter.java new file mode 100644 index 00000000..436ab59d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppAfter.java @@ -0,0 +1,70 @@ +package com.ydw.bat.wkflow.listener.BeforeTheMeetingApp; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject array = object.getJSONObject("hqsqForm"); + boolean flag = true; + if(array.getString("opinion").equals("1")){ + flag=false; + } + + if(!flag){ + delegateTask.setVariable("jlspFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("10"); + array.put("opinionTime",new Date()); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + }else{ + delegateTask.setVariable("jlspFlag",0); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppFrount.java new file mode 100644 index 00000000..d88f8089 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/ManagerAppFrount.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.BeforeTheMeetingApp; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); +// + + WkFlowSendEmail.sendEmailTodo(delegateTask,"会前申请流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAfter.java new file mode 100644 index 00000000..60c0f7bb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAfter.java @@ -0,0 +1,72 @@ +package com.ydw.bat.wkflow.listener.BeforeTheMeetingApp; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class MeetingAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String OVERTIME = object.getJSONObject("prcForm").getString("prcDeadline"); + String username = object.getJSONObject("prcForm").getString("createUserName"); + String prcName = object.getJSONObject("hqsqForm").getString("meetingName")+"-会议会前申请流程"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("10"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcType","10"); + object.getJSONObject("prcForm").put("prcName",prcName); + + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + + String dept = object.getJSONObject("prcForm").get("dept").toString();; + if(delegateTask.getVariable("gjjlUserId")==null){ +// String userByRoleId = lawsUserInfoService.getUserByRoleId(UserRoleEnum.EQSENIORMANAGER.getLable()); + String userByRoleId = object.getJSONObject("hqsqForm").getString("usid");; + if(userByRoleId == null){ + throw new ActivitiException("1#2EQ经理不存在,请配置相关角色人员"); + } + delegateTask.setVariable("gjjlUserId",userByRoleId); + } + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("gjjlUserId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("10"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAgeinAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAgeinAfter.java new file mode 100644 index 00000000..09183e34 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppAgeinAfter.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.BeforeTheMeetingApp; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class MeetingAppAgeinAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("gjjlUserId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("10"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppFrount.java new file mode 100644 index 00000000..3550ea88 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/BeforeTheMeetingApp/MeetingAppFrount.java @@ -0,0 +1,32 @@ +package com.ydw.bat.wkflow.listener.BeforeTheMeetingApp; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class MeetingAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } +// WkFlowSendEmail.sendEmailTodo(delegateTask,"会前申请流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppAfter.java new file mode 100644 index 00000000..bad22544 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppAfter.java @@ -0,0 +1,80 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标废止流程<总监审批>--- + */ +public class ChiefInspectorAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //总监审批节点执行人 + List managerList = new ArrayList(); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew("企标工程师"); + for(OrgEO orgEO : managerByOrgId.getData()){ + managerList.add(orgEO.getUsId()); + } + try{ + if(managerList.isEmpty()){ + throw new ActivitiException("企标工程师不存在"); + } + }catch(Exception e){ + throw new ActivitiException("企标工程师不存在"); + } + + String spflag = object.get("chiefInspectorAuditOpinions") == null ? "" : object.get("chiefInspectorAuditOpinions").toString(); + delegateTask.setVariable("zjFlag",spflag); + + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } + object.put("approvalHistory",approvalHistory); + if("0".equalsIgnoreCase(spflag)){ + delegateTask.setVariable("EngineerIds",managerList); + if(managerList != null && !managerList.isEmpty()){ + WorkflowUtil.saveBusProcessNew(delegateTask,managerList,object.toJSONString()); + } + }else{ + String createUser = object.getString("createUser"); + delegateTask.setVariable("draftsUserId",createUser); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{createUser}),object.toJSONString()); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppFrount.java new file mode 100644 index 00000000..f4292c3e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ChiefInspectorAppFrount.java @@ -0,0 +1,58 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标废止流程<总监审批>--- + */ +public class ChiefInspectorAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + //查的是哪 processNew表吗 + //问题:写的代码只是对数据的处理,而无对工作流的直接影响 + //答:service类 继承 基础的vo类 + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + BusProcessNew bus = list.get(0); + bus.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(bus); + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标废止流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,"+busProcessName.getPrcNum()+"-"+ busProcessName.getPrcName() +" 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),"GSRM——【待办任务】[企标废止流程]有您的待办任务",content); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAfter.java new file mode 100644 index 00000000..4dbfb9da --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAfter.java @@ -0,0 +1,75 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标废止流程<主起草人发起流程>--- + */ +public class DraftsmanOpenAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //fo节点执行人 + List foList = new ArrayList(); + + //截止时间 流程描述 创建人 + String OVERTIME = object.getString("prcDeadline"); + String user = object.getString("currentUser"); + String username = object.getString("currentUserName"); + + String standName = object.getString("standName"); + String prcName = standName+"-企标废止"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("7"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + String receivers = object.get("Handler") == null ? "" : object.get("Handler").toString(); + foList.add(receivers); + delegateTask.setVariable("foUserIds",foList); + + if(foList != null && !foList.isEmpty()){ + for(String foUser : foList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(foUser); + busBean.save(busProcessNew); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainAfter.java new file mode 100644 index 00000000..f7a474c4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainAfter.java @@ -0,0 +1,47 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标废止流程<主起草人重新发起>--- + */ +public class DraftsmanOpenAgainAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //fo节点执行人 + List foList = new ArrayList(); + + String receivers = object.get("Handler") == null ? "" : object.get("Handler").toString(); + foList.add(receivers); + delegateTask.setVariable("foUserIds",foList); + + if(foList != null && !foList.isEmpty()){ + WorkflowUtil.saveBusProcessNew(delegateTask,foList,object.toJSONString()); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainFrount.java new file mode 100644 index 00000000..71cc20fc --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenAgainFrount.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标废止流程<主起草人重新发起>--- + */ +public class DraftsmanOpenAgainFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenFrount.java new file mode 100644 index 00000000..24892413 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/DraftsmanOpenFrount.java @@ -0,0 +1,38 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标废止流程<主起草人发起流程>--- + */ +public class DraftsmanOpenFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + +// WkFlowSendEmail.sendEmailTodo(delegateTask,"企标废止流程"); +// +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,"+busProcessName.getPrcNum()+"-"+ busProcessName.getPrcName() +" 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),"GSRM——【待办任务】[企标废止流程]有您的待办任务",content); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppAfter.java new file mode 100644 index 00000000..e00f013a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppAfter.java @@ -0,0 +1,140 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.HistoryService; +import org.activiti.engine.ProcessEngine; +import org.activiti.engine.ProcessEngines; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.task.Task; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标废止流程<企标工程师审批>--- + */ +public class EngineerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + String loginUser = object.get("qbgcsFillUser") == null ? "" : object.get("qbgcsFillUser").toString(); + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + queryWrapper1.isNull("USER_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + one.setUserId(loginUser); + busBean.saveOrUpdate(one); + delegateTask.setAssignee(loginUser); + } + + String spflag = object.get("enterpriseBidEngineerAuditOpinions") == null ? "" : object.get("enterpriseBidEngineerAuditOpinions").toString(); + +// List list = processEngine.getTaskService()//与正在执行的任务管理相关的Service +// .createTaskQuery()//创建任务查询对象 +// /**查询条件(where部分)*/ +// .taskCandidateUser(delegateTask.getAssignee())//组任务的办理人查询 +// /**排序*/ +// .orderByTaskCreateTime().asc()//使用创建时间的升序排列 +// /**返回结果集*/ +// .list();//返回列表 + /** + * 该节点为多实例 + * 1.如果通过,则校验有没有驳回的任务,如果有,则不做任何的数据存储操作,没有的话则进行存储 + * 2.如果驳回,则清空所有通过的任务数据 + */ +// if("1".equalsIgnoreCase(spflag)){ +// QueryWrapper removeQw = new QueryWrapper(); +// removeQw.eq("P_ID",delegateTask.getProcessInstanceId()); +// removeQw.isNull("TASK_ID"); +// busBean.remove(removeQw); +// }else{ +// QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.isNull("TASK_ID"); +// queryWrapper1.eq("MSG_TYPE","disagree"); +// List list = busBean.list(queryWrapper1); +// if(list != null && !list.isEmpty()){ +// spflag = "1"; +// } +// } +// String finalSpFlag = spflag; +// //查询是否还有未完成任务 +// int count = 0; + //代表除了当前任务,没有其他任务了,当前节点的最后一个任务 +// if(count == 1){ +// if("1".equalsIgnoreCase(spflag)){ +// finalSpFlag = "1"; +// }else{ +// QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.isNull("TASK_ID"); +// queryWrapper1.eq("MSG_TYPE","disagree"); +// List tList = busBean.list(queryWrapper1); +// if(tList != null && !tList.isEmpty()){ +// finalSpFlag = "1"; +// }else{ +// finalSpFlag = "0"; +// } +// } +// delegateTask.setVariable("gcsFlag",finalSpFlag); +// } + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } + object.put("approvalHistory",approvalHistory); + + if("1".equalsIgnoreCase(spflag)){ + String createUser = object.getString("createUser"); + delegateTask.setVariable("draftsUserId",createUser); + + WorkflowUtil.saveBusProcessNewApprove(delegateTask, Arrays.asList(new String[]{createUser}),object.toJSONString(),"disagree"); + func1(delegateTask, busBean, object,"1"); + delegateTask.setVariable("gcsFlag",1); + }else { + delegateTask.setVariable("gcsFlag",0); + func1(delegateTask, busBean, object,"0"); + } + } + + private void func1(DelegateTask delegateTask, IBusProcessNewService busBean, JSONObject object,String commitFlag) { + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag(commitFlag); + busBean.saveOrUpdate(one1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppFrount.java new file mode 100644 index 00000000..090e3c24 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/EngineerAppFrount.java @@ -0,0 +1,77 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; + +/** + * ---企标废止流程<企标工程师审批>--- + */ +public class EngineerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew(UserRoleEnum.ENTERPRISESTANDARDENGINEER.getLable()); + if(managerByOrgId.getData()==null || managerByOrgId.getData().size()==0){ + throw new ActivitiException("企标工程师不存在"); + } + + List qbgcs = new ArrayList<>(); + + for(OrgEO orgEO:managerByOrgId.getData()){ + qbgcs.add(orgEO.getUsId()); + } + + delegateTask.addCandidateUsers(qbgcs); + + QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + queryWrapper1.isNull("USER_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标废止流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,"+busProcessName.getPrcNum()+"-"+ busProcessName.getPrcName() +" 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),"GSRM——【待办任务】[企标废止流程]有您的待办任务",content); +// QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.isNull("TASK_ID"); +// List list = busBean.list(queryWrapper1); +// if(list != null && !list.isEmpty()){ +// BusProcessNew bus = list.get(0); +// bus.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(bus); +// } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppAfter.java new file mode 100644 index 00000000..d3de6650 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppAfter.java @@ -0,0 +1,88 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.impl.pvm.delegate.ActivityExecution; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标废止流程--- + */ +public class FoAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //高级经理节点执行人 + List managerList = new ArrayList(); + + String dept = object.get("dept") == null ? "" : object.get("dept").toString(); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + //获取当前节点处理人 + String foUserId = object.getString("foFillUser"); +// String managerUserId = lawsUserInfoService.getUserId(dept, foUserId, UserRoleEnum.SENIORMANAGER.getLable()); + String managerUserId = object.getString("manageId"); + + if(StringUtils.isBlank(managerUserId)){ + throw new ActivitiException("1#2EQ高级经理不存在,请配置相关角色人员"); + } + + managerList.add(managerUserId); + + String spflag = object.get("FOAuditOpinions") == null ? "" : object.get("FOAuditOpinions").toString(); + + delegateTask.setVariable("foFlag",spflag); + + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } + object.put("approvalHistory",approvalHistory); + if("0".equalsIgnoreCase(spflag)){ + delegateTask.setVariable("ManagerUserIds",managerList); + if(managerList != null && !managerList.isEmpty()){ + WorkflowUtil.saveBusProcessNewApprove(delegateTask,managerList,object.toJSONString(),"agree"); + WorkflowUtil.saveToUpdateNew(delegateTask, busBean,"0"); + } + }else{ + String createUser = object.getString("createUser"); + delegateTask.setVariable("draftsUserId",createUser); + WorkflowUtil.saveBusProcessNewApprove(delegateTask,Arrays.asList(new String[]{createUser}),object.toJSONString(),"disagree"); + WorkflowUtil.saveToUpdateNew(delegateTask, busBean,"1"); + + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppFrount.java new file mode 100644 index 00000000..fa719a57 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/FoAppFrount.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标废止流程--- + */ +public class FoAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + BusProcessNew bus = list.get(0); + bus.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(bus); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标废止流程"); +// +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,"+busProcessName.getPrcNum()+"-"+ busProcessName.getPrcName() +" 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),"GSRM——【待办任务】[企标废止流程]有您的待办任务",content); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppAfter.java new file mode 100644 index 00000000..6288823a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppAfter.java @@ -0,0 +1,108 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标废止流程<高级经理审批>--- + */ +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //总监审批节点执行人 + List managerList = new ArrayList(); + + +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew("企标工程师"); +// for(OrgEO orgEO : managerByOrgId.getData()){ +// managerList.add(orgEO.getUsId()); +// } + String managerUserId = object.getString("qbgcs"); + + if(managerUserId != null && !managerUserId.equals("")){ + if(managerUserId.contains(",")){ + managerList = Arrays.asList(managerUserId.split(",")); + }else { + managerList.add(managerUserId); + } + } + + String spflag = object.get("managerAuditOpinions") == null ? "" : object.get("managerAuditOpinions").toString(); + delegateTask.setVariable("jlFlag",spflag); + + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } + object.put("approvalHistory",approvalHistory); + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.eq("USER_ID",delegateTask.getVariable("qbgcs")); + queryWrapper1.isNull("TASK_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if("0".equalsIgnoreCase(spflag)){ + if(one!=null){ + one.setMesg(object.toJSONString()); + busBean.saveOrUpdate(one); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(delegateTask.getVariable("qbgcs").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("angree"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + WorkflowUtil.saveToUpdateNew(delegateTask, busBean,"0"); + + delegateTask.setVariable("EngineerIds",managerList); +// if(managerList != null && !managerList.isEmpty()){ +// WorkflowUtil.saveBusProcessNewApprove(delegateTask,managerList,object.toJSONString(),"agree"); +// WorkflowUtil.saveToUpdateNew(delegateTask, busBean,"0"); +// } + }else{ + String createUser = object.getString("createUser"); + delegateTask.setVariable("draftsUserId",createUser); + WorkflowUtil.saveBusProcessNewApprove(delegateTask,Arrays.asList(new String[]{createUser}),object.toJSONString(),"disagree"); + WorkflowUtil.saveToUpdateNew(delegateTask, busBean,"1"); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppFrount.java new file mode 100644 index 00000000..8ad1ac24 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAbolish/ManagerAppFrount.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAbolish; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标废止流程<高级经理审批>--- + */ +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + BusProcessNew bus = list.get(0); + bus.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(bus); + } +// +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,"+busProcessName.getPrcNum()+"-"+ busProcessName.getPrcName() +" 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),"GSRM——【待办任务】[企标废止流程]有您的待办任务",content); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAfter.java new file mode 100644 index 00000000..81752064 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAfter.java @@ -0,0 +1,91 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +/** + * ---企标制修订流程<起草人编辑>--- + */ +public class DraftsmanEditAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + + //获取会签部门集合 + String deptIds = object.getString("deptInvolvedCountersignature"); + //获取起草人集合 + String qcrIds = object.get("otherDrafter") == null ? "" : object.get("otherDrafter").toString(); + List qcrList = new ArrayList(); + qcrList = Arrays.asList(qcrIds.split(",")); + delegateTask.setVariable("qtqcrList",qcrList); + if(qcrList != null && !qcrList.isEmpty()){ + WorkflowUtil.saveBusProcessNew(delegateTask,qcrList,object.toJSONString()); + } + //其他联络人节点逻辑:会签部门集合中排除掉起草人所在部门,其他部门联络人角色下的人员集合(待补充) + String qtllrIds = object.get("HQBMLLR") == null ? "" : object.get("HQBMLLR").toString(); +// List qtllrList = Arrays.asList(new String[]{"YAJT2SXJNBZDT6ZEFB7R"}); + List qtllrList = Arrays.asList(qtllrIds.split(",")); + List qtllrListNew = new ArrayList<>(); + for(String str:qtllrList){ + String uuid = UUID.randomUUID().toString(); + String llr = str +"|"+uuid.replace("-", ""); + qtllrListNew.add(llr); + } + delegateTask.setVariable("qtllrList",qtllrListNew); + if(qtllrList != null && !qtllrList.isEmpty()){ + WorkflowUtil.saveBusProcessNewForsub(delegateTask,qtllrListNew,object.toJSONString()); + } + + //截止时间 流程描述 创建人 + String OVERTIME = object.getString("prcDeadline"); + String user = object.getString("currentUser"); + String username = object.getString("currentUserName"); + + + String prcName = object.getString("cnName")+"-企标制修订"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("4"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + delegateTask.setVariable("qcrsh",0); + String createUser = object.getString("createUser"); + delegateTask.setVariable("draftsUserId",createUser); + + String deptInvolvedCountersignature = object.getString("deptInvolvedCountersignature"); + List deptInvolvedCountersignatureList = Arrays.asList(deptInvolvedCountersignature.split(",")); + delegateTask.setVariable("sjhqbm",deptInvolvedCountersignatureList); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainAfter.java new file mode 100644 index 00000000..1d2a62c0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainAfter.java @@ -0,0 +1,61 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标制修订流程<起草人编辑>--- + */ +public class DraftsmanEditAgainAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + + //获取会签部门集合 +// String deptIds = object.getString("deptInvolvedCountersignature"); + //获取起草人集合 + String qcrIds = object.get("otherDrafter") == null ? "" : object.get("otherDrafter").toString(); +// List qcrList =(List) delegateTask.getVariable("qtqcrList"); + List qcrList = Arrays.asList(qcrIds.split(",")); + delegateTask.setVariable("qtqcrList",qcrList); + if(qcrList != null && !qcrList.isEmpty()){ + WorkflowUtil.saveBusProcessNew(delegateTask,qcrList,object.toJSONString()); + } +// //其他联络人节点逻辑:会签部门集合中排除掉起草人所在部门,其他部门联络人角色下的人员集合(待补充) +// List qtllrList = Arrays.asList(new String[]{"YAJT2SXJNBZDT6ZEFB7R"}); +// delegateTask.setVariable("qtllrList",qtllrList); +// if(qtllrList != null && !qtllrList.isEmpty()){ +// WorkflowUtil.saveBusProcessNew(delegateTask,qtllrList,object.toJSONString()); +// } + + delegateTask.setVariable("foList",null); + delegateTask.setVariable("foAllList",null); + delegateTask.setVariable("gjjlList",null); + delegateTask.setVariable("qcrsh",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainFrount.java new file mode 100644 index 00000000..97c8c5e4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanEditAgainFrount.java @@ -0,0 +1,33 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订流程<其他起草人审核>--- + */ +public class DraftsmanEditAgainFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineAfter.java new file mode 100644 index 00000000..a72dc053 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineAfter.java @@ -0,0 +1,142 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.sun.tools.corba.se.idl.StringGen; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +/** + * ---企标制修订流程<其他起草人审核>--- + */ +public class DraftsmanExamineAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //FO审批节点执行人 + List userIdList = new ArrayList(); + List userAllIdList = new ArrayList(); + List saveUserIdList = new ArrayList(); + saveUserIdList.add(object.getString("otherFO")); + if(delegateTask.getVariable("foAllList")!=null){ + List list =(List) delegateTask.getVariable("foList"); + List alllist =(List) delegateTask.getVariable("foAllList"); + list.add(object.getString("otherFO")); + alllist.add(object.getString("otherFO")+"|"+object.getString("otherFORoleId")); + delegateTask.setVariable("foList",list); + delegateTask.setVariable("foAllList",alllist); + }else{ + userAllIdList.add(object.getString("otherFO")+"|"+object.getString("otherFORoleId")); + userAllIdList.add(object.getString("FOId")+"|"+object.getString("FORoleId")); + userIdList.add(object.getString("otherFO")); + userIdList.add(object.getString("FOId")); + delegateTask.setVariable("foList",userIdList); + delegateTask.setVariable("foAllList",userAllIdList); + } + + System.out.println(delegateTask.getVariable("foList")); + //其他起草人审核意见 + String spflag = object.get("otherDraftersApproval") == null ? "" : object.get("otherDraftersApproval").toString(); +// delegateTask.setVariable("qcrsh",spflag); + + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + List list = JSONObject.parseArray(approvalHistory.toJSONString(), Object.class); + List objList = new ArrayList<>(); + if(delegateTask.getVariable("approvalHistory")!=null){ + List approvalHistoryList =(List) delegateTask.getVariable("approvalHistory"); + Object obj = list.get(list.size()-1); + ((Map) obj).put("approvalTime",new Date()); + approvalHistoryList.add(obj); + delegateTask.setVariable("approvalHistory",approvalHistoryList); + }else{ + Object obj = list.get(0); + ((Map) obj).put("approvalTime",new Date()); + objList.add(obj); + delegateTask.setVariable("approvalHistory",objList); + } + + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + one.setCommitFlag(spflag); + busBean.saveOrUpdate(one); + + JSONArray approvalHistoryList = new JSONArray(); + + if("1".equalsIgnoreCase(spflag)){ + delegateTask.setVariable("qcrsh",1); + } + boolean flag = false; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + } + if(flag){ + if((int) delegateTask.getVariable("qcrsh")==1){ + //不同意 + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("founange"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + List approvalHistoryListNew =(List) delegateTask.getVariable("approvalHistory"); + object.put("approvalHistory",JSONArray.parseArray(JSON.toJSONString(approvalHistoryListNew))); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getVariable("draftsUserId").toString()); + result.add(busProcessNew); + busBean.saveBatch(result); + }else{ + //同意 + List foList =(List) delegateTask.getVariable("foAllList"); + for(String str:foList){ + String foId = str.split("[|]")[0]; + String foRoleId = str.split("[|]")[1]; + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("foange"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + List approvalHistoryListNew =(List) delegateTask.getVariable("approvalHistory"); + object.put("approvalHistory",JSONArray.parseArray(JSON.toJSONString(approvalHistoryListNew))); + object.put("newFoId",foId); + object.put("newFoRoleId",foRoleId); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(foId); + result.add(busProcessNew); + busBean.saveBatch(result); + } + } + } + + delegateTask.setVariable("fosh",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineFrount.java new file mode 100644 index 00000000..aa45d7f5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/DraftsmanExamineFrount.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订流程<其他起草人审核>--- + */ +public class DraftsmanExamineFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineAfter.java new file mode 100644 index 00000000..a0efb5db --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineAfter.java @@ -0,0 +1,77 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标制修订流程<企标工程师审批>--- + */ +public class EngineerExamineAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String loginUser = object.getString("loginUser"); + + String standFileUpdateFlag = object.getString("standFileReUploadFlag"); + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + queryWrapper1.isNull("USER_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + one.setUserId(loginUser); + if(standFileUpdateFlag.equals("1")){ + one.setCommitFlag("2"); + one.setCommitText("企标文件已重新上传"); + } + busBean.saveOrUpdate(one); + delegateTask.setAssignee(loginUser); + } + +// throw new ActivitiException(""); + + //企标工程师审核意见 +// String spflag = object.get("enterBidEngApproval") == null ? "" : object.get("enterBidEngApproval").toString(); +// delegateTask.setVariable("gcssh",spflag); +// JSONArray approvalHistory = object.getJSONArray("approvalHistory"); +// if(approvalHistory != null && !approvalHistory.isEmpty()){ +// JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); +// approval.put("approvalTime",System.currentTimeMillis()); +// approvalHistory.remove(approvalHistory.size()-1); +// approvalHistory.add(approval); +// } +// object.put("approvalHistory",approvalHistory); +// if("1".equalsIgnoreCase(spflag)){ +// String createUser = object.getString("createUser"); +// delegateTask.setVariable("draftUserId",createUser); +// WorkflowUtil.saveBusProcessNew(delegateTask, Arrays.asList(new String[]{createUser}),object.toJSONString()); +// } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineFrount.java new file mode 100644 index 00000000..22120edc --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/EngineerExamineFrount.java @@ -0,0 +1,100 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * ---企标制修订流程<企标工程师审批>--- + */ +public class EngineerExamineFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busBeanName = SpringContextUtil.getBean(IBusProcessNameService.class); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew(UserRoleEnum.ENTERPRISESTANDARDENGINEER.getLable()); + if(managerByOrgId.getData()==null || managerByOrgId.getData().size()==0){ + throw new ActivitiException("企标工程师不存在"); + } + + List qbgcs = new ArrayList<>(); + + for(OrgEO orgEO:managerByOrgId.getData()){ + qbgcs.add(orgEO.getUsId()); + } + + delegateTask.addCandidateUsers(qbgcs); + + QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.isNull("USER_ID"); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + JSONObject object1 = JSONObject.parseObject(one1.getMesg()); + object1.put("gjjlRoleId",delegateTask.getVariable("gjjlRoleId2")); + one1.setMesg(object1.toJSONString()); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + //是否退回过 0未退回 1退回 passBackFlag 退回过给责任人发送邮件 + String msg = one1.getMesg(); + JSONObject object = JSONObject.parseObject(msg); + if(object.getString("passBackFlag").equals("1")){ + + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("PRC_ID", delegateTask.getProcessInstanceId()); + BusProcessName one = busBeanName.getOne(queryWrapper2); + + if(delegateTask.getVariable("ApproveLlrList")!=null){ + List strList = (List) delegateTask.getVariable("ApproveLlrList"); +// List strList =(List) delegateTask.getVariable("foList"); + Set result = new HashSet(strList); + for(String user:result){ + PersonMsgEO personMsgEO = new PersonMsgEO(); + personMsgEO.setMsgTitle(one.getPrcName()+one.getPrcNum()+" 主起草人发起企标已进行修改,高级经理已完成审核,请联系主起草人确认。"); + personMsgEO.setMsgContent(one.getPrcName()+one.getPrcNum()+"主起草人发起企标已进行修改,高级经理已完成审核,请联系主起草人确认。"); + personMsgEO.setUserId(user); + personMsgEO.setMsgType("TEXT"); + lawsUserInfoService.saveNewPersonMsg(personMsgEO); + } + ResponseMessage responseMessage = lawsUserInfoService.sendMail(result, one.getPrcName() + one.getPrcNum() + "主起草人发起企标已进行修改,高级经理已完成审核,请联系主起草人确认。"); + } + + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订流程"); + +// throw new ActivitiException(""); +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineAfter.java new file mode 100644 index 00000000..e135a7b5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineAfter.java @@ -0,0 +1,126 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +/** + * ---企标制修订流程--- + */ +public class FoExamineAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //其他审核人审核节点执行人集合 + List userIdList = new ArrayList(); + List saveUserIdList = new ArrayList(); + saveUserIdList.add(object.getString("manageId")); + if(delegateTask.getVariable("gjjlList")!=null){ + List list =(List) delegateTask.getVariable("gjjlList"); + list.add(object.getString("manageId")); + delegateTask.setVariable("gjjlList",list); + }else{ + userIdList.add(object.getString("manageId")); + delegateTask.setVariable("gjjlList",saveUserIdList); + } + + //FO审核意见 + String spflag = object.get("FOApproval") == null ? "" : object.get("FOApproval").toString(); + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + List list = JSONObject.parseArray(approvalHistory.toJSONString(), Object.class); + List objList = new ArrayList<>(); + if(delegateTask.getVariable("approvalHistory")!=null){ + List approvalHistoryList =(List) delegateTask.getVariable("approvalHistory"); + Object obj = list.get(list.size()-1); + ((Map) obj).put("approvalTime",new Date()); + approvalHistoryList.add(obj); + delegateTask.setVariable("approvalHistory",approvalHistoryList); + }else{ + Object obj = list.get(0); + ((Map) obj).put("approvalTime",new Date()); + objList.add(obj); + delegateTask.setVariable("approvalHistory",objList); + } + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + one.setCommitFlag(spflag); + busBean.saveOrUpdate(one); + + JSONArray approvalHistoryList = new JSONArray(); + + if("1".equalsIgnoreCase(spflag)){ + delegateTask.setVariable("fosh",1); + } + + boolean flag = false; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + } + + if(flag){ + if((int) delegateTask.getVariable("fosh")==1){ + //不同意 + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("founange2"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + List approvalHistoryListNew =(List) delegateTask.getVariable("approvalHistory"); + object.put("approvalHistory",JSONArray.parseArray(JSON.toJSONString(approvalHistoryListNew))); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getVariable("draftsUserId").toString()); + result.add(busProcessNew); + busBean.saveBatch(result); + }else{ + //同意 + List foList =(List) delegateTask.getVariable("gjjlList"); + for(String str:foList){ + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("foange2"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + List approvalHistoryListNew =(List) delegateTask.getVariable("approvalHistory"); + object.put("approvalHistory",JSONArray.parseArray(JSON.toJSONString(approvalHistoryListNew))); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(str); + result.add(busProcessNew); + busBean.saveBatch(result); + } + } + } + delegateTask.setVariable("jlsh",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineFrount.java new file mode 100644 index 00000000..d95af8a2 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/FoExamineFrount.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订流程--- + */ +public class FoExamineFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("MSG_TYPE","foange"); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrAfter.java new file mode 100644 index 00000000..19e16c4b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrAfter.java @@ -0,0 +1,80 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +/** + * ---企标制修订流程<其他联络人>--- + */ +public class LlrAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + String bsj = object.getString("bsj"); + if(bsj.equals("0")){ + //提交 + //其他审核人审核节点执行人集合 + List userIdList = new ArrayList(); + + String receivers = object.get("respUser") == null ? "" : object.get("respUser").toString(); + userIdList = Arrays.asList(receivers.split(",")); +// delegateTask.setVariable("ApproveLlrList",receivers); + delegateTask.setVariable("ApproveLlr",receivers); + + delegateTask.setVariable("ApproveLlrList",userIdList); + + if(userIdList != null && !userIdList.isEmpty()){ +// WorkflowUtil.saveBusProcessNew(delegateTask,userIdList,object.toJSONString()); + List result = new ArrayList<>(); +// IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + for(String userId : userIdList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(userId); + busProcessNew.setMsgType("llr"); + result.add(busProcessNew); + } + busBean.saveBatch(result); + } + + delegateTask.setVariable("hqbmFlag",0); + }else if(bsj.equals("1")){ + //不涉及 + delegateTask.setVariable("hqbmFlag",2); + String bsjDept = object.getString("bsjDept"); + List list = (List) delegateTask.getVariable("sjhqbm"); + ArrayList beforlist = new ArrayList<>(list); + beforlist.remove(bsjDept); + delegateTask.setVariable("sjhqbm",beforlist); + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrFrount.java new file mode 100644 index 00000000..b9a84042 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/LlrFrount.java @@ -0,0 +1,63 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; +/** + * ---企标制修订流程<其他联络人>--- + */ +public class LlrFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + String qtllr = delegateTask.getVariable("qtllr").toString(); + String userId = qtllr.split("[|]")[0]; + String uuId = qtllr.split("[|]")[1]; + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", userId); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("SUB_ID",uuId); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1 =list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } +// BusProcessNew one1 = busBean.getOne(queryWrapper1); +// one1.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(one1); + delegateTask.setAssignee(userId); + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订流程"); + +// +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineAfter.java new file mode 100644 index 00000000..83adb0ce --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineAfter.java @@ -0,0 +1,147 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang.StringUtils; + +import java.util.*; + +/** + * ---企标制修订流程<高级经理审批>--- + */ +public class ManagerExamineAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //高级经理审核意见 + String spflag = object.get("manageApproval") == null ? "" : object.get("manageApproval").toString(); + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + List list = JSONObject.parseArray(approvalHistory.toJSONString(), Object.class); + List objList = new ArrayList<>(); + if(delegateTask.getVariable("approvalHistory")!=null){ + List approvalHistoryList =(List) delegateTask.getVariable("approvalHistory"); + Object obj = list.get(list.size()-1); + ((Map) obj).put("approvalTime",new Date()); + approvalHistoryList.add(obj); + delegateTask.setVariable("approvalHistory",approvalHistoryList); + }else{ + Object obj = list.get(0); + ((Map) obj).put("approvalTime",new Date()); + objList.add(obj); + delegateTask.setVariable("approvalHistory",objList); + } + + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew(UserRoleEnum.ENTERPRISESTANDARDENGINEER.getLable()); + if(managerByOrgId.getData()==null || managerByOrgId.getData().size()==0){ + throw new ActivitiException("企标工程师不存在"); + } + + object.put("approvalHistory",approvalHistory); + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + one.setCommitFlag(spflag); + busBean.saveOrUpdate(one); + + String gjjlRoleId = object.getString("gjjlRoleId"); + + if(gjjlRoleId!=null && !gjjlRoleId.equals("")){ + delegateTask.setVariable("gjjlRoleId",gjjlRoleId); + } + + if(delegateTask.getVariable("gjjlRoleId")!=null && delegateTask.getVariable("gjjlRoleId2") == null){ + if(gjjlRoleId!=null && !gjjlRoleId.equals("")){ + if(delegateTask.getVariable("gjjlRoleId").toString().indexOf(",")<0){ + ResponseMessage parentIds = lawsUserInfoService.getParentIds(gjjlRoleId); + + String id = ""; + if(parentIds.getData()!=null){ + if(((List)parentIds.getData()).get(0).get("roleId")!=null){ + id = ((List)parentIds.getData()).get(0).get("roleId").toString(); + } + } + + if(!id.equals("")){ + delegateTask.setVariable("gjjlRoleId2",gjjlRoleId+","+id); + } + } + } + } + + if("1".equalsIgnoreCase(spflag)){ + delegateTask.setVariable("jlsh",1); + } + boolean flag = false; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + } + if(flag){ + if((int) delegateTask.getVariable("jlsh")==1){ + //不同意 + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("founange3"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + List approvalHistoryListNew =(List) delegateTask.getVariable("approvalHistory"); + object.put("approvalHistory",JSONArray.parseArray(JSON.toJSONString(approvalHistoryListNew))); + object.put("manageApproval",0); + JSONArray array = new JSONArray(); + object.put("manageApprovalData",array); + object.put("remark",""); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getVariable("draftsUserId").toString()); + result.add(busProcessNew); + busBean.saveBatch(result); + }else{ + //同意 + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("foange3"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + List approvalHistoryListNew =(List) delegateTask.getVariable("approvalHistory"); + object.put("approvalHistory",JSONArray.parseArray(JSON.toJSONString(approvalHistoryListNew))); + List sjhqbmlist = (List) delegateTask.getVariable("sjhqbm"); + String str =""; + if(sjhqbmlist.size()>0){ + str= StringUtils.join(sjhqbmlist, ","); + } + object.put("respDept",str); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + result.add(busProcessNew); + busBean.saveBatch(result); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineFrount.java new file mode 100644 index 00000000..4127e307 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/ManagerExamineFrount.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订流程<高级经理审批>--- + */ +public class ManagerExamineFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("MSG_TYPE","foange2"); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list!=null && list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveAfter.java new file mode 100644 index 00000000..ff84a764 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveAfter.java @@ -0,0 +1,109 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标制修订流程<其他审核人审核>--- + */ +public class OtherApproveAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + String qtllr = delegateTask.getVariable("qtllr").toString(); + String userId = qtllr.split("[|]")[0]; + String uuId = qtllr.split("[|]")[1]; + //其他审核人审核节点执行人集合 +// List userIdList = new ArrayList(); +// +// String dept = object.get("dept") == null ? "" : object.get("dept").toString(); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgId("高级经理", dept); +// for(OrgEO orgEO : managerByOrgId.getData()){ +// userIdList.add(orgEO.getUsId()); +// } + + //其他起草人审核意见 + String spflag = object.get("respApproval") == null ? "" : object.get("respApproval").toString(); +// delegateTask.setVariable("llrsh",spflag); + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } +// object.put("approvalHistory",approvalHistory); +// if("1".equalsIgnoreCase(spflag)){ +// String createUser = object.getString("createUser"); +// delegateTask.setVariable("draftUserId",createUser); +// WorkflowUtil.saveBusProcessNew(delegateTask, Arrays.asList(new String[]{createUser}),object.toJSONString()); +// }else{ +// if(userIdList != null && !userIdList.isEmpty()){ +// delegateTask.setVariable("gjjlList",userIdList); +// WorkflowUtil.saveBusProcessNew(delegateTask,userIdList,object.toJSONString()); +// } +// } + if(spflag.equals("1")){ + delegateTask.setVariable("hqbmShFlag",1); + + List result = new ArrayList<>(); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("founange3"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(object.getString("llr")); + busProcessNew.setSubId(uuId); + result.add(busProcessNew); + busBean.saveBatch(result); + + List list = (List) delegateTask.getVariable("ApproveLlrList"); + List arrList = new ArrayList(list); + arrList.remove(delegateTask.getAssignee()); + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + one.setCommitFlag(spflag); + busBean.saveOrUpdate(one); + }else{ + delegateTask.setVariable("hqbmShFlag",0); + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + one.setCommitFlag(spflag); + busBean.saveOrUpdate(one); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveFrount.java new file mode 100644 index 00000000..d202844e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplication/OtherApproveFrount.java @@ -0,0 +1,54 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplication; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订流程<其他审核人审核>--- + */ +public class OtherApproveFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("MSG_TYPE","llr"); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeAfter.java new file mode 100644 index 00000000..268536a1 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeAfter.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标制修订申请流程<起草人修订>--- + */ +public class DraftsChangeAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONObject qbzxdForm = object.getJSONObject("qbzxdForm"); + String receivers = qbzxdForm.get("FO") == null ? "" : qbzxdForm.get("FO").toString(); + delegateTask.setVariable("foUserId",receivers); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(receivers); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeFrount.java new file mode 100644 index 00000000..7f66a054 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsChangeFrount.java @@ -0,0 +1,54 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订申请流程<起草人修订>--- + */ +public class DraftsChangeFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订申请流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订申请流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsmanOpenAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsmanOpenAfter.java new file mode 100644 index 00000000..6dbee7b6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/DraftsmanOpenAfter.java @@ -0,0 +1,82 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * ---企标制修订申请流程<起草人发起>--- + */ +public class DraftsmanOpenAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + //fo节点执行人 + List foList = new ArrayList(); + JSONObject prcForm = object.getJSONObject("prcForm"); + //获取表单信息 + JSONObject qbzxdForm = object.getJSONObject("qbzxdForm"); + + //截止时间 流程描述 创建人 + String OVERTIME = prcForm.getString("prcDeadline"); + String MES = prcForm.getString("prcDesc"); + String user = prcForm.getString("prcCreateUser"); + String username = prcForm.getString("prcCreateUserName"); + + + String prcName = object.getJSONObject("qbzxdForm").getString("cnName")+"-企标制修订申请"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setPrcMes(MES); + one1.setOverTime(OVERTIME); + one1.setPrcType("6"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + String receivers = qbzxdForm.get("FO") == null ? "" : qbzxdForm.get("FO").toString(); + foList = Arrays.asList(receivers.split(",")); + delegateTask.setVariable("foUserIds",foList); + delegateTask.setVariable("fqUserId", delegateTask.getAssignee()); + + if(foList != null && !foList.isEmpty()){ + for(String foUser : foList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(foUser); + busBean.save(busProcessNew); + } + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineAfter.java new file mode 100644 index 00000000..c1402693 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineAfter.java @@ -0,0 +1,122 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +/** + * ---企标制修订申请流程--- + */ +public class FoExamineAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //fo节点执行人 + List foList = new ArrayList(); + JSONObject prcForm = object.getJSONObject("prcForm"); + //获取表单信息 + JSONObject qbzxdForm = object.getJSONObject("qbzxdForm"); + + //是否审批通过 + String spFlag = qbzxdForm.getString("opinion"); + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } + object.put("approvalHistory",approvalHistory); + + String dept = qbzxdForm.get("dept") == null ? "" : qbzxdForm.get("dept").toString(); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + //获取当前节点处理人 + /*String foUserId = qbzxdForm.getString("createUser"); + String managerUserId = lawsUserInfoService.getUserId(dept, foUserId, UserRoleEnum.SENIORMANAGER.getLable()); + try{ + if(StringUtils.isBlank(managerUserId)){ + throw new ActivitiException("高级经理不存在"); + } + }catch(Exception e){ + throw new ActivitiException("高级经理不存在"); + }*/ + + + if(spFlag.equals("0")){ + delegateTask.setVariable("foFlag",0); + String receivers = qbzxdForm.get("seniorManager") == null ? "" : qbzxdForm.get("seniorManager").toString(); + try{ + if(StringUtils.isBlank(receivers)){ + throw new ActivitiException("高级经理不存在"); + } + }catch(Exception e){ + throw new ActivitiException("高级经理不存在"); + } + //String receivers = managerUserId; + delegateTask.setVariable("jlUserId",receivers); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(receivers); + busBean.save(busProcessNew); + }else{ + delegateTask.setVariable("foFlag",1); + qbzxdForm.put("opinionTime",new Date()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getVariable("fqUserId").toString()); + busBean.save(busProcessNew); + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + if(spFlag.equals("0")){ + one.setCommitFlag("0"); + one.setCommitText(""); + }else { + one.setCommitFlag("1"); + one.setCommitText(""); + } + busBean.saveOrUpdate(one); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineFrount.java new file mode 100644 index 00000000..7b3995df --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/FoExamineFrount.java @@ -0,0 +1,53 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订申请流程--- + */ +public class FoExamineFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订申请流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订申请流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineAfter.java new file mode 100644 index 00000000..6f9ec7ea --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineAfter.java @@ -0,0 +1,82 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * ---企标制修订申请流程<高级经理审批>--- + */ +public class ManagerExamineAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //fo节点执行人 + List foList = new ArrayList(); + JSONObject prcForm = object.getJSONObject("prcForm"); + //获取表单信息 + JSONObject qbzxdForm = object.getJSONObject("qbzxdForm"); + + //是否审批通过 + String spFlag = qbzxdForm.getString("seniorManagerOpinion"); + JSONArray approvalHistory = object.getJSONArray("approvalHistory"); + if(approvalHistory != null && !approvalHistory.isEmpty()){ + JSONObject approval = (JSONObject) approvalHistory.get(approvalHistory.size()-1); + approval.put("approvalTime",System.currentTimeMillis()); + approvalHistory.remove(approvalHistory.size()-1); + approvalHistory.add(approval); + } + object.put("approvalHistory",approvalHistory); + if(spFlag.equals("0")){ + delegateTask.setVariable("jlFlag",0); + }else{ + delegateTask.setVariable("jlFlag",1); + qbzxdForm.put("opinionTime",new Date()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getVariable("fqUserId").toString()); + busBean.save(busProcessNew); + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + if(spFlag.equals("0")){ + one.setCommitFlag("0"); + one.setCommitText(""); + }else { + one.setCommitFlag("1"); + one.setCommitText(""); + } + busBean.saveOrUpdate(one); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineFrount.java new file mode 100644 index 00000000..b3c6d759 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardApplicationApply/ManagerExamineFrount.java @@ -0,0 +1,53 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardApplicationApply; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * ---企标制修订申请流程<高级经理审批>--- + */ +public class ManagerExamineFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订申请流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订申请流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppAfter.java new file mode 100644 index 00000000..40b1dcac --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppAfter.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; +import java.util.Map; + +public class DreAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + JSONObject jsonObject = object.getJSONObject("qbzxdForm"); + JSONObject object1 = new JSONObject(); + object1.put("prcForm", object.getJSONObject("prcForm")); + object1.put("qbzxdForm", jsonObject); + delegateTask.setVariable("gjjl",jsonObject.getString("seniorManager")); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(jsonObject.getString("seniorManager")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("11"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppFrount.java new file mode 100644 index 00000000..41d09a79 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/DreAppFrount.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DreAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); +// if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); +// } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订评估流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppAfter.java new file mode 100644 index 00000000..167e70cb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppAfter.java @@ -0,0 +1,69 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class FoAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject jsonObject = object.getJSONObject("qbzxdForm"); + if(jsonObject.get("opinion").toString().equals("0")){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(jsonObject.get("primaryDrafter").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("11"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + delegateTask.setVariable("foFlag",0); + delegateTask.setVariable("zqcr",jsonObject.get("primaryDrafter").toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); + busBean.saveOrUpdate(one1); + } + }else{ + delegateTask.setVariable("foFlag",1); + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); + busBean.saveOrUpdate(one1); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppFrount.java new file mode 100644 index 00000000..724f2b2f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/FoAppFrount.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); + String creater = busProcessName.getCreatUser(); + ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); + UserVO users = userVOResponseMessage.getData(); + String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + + " ——来自 全球标准法规管理系统"; + lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppAfter.java new file mode 100644 index 00000000..60ead7b4 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppAfter.java @@ -0,0 +1,67 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject jsonObject = object.getJSONObject("qbzxdForm"); + if(jsonObject.get("opinionStep4").toString().equals("0")){ + delegateTask.setVariable("gjjlFlag",0); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + }else{ + delegateTask.setVariable("gjjlFlag",1); + JSONObject object1 = new JSONObject(); + object.getJSONObject("qbzxdForm").put("opinionTime",new Date()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("zqcr").toString()); +// delegateTask.setVariable("zqcr",delegateTask.getVariable("zqcr")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("11"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppFrount.java new file mode 100644 index 00000000..e6734375 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ManagerAppFrount.java @@ -0,0 +1,50 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订评估流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenAfter.java new file mode 100644 index 00000000..fa12c52d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenAfter.java @@ -0,0 +1,70 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class ProcessOpenAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String OVERTIME = object.getJSONObject("prcForm").getString("prcDeadline"); + String username = object.getJSONObject("prcForm").getString("prcCreateUserName"); + String userId = object.getJSONObject("prcForm").getString("prcCreateUser"); + String prcName = object.getJSONObject("qbzxdForm").getString("cnName")+ + "-企标制修订评估"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("11"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcType","11"); + object.getJSONObject("prcForm").put("prcName",prcName); + + List foUserIds = new ArrayList(); + JSONObject object1 = object.getJSONObject("qbzxdForm"); + foUserIds.add(object1.get("FO")); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(object1.getString("FO")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("11"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + //FO集合 + delegateTask.setVariable("foUserIds",foUserIds); + delegateTask.setVariable("zqcr",userId); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenFrount.java new file mode 100644 index 00000000..ce011c0a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardAssessment/ProcessOpenFrount.java @@ -0,0 +1,52 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardAssessment; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ProcessOpenFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标制修订评估流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标制修订评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAfter.java new file mode 100644 index 00000000..f5a8a85f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAfter.java @@ -0,0 +1,78 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class DraftsmanOpenAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String OVERTIME = object.getJSONObject("prcForm").getString("prcDeadline"); + String username = object.getJSONObject("prcForm").getString("createUserName"); + + String standName = object.getJSONObject("qbkwForm").getString("standName"); + String prcName = standName+"-企标勘误"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("12"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcType","12"); + object.getJSONObject("prcForm").put("prcName",prcName); + + String arry = object.getJSONObject("qbkwForm").getString("dutyEngineer"); + List list = new ArrayList<>(); + list.add(arry); + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + delegateTask.setVariable("foUserIds",list); + +// delegateTask.setVariable("qbgcs",managerByOrgId.getData().get(0).getUsId()); + + delegateTask.setVariable("foFlag",0); + + for(String fo:list){ + //循环fo赋值 + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fo); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("12"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAgeinAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAgeinAfter.java new file mode 100644 index 00000000..7c0975ba --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenAgeinAfter.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class DraftsmanOpenAgeinAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String arry = object.getJSONObject("qbkwForm").getString("dutyEngineer"); + List list = new ArrayList<>(); + list.add(arry); + delegateTask.setVariable("foUserIds",list); + delegateTask.setVariable("foFlag",0); + for(String fo:list){ + //循环fo赋值 + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fo); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("12"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenFrount.java new file mode 100644 index 00000000..50034915 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/DraftsmanOpenFrount.java @@ -0,0 +1,52 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DraftsmanOpenFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标勘误流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标勘误流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppAfter.java new file mode 100644 index 00000000..cd7b7576 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppAfter.java @@ -0,0 +1,79 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class EngineerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String loginUser = object.getJSONObject("qbkwForm").getString("loginUser"); + + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + queryWrapper1.isNull("USER_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + one.setUserId(loginUser); + busBean.saveOrUpdate(one); + delegateTask.setAssignee(loginUser); + } + + String opinion = object.getJSONObject("qbkwForm").getString("opinionStep3"); + if(opinion.equals("1")){ + delegateTask.setVariable("gcsFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("12"); + ((Map)object.getJSONObject("qbkwForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("1"); +// one3.setCommitText(object.getJSONObject("qbkwForm").getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + }else{ + delegateTask.setVariable("gcsFlag",0); + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("0"); +// one3.setCommitText(object.getJSONObject("qbkwForm").getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppFrount.java new file mode 100644 index 00000000..f8f3a335 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/EngineerAppFrount.java @@ -0,0 +1,64 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; + +public class EngineerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew(UserRoleEnum.ENTERPRISESTANDARDENGINEER.getLable()); + if(managerByOrgId.getData()==null || managerByOrgId.getData().size()==0){ + throw new ActivitiException("企标工程师不存在"); + } + + List qbgcs = new ArrayList<>(); + + for(OrgEO orgEO:managerByOrgId.getData()){ + qbgcs.add(orgEO.getUsId()); + } + + delegateTask.addCandidateUsers(qbgcs); + + QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + queryWrapper1.isNull("USER_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标勘误流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标勘误流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppAfter.java new file mode 100644 index 00000000..fa3e2f2d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppAfter.java @@ -0,0 +1,119 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class FoAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String opinion = object.getJSONObject("qbkwForm").getString("opinion"); + if(opinion.equals("0")){ + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.eq("USER_ID",delegateTask.getVariable("qbgcs")); + queryWrapper1.isNull("TASK_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(delegateTask.getVariable("foFlag").toString().equals("0")){ + if(one!=null){ + one.setMesg(object.toJSONString()); + busBean.saveOrUpdate(one); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(delegateTask.getVariable("qbgcs").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("angree"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + if(one3.getCommitFlag()!=null && !one3.getCommitFlag().equals("") && !one3.getCommitFlag().equals("0")){ + + }else{ + one3.setCommitFlag("0"); + one3.setCommitText(object.getJSONObject("qbkwForm").getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + } + } + }else{ + delegateTask.setVariable("foFlag",1); + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("USER_ID",delegateTask.getVariable("fqr")); + queryWrapper1.isNull("TASK_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + String mes = one.getMesg(); + JSONObject mesjson = JSONObject.parseObject(mes); + JSONObject qbbajson = mesjson.getJSONObject(""); + JSONArray arry = qbbajson.getJSONArray("opinionAll"); + ((Map)object.getJSONObject("qbkwForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + arry.add(object.getJSONObject("qbkwForm").getJSONArray("opinionAll").get(0)); + object.getJSONObject("qbkwForm").put("opinionAll",arry); + one.setMesg(object.toJSONString()); + busBean.saveOrUpdate(one); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("unangree"); + ((Map) object.getJSONObject("qbkwForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper2.eq("USER_ID",delegateTask.getVariable("qbgcs")); + queryWrapper2.eq("MSG_TYPE","angree"); + queryWrapper2.isNull("TASK_ID"); + BusProcessNew one1 = busBean.getOne(queryWrapper2); + if(one1!=null){ + busBean.removeById(one1.getId()); + } + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("1"); + one3.setCommitText(object.getJSONObject("qbkwForm").getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppFrount.java new file mode 100644 index 00000000..07553f53 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardCorrigendum/FoAppFrount.java @@ -0,0 +1,50 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardCorrigendum; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标勘误流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标勘误流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppAfter.java new file mode 100644 index 00000000..9093835a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppAfter.java @@ -0,0 +1,94 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +public class ChiefEngineerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject qbbaForm = object.getJSONObject("qbbaForm"); + + String option = qbbaForm.getString("opinionStep7"); + + List yjList = new ArrayList<>(); + + if(option.equals("1")){ + if(delegateTask.getVariable("yjlb")==null){ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + }else{ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList =(List) delegateTask.getVariable("yjlb"); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + } + } + + if(option.equals("0")){ + //通过 + delegateTask.setVariable("zgFlag",0); + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("0"); + one3.setCommitText(qbbaForm.getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + }else{ + //不通过 + delegateTask.setVariable("zgFlag",1); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("1"); + one3.setCommitText(qbbaForm.getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppFrount.java new file mode 100644 index 00000000..aa83022d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ChiefEngineerAppFrount.java @@ -0,0 +1,50 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ChiefEngineerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppAfter.java new file mode 100644 index 00000000..079eaa66 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppAfter.java @@ -0,0 +1,188 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +public class CountersignatureAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + + JSONObject qbbaForm = object.getJSONObject("qbbaForm"); + //是否通过 + String opinion = qbbaForm.getString("opinion"); + + //意见列表 + delegateTask.getVariable("yjlb"); + + List yjList = new ArrayList<>(); + + if(opinion.equals("1")){ + delegateTask.setVariable("hqFlag",1); + if(delegateTask.getVariable("yjlb")==null){ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + }else{ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList =(List) delegateTask.getVariable("yjlb"); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + } + } + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag(opinion); + one3.setCommitText(qbbaForm.getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + + boolean flag = false; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + } + + if(flag){ + if((int) delegateTask.getVariable("hqFlag")==1){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("unangree"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll",JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("angree"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll",JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + +// if(opinion.equals("0")){ +// //通过 +// QueryWrapper queryWrapper1 = new QueryWrapper<>(); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.eq("MSG_TYPE","angree"); +//// queryWrapper1.eq("USER_ID",managerByOrgId.getData().get(0).getUsId()); +// queryWrapper1.isNull("USER_ID"); +// queryWrapper1.isNull("TASK_ID"); +// BusProcessNew one = busBean.getOne(queryWrapper1); +// if(delegateTask.getVariable("hqFlag").toString().equals("0")){ +// if(one==null){ +// BusProcessNew busProcessNew = new BusProcessNew(); +//// busProcessNew.setUserId(managerByOrgId.getData().get(0).getUsId()); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setMsgType("angree"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// }else{ +// one.setMesg(object.toJSONString()); +// busBean.saveOrUpdate(one); +// } +// } +// QueryWrapper queryWrapper3 = new QueryWrapper(); +// queryWrapper3.eq("TASK_ID",delegateTask.getId()); +// BusProcessNew one3 = busBean.getOne(queryWrapper3); +// if(one3!=null){ +// one3.setCommitFlag("0"); +// one3.setCommitText(qbbaForm.getString("opinionContent")); +// busBean.saveOrUpdate(one3); +// } +// }else{ +// //不通过 +// delegateTask.setVariable("hqFlag",1); +// QueryWrapper queryWrapper1 = new QueryWrapper<>(); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.eq("MSG_TYPE","unangree"); +// queryWrapper1.eq("USER_ID",delegateTask.getVariable("fqr")); +// queryWrapper1.isNull("TASK_ID"); +// BusProcessNew one = busBean.getOne(queryWrapper1); +// if(one==null){ +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setMsgType("unangree"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// }else{ +// String mes = one.getMesg(); +// JSONObject mesjson = JSONObject.parseObject(mes); +// JSONObject qbbajson = mesjson.getJSONObject("qbbaForm"); +// JSONArray arry = qbbajson.getJSONArray("opinionAll"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); +// arry.add(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)); +// object.getJSONObject("qbbaForm").put("opinionAll",arry); +// one.setMesg(object.toJSONString()); +// busBean.saveOrUpdate(one); +// } +// +// QueryWrapper queryWrapper2 = new QueryWrapper<>(); +// queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); +//// queryWrapper2.eq("USER_ID",managerByOrgId.getData().get(0).getUsId()); +// queryWrapper2.isNull("USER_ID"); +// queryWrapper2.eq("MSG_TYPE","angree"); +// queryWrapper2.isNull("TASK_ID"); +// BusProcessNew one1 = busBean.getOne(queryWrapper2); +// if(one1!=null){ +// busBean.removeById(one1.getId()); +// } +// +// QueryWrapper queryWrapper3 = new QueryWrapper(); +// queryWrapper3.eq("TASK_ID",delegateTask.getId()); +// BusProcessNew one3 = busBean.getOne(queryWrapper3); +// if(one3!=null){ +// one3.setCommitFlag("1"); +// one3.setCommitText(qbbaForm.getString("opinionContent")); +// busBean.saveOrUpdate(one3); +// } +// } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppFrount.java new file mode 100644 index 00000000..f6c833e5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/CountersignatureAppFrount.java @@ -0,0 +1,54 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class CountersignatureAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list!=null && list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppAfter.java new file mode 100644 index 00000000..fa12e9aa --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppAfter.java @@ -0,0 +1,56 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; +import java.util.Map; + +public class EngineerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String loginUser = object.getJSONObject("qbbaForm").getString("loginUser"); + + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + queryWrapper1.isNull("USER_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + one.setUserId(loginUser); + busBean.saveOrUpdate(one); + delegateTask.setAssignee(loginUser); + } + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppFrount.java new file mode 100644 index 00000000..d5ed581a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/EngineerAppFrount.java @@ -0,0 +1,66 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; + +public class EngineerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew(UserRoleEnum.ENTERPRISESTANDARDENGINEER.getLable()); + if(managerByOrgId.getData()==null || managerByOrgId.getData().size()==0){ + throw new ActivitiException("企标工程师不存在"); + } + + List qbgcs = new ArrayList<>(); + + for(OrgEO orgEO:managerByOrgId.getData()){ + qbgcs.add(orgEO.getUsId()); + } + + delegateTask.addCandidateUsers(qbgcs); + + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.isNull("USER_ID"); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + +// +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppAfter.java new file mode 100644 index 00000000..58c1c8d9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppAfter.java @@ -0,0 +1,202 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +public class ExpertAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject qbbaForm = object.getJSONObject("qbbaForm"); + + String option = qbbaForm.getString("opinionStep6"); + + List yjList = new ArrayList<>(); + if(option.equals("1")){ + delegateTask.setVariable("zjFlag",1); + //存放不同意人员 + Object unzjUserIds = delegateTask.getVariable("unzjUserIds"); + int k =(int) delegateTask.getVariable("nrOfActiveInstances"); + if(k==0){ + delegateTask.setVariable("unzjUserIds",null); + } + if(unzjUserIds!=null){ + delegateTask.setVariable("unzjUserIds",(String)unzjUserIds+","+delegateTask.getAssignee()); + }else{ + delegateTask.setVariable("unzjUserIds",delegateTask.getAssignee()); + } + if(delegateTask.getVariable("yjlb")==null){ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + }else{ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList =(List) delegateTask.getVariable("yjlb"); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + } + } + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag(option); + one3.setCommitText(qbbaForm.getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + + boolean flag = false; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + } + + if(flag){ + if((int) delegateTask.getVariable("zjFlag")==0){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("xmzg").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("angree"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("unangree"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll",JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + +// if(option.equals("0")){ +// //通过 +//// delegateTask.setVariable("zjFlag",0); +// +// QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID",delegateTask.getVariable("xmzg").toString()); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.isNull("TASK_ID"); +// BusProcessNew one = busBean.getOne(queryWrapper1); +// if(delegateTask.getVariable("zjFlag").toString().equals("0")){ +// if(one != null){ +// one.setMesg(object.toJSONString()); +// busBean.saveOrUpdate(one); +// }else{ +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(delegateTask.getVariable("xmzg").toString()); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getEventName()); +// busProcessNew.setMsgType("angree"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// } +// } +// +// QueryWrapper queryWrapper3 = new QueryWrapper(); +// queryWrapper3.eq("TASK_ID",delegateTask.getId()); +// BusProcessNew one3 = busBean.getOne(queryWrapper3); +// if(one3!=null){ +// if(one3.getCommitFlag()!=null && !one3.getCommitFlag().equals("") && !one3.getCommitFlag().equals("0")){ +// +// }else{ +// one3.setCommitFlag("0"); +// one3.setCommitText(qbbaForm.getString("opinionContent")); +// busBean.saveOrUpdate(one3); +// } +// } +// }else{ +// //不通过 +// delegateTask.setVariable("zjFlag",1); +// //存放不同意人员 +// Object unzjUserIds = delegateTask.getVariable("unzjUserIds"); +// if(unzjUserIds!=null){ +// delegateTask.setVariable("unzjUserIds",(String)unzjUserIds+","+delegateTask.getAssignee()); +// }else{ +// delegateTask.setVariable("unzjUserIds",delegateTask.getAssignee()); +// } +// +// QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID",delegateTask.getVariable("fqr").toString()); +// queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper1.isNull("TASK_ID"); +// BusProcessNew one = busBean.getOne(queryWrapper1); +// if(one !=null){ +// JSONObject object1 = JSONObject.parseObject(one.getMesg()); +// JSONArray array = object1.getJSONObject("qbbaForm").getJSONArray("opinionAll"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); +// array.add(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)); +// object1.getJSONObject("qbbaForm").put("",array); +// one.setMesg(object1.toJSONString()); +// busBean.saveOrUpdate(one); +// }else{ +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getEventName()); +// busProcessNew.setMsgType("unangree"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// } +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("USER_ID",delegateTask.getVariable("xmzg").toString()); +// queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper2.eq("MSG_TYPE","angree"); +// queryWrapper2.isNull("TASK_ID"); +// BusProcessNew one1 = busBean.getOne(queryWrapper2); +// if(one1!=null){ +// busBean.removeById(one1.getId()); +// } +// +// QueryWrapper queryWrapper3 = new QueryWrapper(); +// queryWrapper3.eq("TASK_ID",delegateTask.getId()); +// BusProcessNew one3 = busBean.getOne(queryWrapper3); +// if(one3!=null){ +// one3.setCommitFlag("1"); +// one3.setCommitText(qbbaForm.getString("opinionContent")); +// busBean.saveOrUpdate(one3); +// } +// } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppFrount.java new file mode 100644 index 00000000..499991db --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/ExpertAppFrount.java @@ -0,0 +1,52 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ExpertAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAfter.java new file mode 100644 index 00000000..bf907fa3 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAfter.java @@ -0,0 +1,93 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class InitiationProcessAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String OVERTIME = object.getJSONObject("prcForm").getString("prcDeadline"); + String username = object.getJSONObject("prcForm").getString("prcCreateUserName"); + String prcName = object.getJSONObject("qbbaForm").getString("standName")+"企标备案"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("17"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcType","17"); + object.getJSONObject("prcForm").put("prcName",prcName); + + List foUserIds = new ArrayList(); + JSONObject qbbaForm = object.getJSONObject("qbbaForm"); + + String vse = qbbaForm.getString("VSE"); + String authentication = qbbaForm.getString("authentication"); + String statute = qbbaForm.getString("statute"); + + if(vse!=null){ + List vseList = new ArrayList<>(Arrays.asList(vse.split(","))); + foUserIds.addAll(vseList); + } + if(authentication!=null){ + List authenticationList = new ArrayList<>(Arrays.asList(authentication.split(","))); + foUserIds.addAll(authenticationList); + } + if(statute!=null){ + List statuteList = new ArrayList<>(Arrays.asList(statute.split(","))); + foUserIds.addAll(statuteList); + } + + Set result = new HashSet(foUserIds); + List result2 = new ArrayList<>(result); + + for(String foUserId:result2){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(foUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + //FO集合 + delegateTask.setVariable("foUserIds",result2); + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + //默认部门会签通过 + delegateTask.setVariable("hqFlag",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAgeinAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAgeinAfter.java new file mode 100644 index 00000000..d814086b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessAgeinAfter.java @@ -0,0 +1,74 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class InitiationProcessAgeinAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + List foUserIds = new ArrayList(); + JSONObject qbbaForm = object.getJSONObject("qbbaForm"); + + String vse = qbbaForm.getString("VSE"); + String authentication = qbbaForm.getString("authentication"); + String statute = qbbaForm.getString("statute"); + + if(vse!=null){ + List vseList = new ArrayList<>(Arrays.asList(vse.split(","))); + foUserIds.addAll(vseList); + } + if(authentication!=null){ + List authenticationList = new ArrayList<>(Arrays.asList(authentication.split(","))); + foUserIds.addAll(authenticationList); + } + if(statute!=null){ + List statuteList = new ArrayList<>(Arrays.asList(statute.split(","))); + foUserIds.addAll(statuteList); + } + + Set result = new HashSet(foUserIds); + List result2 = new ArrayList<>(result); + + for(String foUserId:result2){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(foUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + //FO集合 + delegateTask.setVariable("foUserIds",result2); + //默认部门会签通过 + delegateTask.setVariable("hqFlag",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessFrount.java new file mode 100644 index 00000000..c24523fd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/InitiationProcessFrount.java @@ -0,0 +1,53 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class InitiationProcessFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseAfter.java new file mode 100644 index 00000000..947d45dd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseAfter.java @@ -0,0 +1,72 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class SponsorReviseAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + String dept = object.getJSONObject("prcForm").get("dept").toString(); + + String userId2 = object.getJSONObject("qbbaForm").getString("zj"); + delegateTask.setVariable("vizj",userId2); + String userId3 = object.getJSONObject("qbbaForm").getString("xmzg"); + delegateTask.setVariable("xmzg",userId3); + + //企标备案专家 +// String zjUserids = object.getJSONObject("qbbaForm").getString("keepOnRrecordZj"); + Object unzjUserIds = delegateTask.getVariable("unzjUserIds"); + String zjUserids = ""; + if(unzjUserIds!=null){ + zjUserids = (String)unzjUserIds; + }else{ + zjUserids = object.getJSONObject("qbbaForm").getString("qbbazj"); + } + + List list1 = Arrays.asList(zjUserids.split(",")); + delegateTask.setVariable("zjUserIds",list1); + //默认企标专家审批通过 + delegateTask.setVariable("zjFlag",0); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("vizj").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseFrount.java new file mode 100644 index 00000000..ee89518d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/SponsorReviseFrount.java @@ -0,0 +1,52 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class SponsorReviseFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppAfter.java new file mode 100644 index 00000000..ccf9a400 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppAfter.java @@ -0,0 +1,139 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.hibernate.validator.constraints.EAN; + +import java.util.*; + +public class VIAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject qbbaForm = object.getJSONObject("qbbaForm"); + + String option = qbbaForm.getString("opinionStep5"); + + if(option.equals("0")){ + //通过 + delegateTask.setVariable("viFlag",0); + Object unzjUserIds = delegateTask.getVariable("unzjUserIds"); + if(unzjUserIds!=null){ + if(((String) unzjUserIds).indexOf(",")>-1){ + List zjUserIds = Arrays.asList(((String) unzjUserIds).split(",")); + for(String zjUserId:zjUserIds) { + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(zjUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + delegateTask.setVariable("zjUserIds",zjUserIds); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId((String) unzjUserIds); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + List zjUserIds = new ArrayList<>(); + zjUserIds.add((String) unzjUserIds); + delegateTask.setVariable("zjUserIds",zjUserIds); + } + }else{ + List zjUserIds = (List)delegateTask.getVariable("zjUserIds"); + for(String zjUserId:zjUserIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(zjUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMsgType("17"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("0"); + one3.setCommitText(qbbaForm.getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + }else{ + //不通过 + delegateTask.setVariable("viFlag",1); + + List yjList = new ArrayList<>(); + if(delegateTask.getVariable("yjlb")==null){ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + }else{ + Map map = new HashMap(); + map = ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll") + .get(object.getJSONObject("qbbaForm").getJSONArray("opinionAll").size()-1)); + map.put("opinionTime",new Date()); + yjList =(List) delegateTask.getVariable("yjlb"); + yjList.add(map); + delegateTask.setVariable("yjlb",yjList); + } + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("17"); +// ((Map) object.getJSONObject("qbbaForm").getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + List yjlb =(List) delegateTask.getVariable("yjlb"); + object.getJSONObject("qbbaForm").put("opinionAll", JSONArray.parseArray(JSON.toJSONString(yjlb))); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one3 = busBean.getOne(queryWrapper3); + if(one3!=null){ + one3.setCommitFlag("1"); + one3.setCommitText(qbbaForm.getString("opinionContent")); + busBean.saveOrUpdate(one3); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppFrount.java new file mode 100644 index 00000000..cccc1a85 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardKeepOnRecord/VIAppFrount.java @@ -0,0 +1,52 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardKeepOnRecord; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class VIAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标备案流程"); + + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标备案流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorAfter.java new file mode 100644 index 00000000..482d2c9e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorAfter.java @@ -0,0 +1,81 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class ChiefInspectorAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray array = object.getJSONArray("tableData"); + String opinionCount = ""; + boolean flag = true; + for(Object stand:array){ + if(((Map) stand).get("opinionStep3").equals("1")){ + flag=false; + JSONArray opinionAll= ((JSONObject) stand).getJSONArray("opinionAll"); + JSONObject obj = (JSONObject) opinionAll.get(0); + obj.put("opinionTime",new Date()); + } else{ +// opinionCount = ((Map) stand).get("opinionContent").toString(); + } + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + if(flag){ + one.setCommitFlag("0"); + one.setCommitText(opinionCount); + }else { + one.setCommitFlag("1"); + one.setCommitText(opinionCount); + } + busBean.saveOrUpdate(one); + } + + if(flag){ + delegateTask.setVariable("zjFlag",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getAssignee()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("8"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else{ + delegateTask.setVariable("zjFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("8"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorFrount.java new file mode 100644 index 00000000..02bb53c6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ChiefInspectorFrount.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ChiefInspectorFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标延期制修订流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标延期制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAfter.java new file mode 100644 index 00000000..b98d9b56 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAfter.java @@ -0,0 +1,69 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class DrafterAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String OVERTIME = object.getJSONObject("prcForm").getString("prcDeadline"); + String username = object.getJSONObject("prcForm").getString("createUserName"); + String prcName = ((JSONObject)object.getJSONArray("tableData").get(0)).getString("cnName")+"制修订延期"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("8"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcType","8"); + object.getJSONObject("prcForm").put("prcName",prcName); + + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + String dept = object.getJSONObject("prcForm").get("dept").toString(); + String userId = object.getJSONObject("prcForm").getString("createUserId"); + + String manageId = ((JSONObject)object.getJSONArray("tableData").get(0)).getString("manageId"); + delegateTask.setVariable("gjjl",manageId); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(manageId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("8"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAgeinAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAgeinAfter.java new file mode 100644 index 00000000..6cffcfd8 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppAgeinAfter.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class DrafterAppAgeinAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + String manageId = ((JSONObject)object.getJSONArray("tableData").get(0)).getString("manageId"); + delegateTask.setVariable("gjjl",manageId); + + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("gjjl").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("8"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppFrount.java new file mode 100644 index 00000000..10a52f65 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/DrafterAppFrount.java @@ -0,0 +1,52 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DrafterAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标延期制修订流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标延期制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppAfter.java new file mode 100644 index 00000000..b1860fd5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppAfter.java @@ -0,0 +1,91 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Map; + +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray array = object.getJSONArray("tableData"); + String opinionCount = ""; + boolean flag = true; + for(Object stand:array){ + if(((Map) stand).get("opinion").equals("1")){ + flag=false; + JSONArray opinionAll= ((JSONObject) stand).getJSONArray("opinionAll"); + JSONObject obj = (JSONObject) opinionAll.get(0); + obj.put("opinionTime",new Date()); + }else{ +// opinionCount = ((Map) stand).get("opinionContent").toString(); + } + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + if(flag){ + one.setCommitFlag("0"); + one.setCommitText(opinionCount); + }else { + one.setCommitFlag("1"); + one.setCommitText(opinionCount); + } + busBean.saveOrUpdate(one); + } + + if(flag){ + delegateTask.setVariable("jlFlag",0); +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(delegateTask.getVariable("zj").toString()); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setMsgType("8"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + if(one1!=null){ + one1.setEndTime(sdf.format(new Date())); + busProcessNameService.saveOrUpdate(one1); + } + }else{ + delegateTask.setVariable("jlFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMsgType("8"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppFrount.java new file mode 100644 index 00000000..e82fc803 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/EnterpriseStandardRevisionApp/ManagerAppFrount.java @@ -0,0 +1,51 @@ +package com.ydw.bat.wkflow.listener.EnterpriseStandardRevisionApp; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标延期制修订流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[企标延期制修订流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/GlobalActivitiEventListener.java b/src/main/java/com/ydw/bat/wkflow/listener/GlobalActivitiEventListener.java new file mode 100644 index 00000000..f14b338f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/GlobalActivitiEventListener.java @@ -0,0 +1,54 @@ +package com.ydw.bat.wkflow.listener; + +import java.io.Serializable; + +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.event.ActivitiEvent; +import org.activiti.engine.delegate.event.ActivitiEventListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.ydw.bat.wkflow.util.SpringContextUtil; + +@Component +public class GlobalActivitiEventListener implements ActivitiEventListener, Serializable { + + private static final long serialVersionUID = 1L; + + protected Logger logger = LoggerFactory.getLogger(this.getClass()); + + // 事件及事件的处理器 + @Override + public void onEvent(ActivitiEvent event) { + switch (event.getType()) { + case ACTIVITY_STARTED: + System.err.println("ACTIVITY_STARTED"); + break; + case TASK_CREATED: + System.err.println("TASK_CREATED"); + // 节点开始的时候,如果和上个执行人是同一个人,则自动关闭节点 + sendSms(event); + break; + case TASK_ASSIGNED: + break; + case TASK_COMPLETED: + break; + case ACTIVITY_COMPLETED: + break; + default: + break; + } + } + + // 拦截发送短信 + private void sendSms(ActivitiEvent event) { + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + System.err.println(historyService); + } + + @Override + public boolean isFailOnException() { + return false; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueAfter.java new file mode 100644 index 00000000..7bab8522 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueAfter.java @@ -0,0 +1,261 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + + +import ch.qos.logback.core.joran.spi.ActionException; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mysql.cj.xdevapi.JsonArray; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class LawsWareIssueAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("deptFlag",1); + delegateTask.setVariable("deptFlag1",1); + //部门集合 + List foList = new ArrayList(); + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + //标准信息 +// JSONObject stand = ((JSONObject)taskBreak.get(0)).getJSONObject("resId"); + //条款新消息(没有条款size为0) + JSONArray itemsList = taskBreak.getJSONObject(0).getJSONArray("itemsList"); + //是否评估 + String pgFlag = object.getString("pgFlag"); + + //流程id 流程名称 结束时间 流程编号 + String PNAME = object.getString("processRealName"); + String OVERTIME = object.getString("deadline"); + String PNUM = object.getString("PNUM"); + String MES = object.getString("describe"); + String username = object.getString("createUserName"); + + + delegateTask.setVariable("PNAME",PNAME); + delegateTask.setVariable("OVERTIME",OVERTIME); + delegateTask.setVariable("PNUM",PNUM); + delegateTask.setVariable("MES",MES); + + + String prcName = object.getString("standName")+"-"+object.getString("textStatus")+"标准法规入库"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null && !StringUtils.isNotEmpty(one1.getPrcName())){ + one1.setPrcMes(MES); + one1.setOverTime(OVERTIME); + one1.setPrcType("1"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + one1.setMes(object.toJSONString()); + busProcessNameService.saveOrUpdate(one1); + } + + + if(itemsList.size()>0){ + //有条款 + JSONArray items = new JSONArray(); + for(int i = 0; i < itemsList.size(); i++){ + if(((JSONObject)itemsList.get(i)).getString("taskId")!=null){ + if(((JSONObject)itemsList.get(i)).getString("taskId").equals(delegateTask.getId())){ + JSONObject item = itemsList.getJSONObject(i); + if (item.getJSONArray("LLR") == null || item.getJSONArray("LLR").equals("")) { + flagDept = true; + JSONObject jsonObject = this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), item.getString("resId"), + null, delegateTask, item,object); + items.add(jsonObject); + } else { + JSONArray llr = item.getJSONArray("LLR"); + List list = JSONObject.parseArray(llr.toJSONString(), String.class); + foList.addAll(list); + this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), item.getString("resId"), + llr, delegateTask, item,object); + } + } + }else{ + JSONObject item = itemsList.getJSONObject(i); + if (item.getJSONArray("LLR") == null || item.getJSONArray("LLR").equals("")) { + flagDept = true; + JSONObject jsonObject = this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), item.getString("resId"), + null, delegateTask, item,object); + items.add(jsonObject); + } else { + JSONArray llr = item.getJSONArray("LLR"); + List list = JSONObject.parseArray(llr.toJSONString(), String.class); + foList.addAll(list); + this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), item.getString("resId"), + llr, delegateTask, item,object); + } + } + } + object.getJSONArray("taskBreak").getJSONObject(0).put("itemsList",items); + object.put("itemsList",items); + if(items.size()>0){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getAssignee()); + busBean.save(busProcessNew); + } + }else{ + //没条款 + Map map = ((Map) taskBreak.get(0)); + if(map.get("taskId")!=null){ + if(map.get("taskId").toString().equals(delegateTask.getId())){ + if(map.get("LLR") == null || map.get("LLR").equals("")){ + flagDept = true; + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) map.get("resId"), + null, delegateTask, taskBreak,object); + }else{ + foList.addAll((List) map.get("LLR")); + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) map.get("resId"), + (JSONArray) map.get("LLR"), delegateTask, taskBreak,object); + } + } + }else{ + if(map.get("LLR") == null || map.get("LLR").equals("")){ + flagDept = true; + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) map.get("resId"), + null, delegateTask, taskBreak,object); + }else{ + foList.addAll((List) map.get("LLR")); + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) map.get("resId"), + (JSONArray) map.get("LLR"), delegateTask, taskBreak,object); + } + } + } + + List llrList = new ArrayList<>(); + for(String str:foList){ + String uuid = UUID.randomUUID().toString(); + String llr = str +"|"+uuid.replace("-", ""); + llrList.add(llr); + } + + if(delegateTask.getVariable("deptList")!=null){ + List kja = (List) delegateTask.getVariable("deptList"); + List again = (List) delegateTask.getVariable("again"); + if(again!=null && again.size()>0){ + again.addAll(llrList); + delegateTask.setVariable("deptList",again); + }else{ + delegateTask.setVariable("again",llrList); + again = (List) delegateTask.getVariable("again"); + delegateTask.setVariable("deptList",again); + } + }else{ + delegateTask.setVariable("deptList",llrList); + } + delegateTask.setVariable("fqruserId", delegateTask.getAssignee()); + if(flagDept){ + delegateTask.setVariable("deptFlag",0); + delegateTask.setVariable("deptFlag1",0); + }else{ + delegateTask.setVariable("deptFlag",0); + delegateTask.setVariable("deptFlag1",1); + } + + delegateTask.setVariable("spflag",1); + delegateTask.setVariable("jsFlag",0); + List list = new ArrayList<>(); + list.add(delegateTask.getAssignee()); + delegateTask.setVariable("fqruserList",list); +// throw new ActivitiException(""); + } + + + private JSONObject creatOrUPdateForClause(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, Object datas,JSONObject object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + JSONObject data = (JSONObject) datas; + JSONArray array = new JSONArray(); + array.add(data); + object.put("itemsList",array); + object.getJSONArray("taskBreak").getJSONObject(0).put("itemsList",array); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + return null; + }else{ + return data; + } + } + + private void creatOrUPdateForStand(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, JSONArray stand,JSONObject object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + JSONObject data = (JSONObject) stand.get(0); + JSONArray array = new JSONArray(); + array.add(data); + object.put("taskBreak",array); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueFrount.java new file mode 100644 index 00000000..65c12cc0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueFrount.java @@ -0,0 +1,61 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.util.List; + +public class LawsWareIssueFrount implements TaskListener { + //法规入库及评估 + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + JdbcTemplate jdbcTemplate = SpringContextUtil.getBean(JdbcTemplate.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getVariable("fqruserId").toString()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); +// BusProcessNew one1 = busBean.getOne(queryWrapper1); +// if(one1!=null){ +// one1.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(one1); +// } + if(list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"法规入库及评估流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[法规入库及评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGAfter.java new file mode 100644 index 00000000..86926f20 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGAfter.java @@ -0,0 +1,312 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mysql.cj.xdevapi.JsonArray; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.ProcessEngine; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.task.Task; +import org.activiti.engine.task.TaskQuery; +import org.activiti.image.exception.ActivitiImageException; +import org.springframework.jdbc.core.JdbcTemplate; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class LawsWareIssuePGAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + ProcessEngine processEngine = SpringContextUtil.getBean(ProcessEngine.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + //更新任务状态 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + one.setFinishFlag("1"); + busBean.saveOrUpdate(one); + + + //是否全部选择人员 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("ishave1",1); + delegateTask.setVariable("ishave2",1); + delegateTask.setVariable("ishave",1); + delegateTask.setVariable("zlc",1); + //部分回退 + delegateTask.setVariable("ishave3",1); + //人员集合 + List deptList = new ArrayList(); + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + //标准信息 + JSONObject stand = object.getJSONObject("stand"); + //条款新消息(没有条款size为0) + JSONArray itemsList = ((JSONObject)taskBreak.get(0)).getJSONArray("itemsList"); + //是否单条退回 + String backFlag = object.getString("backFlag"); + + List again = new ArrayList<>(); + delegateTask.setVariable("again",again); + if(backFlag.equals("0")){ + //退回 +// delegateTask.setVariable("ishave",0); + +// List list=processEngine.getHistoryService() // 历史相关Service +// .createHistoricTaskInstanceQuery() // 创建历史任务实例查询 +// .processInstanceId(delegateTask.getProcessInstanceId()) // 用流程实例id查询 +// .unfinished() // 查询已经完成的任务 +// .list(); +// +// int num = 0; + boolean flag = true; +// for(HistoricTaskInstance hti:list){ +// if(hti.getName().equals("填写FO")){ +// num++; +// }else if(hti.getName().equals("填写SVPPS")){ +// flag = false; +// }else if(hti.getName().equals("转交填写填写SVPPS")){ +// flag = false; +// }else if(hti.getName().equals("级经理审批高")){ +// flag = false; +// } +// } +// +// if(flag){ +// if(num>1){ +// flag = false; +// } +// } + + System.out.println(delegateTask.getVariable("nrOfActiveInstances")); + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + }else{ + flag = false; + } + + if(flag){ + //退回 + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + List fqruserId = taskService.createTaskQuery().processInstanceId(delegateTask.getProcessInstanceId()).taskAssignee(delegateTask.getVariable("fqruserId").toString()).list(); + if(fqruserId.size()>0){ + delegateTask.setVariable("ishave2",0); + delegateTask.setVariable("jsFlag",1); + for(Task task:fqruserId){ + if(task.getTaskDefinitionKey().equals("sid-D746C8B5-9754-45D2-B717-1C71A2C5680B")){ + throw new ActivitiException("发起人重新提交退回条款后,才可以退回"); + } + } + }else{ + delegateTask.setVariable("ishave2",0); + delegateTask.setVariable("jsFlag",1); + } + }else{ + //退回 + delegateTask.setVariable("ishave",0); + delegateTask.setVariable("jsFlag",1); + } + + if(itemsList.size()>0){ + //有条款 + JSONArray items = new JSONArray();//拼接条款 + for(Object item:itemsList){ + Map map = ((Map) item); + if(((Map) item).get("taskId").equals(delegateTask.getId())){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) delegateTask.getVariable("fqruserId")); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + }else{ + //没条款 + //查询fo人员 + if(((Map) taskBreak.get(0)).get("taskId").equals(delegateTask.getId())){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) delegateTask.getVariable("fqruserId")); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper2); + if(one1!=null){ + one1.setCommitFlag("3");//退回 + busBean.saveOrUpdate(one1); + } + }else{ + //提交 + if(itemsList.size()>0){ + //有条款 + JSONArray items = new JSONArray();//拼接条款 + for(Object item:itemsList){ + Map map = ((Map) item); + //查询fo人员 + if (map.get("FO") == null || map.get("FO").equals("")) { + flagDept = true; + JSONObject jsonObject = this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), (String) map.get("id"), + null, delegateTask, item,object); + items.add(jsonObject); + } else { + deptList.addAll((List)map.get("FO")); + this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), (String) map.get("id"), + (JSONArray) map.get("FO"), delegateTask, item,object); + } + } + ((JSONObject)object.getJSONArray("taskBreak").get(0)).put("itemsList",items); + if(items.size()>0){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setUserId(delegateTask.getAssignee()); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + }else{ + //没条款 + //查询fo人员 + if(((Map) taskBreak.get(0)).get("FO") == null || ((Map) taskBreak.get(0)).get("FO").equals("")){ + flagDept = true; + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) ((Map) taskBreak.get(0)).get("id"), + null, delegateTask, stand,object); + }else{ + deptList.addAll((List) ((Map) taskBreak.get(0)).get("FO")); + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) ((Map) taskBreak.get(0)).get("id"), + (JSONArray) ((Map) taskBreak.get(0)).get("FO"), delegateTask, (JSONObject) taskBreak.get(0),object); + } + } + if(flagDept){ + delegateTask.setVariable("ishave1",0); + delegateTask.setVariable("ishave3",0); + }else{ + delegateTask.setVariable("ishave1",0); + delegateTask.setVariable("ishave3",1); + } + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper2); + if(one1!=null){ + one1.setCommitFlag("4");//提交 + busBean.saveOrUpdate(one1); + } + } + delegateTask.setVariable("things",deptList); + delegateTask.setVariable("flag3",1); +// throw new ActivitiException(""); + } + + private JSONObject creatOrUPdateForClause(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, Object datas,JSONObject object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + String dept = delegateTask.getVariable("dept").toString(); + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + String assignee = sub_id[0]; + + JSONObject data = (JSONObject) datas; + JSONArray array = new JSONArray(); + array.add(data); + object.put("itemsList",array); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setSubId(subId); + busBean.save(busProcessNew); + } + return null; + }else{ + return data; + } + } + + private void creatOrUPdateForStand(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, JSONObject stand,JSONObject object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + String dept = delegateTask.getVariable("dept").toString(); + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + String assignee = sub_id[0]; + + JSONObject data = (JSONObject) stand; + JSONArray array = new JSONArray(); + array.add(data); + object.put("taskBreak",array); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setSubId(subId); + busBean.save(busProcessNew); + } + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setSubId(subId); + busBean.save(busProcessNew); + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGFrount.java new file mode 100644 index 00000000..0fb39606 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssuePGFrount.java @@ -0,0 +1,74 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class LawsWareIssuePGFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + +// JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + String dept = delegateTask.getVariable("dept").toString(); + + List again = new ArrayList<>(); + delegateTask.setVariable("again",again); + +// List list1 = Arrays.asList(dept.split("[|]")); + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + String assignee = sub_id[0]; + delegateTask.setAssignee(dept.split("[|]")[0]); + //更新 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one = list.get(0); + one.setTaskId(delegateTask.getId()); + one.setSubId(subId); + busBean.saveOrUpdate(one); + } +// throw new ActivitiException(""); + + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"法规入库及评估流程"); + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[法规入库及评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKAfter.java new file mode 100644 index 00000000..7860cf82 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKAfter.java @@ -0,0 +1,63 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.HistoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.task.Task; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +public class LawsWareIssueRKAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + QueryWrapper queryWrapper2 = new QueryWrapper<>(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + if(one1!=null){ + one1.setEndTime(sdf.format(new Date())); + busProcessNameService.saveOrUpdate(one1); + } + + //查询是否还有未完成任务 + List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricActivityInstanceId().asc().list(); + + boolean flag=true; + for(HistoricActivityInstance historicActivityInstance:list1){ + if(historicActivityInstance.getActivityName()!=null){ + if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("发起人汇总")){ + flag = false; + } + } + } + + if(!flag){ + throw new ActivitiException("还有未提交的任务,暂时无法入库"); + } + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + List tasksList = taskService.createTaskQuery().processInstanceId(delegateTask.getProcessInstanceId()).active().list(); + if(tasksList.size()==1){ + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + runtimeService.signalEventReceived("hz"); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKFrount.java new file mode 100644 index 00000000..098b1b47 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueRKFrount.java @@ -0,0 +1,78 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class LawsWareIssueRKFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + +// String dept = delegateTask.getVariable("dept").toString(); +// +// String[] sub_id = dept.split("[|]"); +// String subId = sub_id[1]; + +// QueryWrapper queryWrapper2 = new QueryWrapper(); +//// queryWrapper2.eq("USER_ID", delegateTask.getVariable("fqruserId").toString()); +// queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper2.eq("MSG_TYPE","unangree"); +//// queryWrapper2.eq("SUB_ID",subId); +// queryWrapper2.isNull("TASK_ID"); +// List list1 = busBean.list(queryWrapper2); +// if(list1.size()>0){ +// for(BusProcessNew busProcessNew:list1){ +// busProcessNew.setUserId(delegateTask.getVariable("fqruserId").toString()); +// busBean.saveOrUpdate(busProcessNew); +// } +// } + + QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("MSG_TYPE","unangree"); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busProcessNew.setTaskId(delegateTask.getId()); + busProcessNew.setUserId(delegateTask.getVariable("fqruserId").toString()); + busBean.saveOrUpdate(busProcessNew); + } + } +// BusProcessNew one1 = busBean.getOne(queryWrapper1); +// one1.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"法规入库及评估流程"); + + +// IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); +// BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); +// String creater = busProcessName.getCreatUser(); +// ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); +// UserVO users = userVOResponseMessage.getData(); +// String content = "您好,["+busProcessName.getPrcNum()+"]-["+ busProcessName.getPrcName() +"] 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人["+creater+"][邮箱地址:"+users.getEmail()+"]\n" + +// " ——来自 全球标准法规管理系统"; +// lawsUserInfoService.sendEmail(delegateTask.getAssignee(),content,"GSRM——【待办任务】[法规入库及评估流程]有您的待办任务"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPAfter.java new file mode 100644 index 00000000..8e753a36 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPAfter.java @@ -0,0 +1,214 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.history.HistoricTaskInstance; + +import java.util.*; + +public class LawsWareIssueSPAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + + //是否审批通过 + String spFlag = object.getString("spFlag"); +// if(spFlag.equals("0")){ +// delegateTask.setVariable("spflag",1); +// }else{ +// delegateTask.setVariable("spflag",0); +// } + + JSONArray taskBreak = object.getJSONArray("taskBreak"); + JSONArray array = new JSONArray(); +// if(((JSONObject) taskBreak.get(0)).getJSONArray("itemsList") != null && ((JSONObject) taskBreak.get(0)).getJSONArray("itemsList").size()>0){ +// array = ((JSONObject) ((JSONObject) taskBreak.get(0)).getJSONArray("itemsList").get(0)).getJSONArray("FO"); +// }else{ +// array = ((JSONObject) taskBreak.get(0)).getJSONArray("FO"); +// } + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("MSG_TYPE","angree"); + queryWrapper1.eq("USER_ID",(String) delegateTask.getVariable("fqruserId")); + List list2 = busBean.list(queryWrapper1); + if(spFlag.equals("1")){ + delegateTask.setVariable("spflag",0); + } + String dept = delegateTask.getVariable("dept").toString(); + + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + +// if(spFlag.equals("0")){ +// if(list2.size()==0 && !delegateTask.getVariable("spflag").toString().equals("1")){ +// BusProcessNew one1 = new BusProcessNew(); +// one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// one1.setMesg(object.toJSONString()); +// one1.setPId(delegateTask.getProcessInstanceId()); +// one1.setUserId((String) delegateTask.getVariable("fqruserId")); +// one1.setFinishFlag("0"); +// one1.setMsgType("angree"); +// busBean.save(one1); +// } +// }else{ +// delegateTask.setVariable("spflag",0); + for(Object obj:taskBreak){ + if(((JSONObject) obj).getJSONArray("itemsList") != null && ((JSONObject) obj).getJSONArray("itemsList").size()>0){ + for(Object obj1:((JSONObject) obj).getJSONArray("itemsList")){ + if(((Map)obj1).get("taskId").toString().equals(delegateTask.getId())){ + String userId = ((JSONObject) obj1).getString("foFillUser"); + JSONObject object1 = new JSONObject(); + object1 = object; + object1.put("taskBreak",taskBreak); + JSONArray arra = new JSONArray(); + ((JSONObject) obj1).put("spBackFlag",1); + arra.add(obj1); + object1.put("itemsList",arra); + object1.getJSONArray("taskBreak").getJSONObject(0).put("itemsList",arra); + + String str = JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect); + BusProcessNew one2 = new BusProcessNew(); + one2.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one2.setMesg(JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect)); + one2.setPId(delegateTask.getProcessInstanceId()); + one2.setUserId(userId); + one2.setFinishFlag("0"); + one2.setMsgType("unangree"); + one2.setSubId(subId); + busBean.save(one2); + + List foList = JSONObject.parseArray(((JSONObject) obj1).getJSONArray("FO").toJSONString(), String.class); +// if(delegateTask.getVariable("things") == null){ +// List list = (List) delegateTask.getVariable("things"); +// list.addAll(JSONObject.parseArray(((JSONObject) obj1).getJSONArray("FO").toJSONString(), String.class)); +// delegateTask.setVariable("things",list); + delegateTask.setVariable("things",foList); +// } + System.out.println(delegateTask.getVariable("things")); +// BusProcessNew one3 = new BusProcessNew(); +// one3.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// one3.setMesg(JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect)); +// one3.setPId(delegateTask.getProcessInstanceId()); +// one3.setUserId((String) delegateTask.getVariable("fqruserId")); +// one3.setFinishFlag("0"); +// one3.setMsgType("angree"); +// busBean.save(one3); + } + } + }else{ + if(((Map) obj).get("taskId").toString().equals(delegateTask.getId())){ + String userId = ((JSONObject) obj).getString("foFillUser"); + JSONObject object1 = new JSONObject(); + object1 = object; + JSONArray arra = new JSONArray(); + ((JSONObject) obj).put("spBackFlag",1); + arra.add(obj); + object1.put("taskBreak",arra); + + BusProcessNew one2 = new BusProcessNew(); + one2.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one2.setMesg(JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect)); + one2.setPId(delegateTask.getProcessInstanceId()); + one2.setUserId(userId); + one2.setFinishFlag("0"); + one2.setMsgType("unangree"); + one2.setSubId(subId); + busBean.save(one2); + + List foList = JSONObject.parseArray(((JSONObject) obj).getJSONArray("FO").toJSONString(), String.class); +// if(delegateTask.getVariable("things") == null){ +// List list = (List) delegateTask.getVariable("things"); +// list.addAll(JSONObject.parseArray(((JSONObject) obj).getJSONArray("FO").toJSONString(), String.class)); +// delegateTask.setVariable("things",list); + delegateTask.setVariable("things",foList); +// } + +// BusProcessNew one3 = new BusProcessNew(); +// one3.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// one3.setMesg(JSON.toJSONString(object1, SerializerFeature.DisableCircularReferenceDetect)); +// one3.setPId(delegateTask.getProcessInstanceId()); +// one3.setUserId((String) delegateTask.getVariable("fqruserId")); +// one3.setFinishFlag("0"); +// one3.setMsgType("angree"); +// busBean.save(one3); + } + } + } +// for(Object object1:array){ +// BusProcessNew one1 = new BusProcessNew(); +// one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// one1.setMesg(object.toJSONString()); +// one1.setPId(delegateTask.getProcessInstanceId()); +// one1.setUserId(object1.toString()); +// one1.setFinishFlag("0"); +// one1.setMsgType("unangree"); +// busBean.save(one1); +// } +// if(list2.size()>0){ +// busBean.removeById(list2.get(0).getId()); +// } +// throw new ActivitiException(""); +// } + + //更新任务状态 + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID", delegateTask.getId()); +// queryWrapper1.eq("USER_ID",) + List list = busBean.list(queryWrapper2); +// BusProcessNew one = busBean.getOne(queryWrapper1); + BusProcessNew one= list.get(0); + if(spFlag.equals("0")){ + one.setCommitFlag("0"); + }else{ + one.setCommitFlag("1"); + } +// one.setCommitFlag("0"); + busBean.saveOrUpdate(one); + + + + //查询是否还有未完成任务 +// List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) +// .orderByHistoricActivityInstanceId().asc().list(); +// +// boolean flag=true; +// for(HistoricActivityInstance historicActivityInstance:list1){ +// if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("法规入库")){ +// flag = false; +// } +// } + +// if(flag){ +// delegateTask.setVariable("zlc",0); + delegateTask.setVariable("jsFlag",0); +// }else{ +// delegateTask.setVariable("zlc",1); +// delegateTask.setVariable("jsFlag",0); +// } +// throw new ActivitiException(""); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPFrount.java new file mode 100644 index 00000000..c45aaddf --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSPFrount.java @@ -0,0 +1,53 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class LawsWareIssueSPFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + String dept = delegateTask.getVariable("dept").toString(); + + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + String assignee = sub_id[0]; + + //更新 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("SUB_ID",subId); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one = list.get(0); +// for(BusProcessNew busProcessNew:list){ +// busProcessNew.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(busProcessNew); +// } + one.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one); + delegateTask.setAssignee(one.getUserId()); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"法规入库及评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSAfter.java new file mode 100644 index 00000000..6c2f5cbd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSAfter.java @@ -0,0 +1,260 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +public class LawsWareIssueSVPPSAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //更新任务状态 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + one.setFinishFlag("1"); + busBean.saveOrUpdate(one); + + String dept = delegateTask.getVariable("dept").toString(); + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + String assignee = sub_id[0]; + + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + //标准信息 + JSONObject stand = ((JSONObject)taskBreak.get(0)).getJSONObject("stand"); + //条款新消息(没有条款size为0) + JSONArray itemsList = ((JSONObject)taskBreak.get(0)).getJSONArray("itemsList"); + + //是否全部选择人员 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("flag0",1); + delegateTask.setVariable("flag1",1); +// delegateTask.setVariable("flag3",1); + + //是否单条退回 + String backFlag = object.getString("backFlag"); + + if(backFlag.equals("0")){ + //退回 + delegateTask.setVariable("flag3",2); + + if(delegateTask.getVariable(sub_id[1])!=null){ + delegateTask.setVariable(sub_id[1],null); + } + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("SUB_ID",subId); + queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper2.eq("MSG_TYPE","svppsToMan"); + List list = busBean.list(queryWrapper2); + + if(list!=null && list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busBean.removeById(busProcessNew.getId()); + } + } + + if(itemsList.size()>0){ + for(Object item:itemsList){ + Map map = ((Map) item); + if(((Map) item).get("taskId").equals(delegateTask.getId())){ + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setMsgType("svppsToMan"); + one1.setUserId(assignee); + one1.setFinishFlag("0"); + one1.setSubId(subId); + busBean.save(one1); + } + } + }else{ + if(((JSONObject)taskBreak.get(0)).getString("taskId").toString().equals(delegateTask.getId())){ + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(assignee); + one1.setFinishFlag("0"); + one1.setSubId(subId); + one1.setMsgType("svppsToMan"); + busBean.save(one1); + } + } + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper3); + if(one1!=null){ + one1.setCommitFlag("3");//退回 + busBean.saveOrUpdate(one1); + } + }else{ + //提交 + + if(object.getString("ifIn").equals("0")){ + JSONArray arrayManageId = new JSONArray(); + String spFlag = ""; + if(((JSONObject) taskBreak.get(0)).getJSONArray("itemsList") != null && ((JSONObject) taskBreak.get(0)).getJSONArray("itemsList").size()>0){ + arrayManageId = ((JSONObject) ((JSONObject) taskBreak.get(0)).getJSONArray("itemsList").get(0)).getJSONArray("manageId"); + spFlag = ((JSONObject) ((JSONObject) taskBreak.get(0)).getJSONArray("itemsList").get(0)).getString("spBackFlag"); + }else{ + arrayManageId = ((JSONObject) taskBreak.get(0)).getJSONArray("manageId"); + spFlag = ((JSONObject) taskBreak.get(0)).getString("spBackFlag"); + } + + List listManageId = JSONObject.parseArray(arrayManageId.toJSONString(), String.class); + + //todo 退回注记 + + + if(!delegateTask.getVariable("flag3").toString().equals("2")){ + delegateTask.setVariable("flag0",0); + + if(spFlag!=null && !spFlag.equals("")){ + if(delegateTask.getVariable(sub_id[1])==null){ + delegateTask.setVariable(sub_id[1],listManageId); + delegateTask.setVariable("suppers",listManageId); + }else{ + List suppers=(List) delegateTask.getVariable(sub_id[1]); + delegateTask.setVariable("suppers",suppers); + } + }else{ + if(delegateTask.getVariable(sub_id[1])!=null){ + List list = (List) delegateTask.getVariable(sub_id[1]); + list.addAll(listManageId); + delegateTask.setVariable(sub_id[1],list); + }else{ + delegateTask.setVariable(sub_id[1],listManageId); + } + List suppers=(List) delegateTask.getVariable(sub_id[1]); + delegateTask.setVariable("suppers",suppers); + } + + for(String str:listManageId){ + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(str); + one1.setFinishFlag("0"); + one1.setMsgType("svppsToMan"); + one1.setSubId(subId); + busBean.save(one1); + } + }else{ + delegateTask.setVariable("flag0",1); + + if(delegateTask.getVariable(sub_id[1])!=null){ + delegateTask.setVariable(sub_id[1],null); + delegateTask.setVariable("suppers",null); + } + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("SUB_ID",subId); + queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper2.eq("MSG_TYPE","svppsToMan"); + List list = busBean.list(queryWrapper2); + + if(list!=null && list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busBean.removeById(busProcessNew.getId()); + } + } + + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(assignee); + one1.setFinishFlag("0"); + one1.setMsgType("svppsToMan"); + one1.setSubId(subId); + busBean.save(one1); + } + + + }else{ + if(!delegateTask.getVariable("flag3").toString().equals("2")){ + delegateTask.setVariable("flag1",0); + + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(delegateTask.getVariable("fqruserId").toString()); + one1.setFinishFlag("0"); + one1.setMsgType("unangree"); + one1.setSubId(subId); + busBean.save(one1); + }else{ + delegateTask.setVariable("flag1",1); + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("SUB_ID",subId); + queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper2.eq("MSG_TYPE","unangree"); + List list = busBean.list(queryWrapper2); + if(list!=null && list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busBean.removeById(busProcessNew.getId()); + } + } + + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(assignee); + one1.setFinishFlag("0"); + one1.setMsgType("unangree"); + one1.setSubId(subId); + busBean.save(one1); + } + } + QueryWrapper queryWrapper3 = new QueryWrapper(); + queryWrapper3.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper3); + if(one1!=null){ + one1.setCommitFlag("4");//提交 + busBean.saveOrUpdate(one1); + } +// throw new ActivitiException(""); + } + + + + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSFrount.java new file mode 100644 index 00000000..cac64d59 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/LawsWare/LawsWareIssueSVPPSFrount.java @@ -0,0 +1,66 @@ +package com.ydw.bat.wkflow.listener.LawsWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; + +public class LawsWareIssueSVPPSFrount implements TaskListener{ + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + +// JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); +// QueryWrapper queryWrapper2 = new QueryWrapper(); +// queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); +// queryWrapper2.eq("MSG_TYPE","angree"); +// queryWrapper2.isNull("TASK_ID"); +// List list1 = busBean.list(queryWrapper2); +// if(list1.size()>0){ +// for(BusProcessNew busProcessNew:list1){ +// busBean.removeById(busProcessNew.getId()); +// } +// } +// List suppersList = new ArrayList<>(); +// delegateTask.setVariableLocal("suppers",suppersList); + String dept = delegateTask.getVariable("dept").toString(); + + String[] sub_id = dept.split("[|]"); + String subId = sub_id[1]; + String assignee = sub_id[0]; + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.eq("SUB_ID",subId); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one = list.get(0); + one.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one); + } + + delegateTask.setVariable("spflag",1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"法规入库及评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppAfter.java new file mode 100644 index 00000000..0edcecfb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppAfter.java @@ -0,0 +1,126 @@ +package com.ydw.bat.wkflow.listener.OverSeasLawsList; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class FoAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONObject bzqdForm = object.getJSONObject("bzqdForm"); + String opinion = bzqdForm.getString("opinion"); + + + if(opinion.equals("0")){ + //通过 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + if(one.getCommitFlag()==null || !one.getCommitFlag().equals("1")){ + one.setCommitFlag("0"); + one.setCommitText(""); + busBean.saveOrUpdate(one); + } + } + + if(delegateTask.getVariable("foFlag").toString().equals("0")){ + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("MSG_TYPE","angree"); + queryWrapper2.isNull("TASK_ID"); + queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); + BusProcessNew one1 = busBean.getOne(queryWrapper2); + if(one1 == null){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setMsgType("angree"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + delegateTask.setVariable("fqrUser",delegateTask.getVariable("fqr").toString()); + }else{ + //不通过 + JSONObject obj = (JSONObject) bzqdForm.getJSONArray("opinionAll").get(0); + obj.put("opinionAll",new Date()); + + QueryWrapper queryWrapp = new QueryWrapper(); + queryWrapp.eq("TASK_ID",delegateTask.getId()); + BusProcessNew bus = busBean.getOne(queryWrapp); + if(bus!=null){ + bus.setCommitFlag("1"); + bus.setCommitText(""); + busBean.saveOrUpdate(bus); + } + + delegateTask.setVariable("foFlag",1); + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + queryWrapper1.eq("USER_ID",delegateTask.getVariable("fqr").toString()); + BusProcessNew one = busBean.getOne(queryWrapper1); + if(one!=null){ + String mes = one.getMesg(); + JSONObject mesjson = JSONObject.parseObject(mes); + JSONObject bzqdForm1 = mesjson.getJSONObject("bzqdForm"); + JSONArray array = bzqdForm1.getJSONArray("opinionAll"); + ((Map) bzqdForm.getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + array.add(bzqdForm.getJSONArray("opinionAll").get(0)); + object.getJSONObject("bzqdForm").put("opinionAll",array); + one.setMesg(object.toJSONString()); + busBean.saveOrUpdate(one); + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + ((Map) bzqdForm.getJSONArray("opinionAll").get(0)).put("opinionTime",new Date()); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setMsgType("unagree"); + busBean.save(busProcessNew); + } + + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("MSG_TYPE","angree"); + queryWrapper2.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper2.isNull("TASK_ID"); + BusProcessNew one1 = busBean.getOne(queryWrapper2); + + if(one1!=null){ + busBean.removeById(one1.getId()); + } + delegateTask.setVariable("fqrUser",delegateTask.getVariable("fqr").toString()); + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppFrount.java new file mode 100644 index 00000000..9abc51cf --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/FoAppFrount.java @@ -0,0 +1,37 @@ +package com.ydw.bat.wkflow.listener.OverSeasLawsList; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准法规清单发布/更新流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAfter.java new file mode 100644 index 00000000..da683756 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAfter.java @@ -0,0 +1,73 @@ +package com.ydw.bat.wkflow.listener.OverSeasLawsList; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +public class OpenProcessAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + String OVERTIME = object.getJSONObject("prcForm").getString("prcDeadline"); + String username = object.getJSONObject("prcForm").getString("createUserName"); + String prcName = object.getJSONObject("listInfo").getString("accessContent")+ + "清单发布/更新"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("18"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcType","18"); + object.getJSONObject("prcForm").put("prcName",prcName); + + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + delegateTask.setVariable("fqrUser",delegateTask.getAssignee()); + + JSONObject bzqdForm = object.getJSONObject("bzqdForm"); + String fo = bzqdForm.getString("attendee"); + + List foUserIds = Arrays.asList(fo.split(","));; + + for(String foUserId:foUserIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(foUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + delegateTask.setVariable("foUserIds",foUserIds); + delegateTask.setVariable("foFlag",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAgeinAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAgeinAfter.java new file mode 100644 index 00000000..c6b6c23e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessAgeinAfter.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.listener.OverSeasLawsList; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Arrays; +import java.util.List; + +public class OpenProcessAgeinAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + +// JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); +// +// +// JSONObject bzqdForm = object.getJSONObject("bzqdForm"); +// String fo = bzqdForm.getString("attendee"); +// +// List foUserIds = Arrays.asList(fo.split(","));; +// +// for(String foUserId:foUserIds){ +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(foUserId); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// } +// +// delegateTask.setVariable("foUserIds",foUserIds); +// delegateTask.setVariable("foFlag",0); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessFrount.java new file mode 100644 index 00000000..c40f2366 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/OverSeasLawsList/OpenProcessFrount.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.OverSeasLawsList; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class OpenProcessFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准法规清单发布/更新流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsAfter.java new file mode 100644 index 00000000..e1e00d90 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsAfter.java @@ -0,0 +1,113 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; +import java.util.stream.Collectors; + +public class ContactsAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + //fo集合 + List foList = new ArrayList<>(); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + //循环政策数据 + JSONObject objObject = (JSONObject) taskBreak.get(0); + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if (arry != null && arry.size() > 0) { + + Map map = new HashMap<>(); + for (Object o:arry) { + JSONObject jsonObject = (JSONObject) o; + + //获取条款选择的fo + String fo = jsonObject.getString("FO"); + List folistByItems = Arrays.asList(fo.split(",")); + for (String userId:folistByItems) { + JSONArray jsonArray = new JSONArray(); + if (map.get(userId) != null){ + JSONArray itemArr = map.get(userId); + for (Object item:itemArr) { + JSONObject jsonObject1 = (JSONObject) item; + jsonArray.add(jsonObject1); + } + } + jsonArray.add(jsonObject); + map.put(userId,jsonArray); + } + } + for (String userId:map.keySet()) { + object.getJSONArray("taskBreak").getJSONObject(0).put("itemsList",map.get(userId)); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(userId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + foList.addAll(map.keySet()); + } else { + //无条款 + //获取条款选择的fo + String fo = objObject.getString("FO"); + List folistByItems = Arrays.asList(fo.split(",")); + foList.addAll(folistByItems); + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 每条政策每个人一条数据 + for (String str : folistByItems) { + JSONArray array = new JSONArray(); + array.add(objObject); + object.put("taskBreak", array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + } + +// 全局保存多个联络人选择的fo + if (taskService.getVariable(delegateTask.getId(), "allFo") != null) { + Object obj = taskService.getVariable(delegateTask.getId(), "allFo"); + List list = (List) obj; + foList.addAll(list); + } + foList = foList.stream() + .distinct() + .collect(Collectors.toList()); + Map> map = new HashMap<>(); + map.put("allFo", foList); + taskService.setVariable(delegateTask.getId(), "allFo", foList); + delegateTask.setVariable("foList", foList); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsFrount.java new file mode 100644 index 00000000..0b3a7998 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/ContactsFrount.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; +//政策评估 +public class ContactsFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"政策入库及评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfrount.java new file mode 100644 index 00000000..3f3064b5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfrount.java @@ -0,0 +1,43 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FoAfrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"政策入库及评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfter.java new file mode 100644 index 00000000..890ff019 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FoAfter.java @@ -0,0 +1,234 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.HistoryService; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.history.HistoricTaskInstanceQuery; + +import java.util.*; + +public class FoAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("foBackFlag", 0); + taskService.removeVariable(delegateTask.getId(),"allFo"); + +// 获取政策数据 + JSONArray taskBreak = object.getJSONArray("taskBreak"); +// 循环政策数据 + JSONArray jsonArray = new JSONArray(); +// 有更改时间 + JSONArray updateTimeJsonArray = new JSONArray(); +// 判断是否退回 + boolean next = true; + for (Object obj : taskBreak) { + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if (object.getString("isBack").equals("1")){ + next = isNext(taskService, delegateTask, busBean, historyService, object, taskBreak, arry); + }else { + if (arry != null && arry.size() > 0) { + //有条款 + JSONArray jsonArray1 = new JSONArray(); + for (Object obj1 : arry) { + JSONObject objObject1 = (JSONObject) obj1; + //不退回 + //判断是否符合 + boolean jspgwcFlag; + if (objObject1.getString("jspg").equals("1") || objObject1.getString("jspg").equals("2")) { + objObject.put("jspgwcDate", new Date()); + jspgwcFlag = true; + } else { + jspgwcFlag = false; + } + boolean sjzrshwcFlag; + if (objObject1.getString("isInvolveAccess").equals("1") && objObject1.getString("wczrsh").equals("1")) { + objObject1.put("zrshwcDate", new Date()); + sjzrshwcFlag = true; + } else if (!objObject1.getString("isInvolveAccess").equals("1")) { + sjzrshwcFlag = true; + } else { + sjzrshwcFlag = false; + } + if (jspgwcFlag && sjzrshwcFlag) { + delegateTask.setVariable("foFlag", 1); + } else { + delegateTask.setVariable("foFlag", 0); + } + objObject1.put("currentZRBM", object.getString("currentZRBM")); + objObject1.put("currentFo", object.getString("currentFo")); + objObject1.put("currentFoName", object.getString("currentFoName")); + + + if (delegateTask.getVariable("foFlag").toString().equals("0")) { + jsonArray1.add(objObject1); + } + } + if (delegateTask.getVariable("foFlag").toString().equals("0")) { + objObject.put("itemsList", jsonArray1); + } + } else { + //无条款 + //不退回 + //判断是否符合 + boolean jspgwcFlag; + if (objObject.getString("jspg").equals("1") || objObject.getString("jspg").equals("2")) { + objObject.put("jspgwcDate", new Date()); + jspgwcFlag = true; + } else { + jspgwcFlag = false; + } + boolean sjzrshwcFlag; + if (objObject.getString("isInvolveAccess").equals("1") && objObject.getString("wczrsh").equals("1")) { + objObject.put("zrshwcDate", new Date()); + sjzrshwcFlag = true; + } else if (!objObject.getString("isInvolveAccess").equals("1")) { + sjzrshwcFlag = true; + } else { + sjzrshwcFlag = false; + } + if (jspgwcFlag && sjzrshwcFlag) { + delegateTask.setVariable("foFlag", 1); + } else { + delegateTask.setVariable("foFlag", 0); + } + objObject.put("currentZRBM", object.getString("currentZRBM")); + objObject.put("currentFo", object.getString("currentFo")); + objObject.put("currentFoName", object.getString("currentFoName")); + } + } + + if (delegateTask.getVariable("foFlag").toString().equals("0")) { + jsonArray.add(objObject); + } + updateTimeJsonArray.add(objObject); + } + if (next) { + object.put("taskBreak", updateTimeJsonArray); +// 保存要整改的数据 + object.put("rectificationTaskId", delegateTask.getId()); + taskService.setVariableLocal(delegateTask.getId(), "rectification", jsonArray); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + + private boolean isNext(TaskService taskService, DelegateTask delegateTask, IBusProcessNewService busBean, HistoryService historyService, JSONObject object, JSONArray taskBreak, JSONArray jsonArray) { +// 有退回不进行数据汇总 + delegateTask.setVariable("hzFlag", 1); +// 退回多次只记录一次,其他的子流程结束 + extracted(delegateTask, historyService); +// 退回的数据进行汇总 + JSONArray resultArray = new JSONArray(); +// if (object.get("backTaskId") == null){ +// object.put("backTaskId",delegateTask.getId()); +// }else { + JSONArray backJson = (JSONArray) taskService.getVariable(delegateTask.getId(), "backJson"); + JSONObject resultJsonObject = (JSONObject) taskBreak.get(0); + JSONArray jsonArray1 = new JSONArray(); + if (backJson != null && backJson.size() > 0) { + JSONObject jsonObject = (JSONObject) backJson.get(0); + jsonArray1 = jsonObject.getJSONArray("itemsList"); + } + + JSONArray jsonArray2 = new JSONArray(); + for (Object o : jsonArray1) { + jsonArray2.add(o); + } + for (Object o : jsonArray) { + jsonArray2.add(o); + + } + + Map map = new HashMap<>(); + for (Object o : jsonArray2) { + JSONObject jsonObject1 = (JSONObject) o; + map.putIfAbsent(jsonObject1.getString("id"), jsonObject1); + } + JSONArray newJsonArray = new JSONArray(); + for (String id : map.keySet()) { + newJsonArray.add(map.get(id)); + } + + Collections.sort(newJsonArray, (o1, o2) -> { + JSONObject js1 = (JSONObject) o1; + JSONObject js2 = (JSONObject) o2; + Integer i1 = Integer.valueOf(js1.get("resNum").toString()); + Integer i2 = Integer.valueOf(js2.get("resNum").toString()); + return i1 - i2; + }); + resultJsonObject.put("itemsList", newJsonArray); + resultArray.add(resultJsonObject); + taskService.setVariable(delegateTask.getId(), "backJson", resultArray); +// } + object.put("taskBreak", resultArray); + + delegateTask.setVariable("foBackFlag", 1); + +// 保存汇总后的数据 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getVariable("fqr").toString()); + queryWrapper1.eq("P_ID", delegateTask.getProcessInstanceId()); + queryWrapper1.eq("TASK_ID", object.getString("backTaskId")); + List list = busBean.list(queryWrapper1); + if (list.size() == 0) { + //退回 + //插入数据库BUS_PROCESS_NEW表 插入数据 执行人为fqr + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } else { + list.get(0).setMesg(object.toJSONString()); + busBean.saveOrUpdate(list.get(0)); + } + return false; + } + + private void extracted(DelegateTask delegateTask, HistoryService historyService) { + HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()).taskName("退回再次下发"); + List list1 = historicTaskInstanceQuery.list(); + List list2 = new ArrayList<>(); + for (HistoricTaskInstance historicTaskInstance : list1) { + if (historicTaskInstance.getEndTime() == null) { + list2.add(historicTaskInstance); + } + } + if (list2.size() == 0) { + delegateTask.setVariable("backFlag", 0); + } else { + delegateTask.setVariable("backFlag", 1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrAfter.java new file mode 100644 index 00000000..a710ea47 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrAfter.java @@ -0,0 +1,88 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import net.bytebuddy.implementation.bytecode.Throw; +import org.activiti.engine.HistoryService; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.history.HistoricTaskInstanceQuery; +import org.activiti.engine.history.HistoricVariableInstance; + +import java.util.ArrayList; +import java.util.List; + +public class FqrAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID", delegateTask.getProcessInstanceId()); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + List list = busBean.list(queryWrapper1); + JSONObject jsonObject = JSON.parseObject(list.get(0).getMesg()); + List historicVariableInstances = historyService.createHistoricVariableInstanceQuery() + .taskId(jsonObject.get("rectificationTaskId").toString()) + .variableName("rectification").list(); + JSONArray jsonArray = (JSONArray) historicVariableInstances.get(0).getValue(); +// 判断是否有要整改的数据 + if (jsonArray.size() == 0) { + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(jsonObject.toJSONString()); + busBean.save(busProcessNew); + } else { + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(jsonObject.getString("currentFo")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(jsonObject.toJSONString()); + busBean.save(busProcessNew); + } +// 判断是否走汇总节点 + extracted(delegateTask, historyService); + } + + private void extracted(DelegateTask delegateTask, HistoryService historyService) { + HistoricTaskInstanceQuery historicTaskInstanceQuery = historyService.createHistoricTaskInstanceQuery() + .processInstanceId(delegateTask.getProcessInstanceId()); + List list1 = historicTaskInstanceQuery.list(); + List list2 = new ArrayList<>(); + for (HistoricTaskInstance historicTaskInstance:list1) { + if (historicTaskInstance.getEndTime() == null){ + list2.add(historicTaskInstance); + } + } + if (list2.size()==1 && list2.get(0).getId().equals(delegateTask.getId())){ + delegateTask.setVariable("hzFlag",0); + }else { + delegateTask.setVariable("hzFlag",1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrFront.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrFront.java new file mode 100644 index 00000000..5fed22e7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/FqrFront.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FqrFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"政策入库及评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAfter.java new file mode 100644 index 00000000..4b717ffb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAfter.java @@ -0,0 +1,129 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class IssueAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + //结束时间 + String OVERTIME = object.getString("prcDeadline"); + String createUserName = object.getString("createUserName"); + String createUserId = object.getString("createUserId"); + + String prcName = "ZCRUJPGLC"+ + new SimpleDateFormat("yyyyMMdd").format(new Date()); + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + if(StringUtils.isNotBlank(OVERTIME)){ + one1.setOverTime(OVERTIME); + } + one1.setPrcType("14"); + one1.setPrcName(prcName); + one1.setCreatUserName(createUserName); + one1.setCreatUser(createUserId); + busProcessNameService.saveOrUpdate(one1); + } + + object.put("prcNum",one1.getPrcNum()); + object.put("prcName",prcName); + object.put("prcType","14"); + + //fgllr集合 + List fgllrLists = new ArrayList<>(); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + //循环政策数据 + JSONObject objObject = (JSONObject) taskBreak.get(0); + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + Map map = new HashMap<>(); + for (Object o:arry) { + JSONObject jsonObject = (JSONObject) o; + String fgllr = jsonObject.getString("LLR"); + List fgllrList = Arrays.asList(fgllr.split(",")); + for (String userId:fgllrList) { + JSONArray jsonArray = new JSONArray(); + if (map.get(userId) != null){ + JSONArray itemArr = map.get(userId); + for (Object item:itemArr) { + JSONObject jsonObject1 = (JSONObject) item; + jsonArray.add(jsonObject1); + } + } + jsonArray.add(jsonObject); + map.put(userId,jsonArray); + } + } + for (String userId:map.keySet()) { + object.getJSONArray("taskBreak").getJSONObject(0).put("itemsList",map.get(userId)); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(userId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + //有条款 + fgllrLists.addAll(map.keySet()); + }else{ + //无条款 + //获取政策选择的fo + String fgllr = objObject.getString("LLR"); + List fgllrList = Arrays.asList(fgllr.split(",")); + fgllrLists.addAll(fgllrList); + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 每条政策每个人一条数据 + for(String str:fgllrList){ + JSONArray array = new JSONArray(); + array.add(objObject); + object.put("taskBreak",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + + } + + //设置fgllr + delegateTask.setVariable("fgllrList",fgllrLists); + //设置发起人 + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainAfter.java new file mode 100644 index 00000000..23cd7660 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainAfter.java @@ -0,0 +1,122 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.HistoryService; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.history.HistoricTaskInstanceQuery; + +import java.util.*; + +public class IssueAgainAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + //fgllr集合 + List fgllrLists = new ArrayList<>(); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + + //清掉历史退回数据 + extracted(delegateTask, taskService, taskBreak); + //循环政策数据 + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + Map map = new HashMap<>(); + for (Object o:arry) { + JSONObject jsonObject = (JSONObject) o; + String fgllr = jsonObject.getString("LLR"); + List fgllrList = Arrays.asList(fgllr.split(",")); + for (String userId:fgllrList) { + JSONArray jsonArray = new JSONArray(); + if (map.get(userId) != null){ + JSONArray itemArr = map.get(userId); + for (Object item:itemArr) { + JSONObject jsonObject1 = (JSONObject) item; + jsonArray.add(jsonObject1); + } + } + jsonArray.add(jsonObject); + map.put(userId,jsonArray); + } + } + for (String userId:map.keySet()) { + object.getJSONArray("taskBreak").getJSONObject(0).put("itemsList",map.get(userId)); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(userId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + //有条款 + fgllrLists.addAll(map.keySet()); + }else{ + //无条款 + //获取政策选择的fo + String fgllr = objObject.getString("LLR"); + List fgllrList = Arrays.asList(fgllr.split(",")); + fgllrLists.addAll(fgllrList); + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 每条政策每个人一条数据 + for(String str:fgllrList){ + JSONArray array = new JSONArray(); + array.add(objObject); + object.put("taskBreak",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + } + } + //设置fgllr + delegateTask.setVariable("fgllrList",fgllrLists); + } + private void extracted(DelegateTask delegateTask, TaskService taskService, JSONArray taskBreak) { + JSONObject taskBreakObj = (JSONObject) taskBreak.get(0); + JSONArray arry1 = taskBreakObj.getJSONArray("itemsList"); + JSONArray backJson = (JSONArray) taskService.getVariable(delegateTask.getId(), "backJson"); + JSONObject backJsonObj = (JSONObject) backJson.get(0); + JSONArray arry2 = backJsonObj.getJSONArray("itemsList"); + if (arry1.size() != arry2.size()){ + try { + throw new Exception("有新的回退数据,请刷新"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainFrount.java new file mode 100644 index 00000000..4bf15636 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/IssueAgainFrount.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class IssueAgainFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectAfter.java new file mode 100644 index 00000000..d8f48a39 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectAfter.java @@ -0,0 +1,123 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; + +public class RectAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("taskBreak"); + JSONObject jsonObject = object.getJSONObject("prcForm"); + + // 有更改时间 + JSONArray updateTimeJsonArray = new JSONArray(); + //循环政策数据 + for (Object obj : taskBreak) { + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if (arry != null && arry.size() > 0) { + //有条款 + for (Object obj1 : arry) { + JSONObject objObject1 = (JSONObject) obj1; + //以下节点均需插入BUS_PROCESS_NEW表 数据 + //判断是否延期,两个延期选项有一个延期即延期 + if (isYanQi(object,objObject1)) { + //不延期 + delegateTask.setVariable("zgFlag", 0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(String.valueOf(delegateTask.getVariable("fqr"))); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else { + //延期 + delegateTask.setVariable("zgFlag", 1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(object.getString("createUserId")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + } else { + //无条款 + if (isYanQi(object,objObject)) { + //不延期 + delegateTask.setVariable("zgFlag", 0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(String.valueOf(delegateTask.getVariable("fqr"))); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } else { + if (objObject.getBoolean("checked") && objObject.getString("jspgwcDate") != null && objObject.getString("jspgwcDate") != "") { + objObject.put("jspgwcDate", new Date()); + } + updateTimeJsonArray.add(objObject); + object.put("taskBreak", updateTimeJsonArray); + //延期 + delegateTask.setVariable("zgFlag", 1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(object.getString("createUserId")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + } + } + + + private boolean isYanQi(JSONObject object, JSONObject objObject){ + // 以下节点均需插入BUS_PROCESS_NEW表 数据 +// 判断是否延期,两个延期选项有一个延期即延期 +// shchecked为true是完成;checked为true是整改 + +// 技术评估不需要整改 + boolean flag = false; + if (object.getString("ifIn").equals("1") + || (object.getString("ifIn").equals("0") && ((objObject.getString("jspg").equals("0") && objObject.getBoolean("checked")) || objObject.getString("jspg").equals("1") || objObject.getString("jspg").equals("2")))) { + flag = true; + } +// 不涉及准入审核 +// 涉及准入审核且完成准入审核 +// 未完成且审核完成 + boolean flag1 = false; + if (objObject.getString("isInvolveAccess").equals("0") + || (objObject.getString("isInvolveAccess").equals("1") && (objObject.getString("wczrsh").equals("1") || (objObject.getString("wczrsh").equals("0") && objObject.getBoolean("shchecked"))))) { + flag1 = true; + } + return flag && flag1; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectFrount.java new file mode 100644 index 00000000..737aaf02 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/RectFrount.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class RectFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"政策入库及评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzAfter.java new file mode 100644 index 00000000..29917c70 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzAfter.java @@ -0,0 +1,11 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class hzAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzFrount.java new file mode 100644 index 00000000..87c5de5d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyEvaluation/hzFrount.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.PolicyEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class hzFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"政策入库及评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfrount.java new file mode 100644 index 00000000..5662be34 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfrount.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; +//行政 +public class FoAfrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ +// for(BusProcessNew busProcessNew:list){ +// busProcessNew.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(busProcessNew); +// } + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"行政管理要求评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfter.java new file mode 100644 index 00000000..1699f9e9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/FoAfter.java @@ -0,0 +1,151 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class FoAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + //默认设置通过汇总节点 + delegateTask.setVariable("hzFlag",0); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("tableList"); + //循环政策数据 + JSONArray jsonArray = new JSONArray(); + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + //有条款 + JSONArray jsonArray1 = new JSONArray(); + for(Object obj1:arry){ + JSONObject objObject1 = (JSONObject) obj1; + //判断统一提交的数据中的条款是否和当前任务匹配 + if(objObject1.getString("taskId").equals(delegateTask.getId())){ + //以下节点均需插入BUS_PROCESS_NEW表 数据 + //判断是否退回 + if(object.getString("isBack").equals("1")){ + //退回 + //判断是否还有子流程,如无子流程设置节点流向 + boolean flag = true; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + }else{ + flag = false; + } + if(flag){ + delegateTask.setVariable("hzFlag",1); + delegateTask.setVariable("foFlag",0); + }else{ + //抛出信号 + delegateTask.setVariable("foFlag",2); + } + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 插入数据 执行人为fqr + JSONArray array = new JSONArray(); + array.add(objObject1); + JSONArray array1 = new JSONArray(); + array1.add(array); + object.put("tableList",array1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("14"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + }else{ + //不退回 + //判断是否符合 + delegateTask.setVariable("foFlag",0); + } + if (delegateTask.getVariable("foFlag").toString().equals("0")){ + jsonArray1.add(objObject1); + } + } + } + if (delegateTask.getVariable("foFlag").toString().equals("0")){ + objObject.put("itemsList",jsonArray1); + } + }else{ + //无条款 + //判断统一提交的数据中的条款是否和当前任务匹配 + if(objObject.getString("taskId").equals(delegateTask.getId())){ + ///以下节点均需插入BUS_PROCESS_NEW表 数据 + //判断是否退回 + if(object.getString("isBack").equals("1")){ + //退回 + //判断是否还有子流程,如无子流程设置节点流向 + boolean flag = true; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + }else{ + flag = false; + } + if(flag){ + delegateTask.setVariable("hzFlag",1); + delegateTask.setVariable("foFlag",0); + }else{ + //抛出信号 + delegateTask.setVariable("foFlag",2); + } + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 插入数据 执行人为fqr + JSONArray array = new JSONArray(); + array.add(objObject); + object.put("tableList",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + }else{ + //不退回 + //判断是否符合 + delegateTask.setVariable("foFlag",0); + } + if (delegateTask.getVariable("foFlag").toString().equals("0")) { + jsonArray.add(objObject); + } + } + } + } + if (delegateTask.getVariable("foFlag").toString().equals("0")){ + object.put("tableList",jsonArray); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAfter.java new file mode 100644 index 00000000..6672e06a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAfter.java @@ -0,0 +1,120 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class IssueAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + //结束时间 + String OVERTIME = object.getJSONObject("processForm").getString("prcDeadline"); + String createUserName = object.getJSONObject("processForm").getString("createUserName"); + String createUserId = object.getJSONObject("processForm").getString("createUserId"); + + String prcName = "XZYQPGLC"+ + new SimpleDateFormat("yyyyMMdd").format(new Date()); + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + if(StringUtils.isNotBlank(OVERTIME)){ + one1.setOverTime(OVERTIME); + } + one1.setPrcType("13"); + one1.setPrcName(prcName); + one1.setCreatUserName(createUserName); + one1.setCreatUser(createUserId); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("processForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("processForm").put("prcName",prcName); + object.getJSONObject("processForm").put("prcType","13"); + + //fo集合 + List foList = new ArrayList<>(); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("tableList"); + //循环政策数据 + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + //有条款 + for(Object obj1:arry){ + JSONObject objObject1 = (JSONObject) obj1; + //获取条款选择的fo + String fo = objObject1.getString("foId"); + List folistByItems = Arrays.asList(fo.split(",")); + foList.addAll(folistByItems); + //插入数据库BUS_PROCESS_NEW表 每个条款每个人一条数据 + for(String str:folistByItems){ + JSONArray array = new JSONArray(); + array.add(objObject1); + object.getJSONArray("tableList").getJSONObject(0).put("itemsList",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + } + }else{ + //无条款 + //获取政策选择的fo + String fo = objObject.getString("foId"); + List folistByStand = Arrays.asList(fo.split(",")); + foList.addAll(folistByStand); + //插入数据库BUS_PROCESS_NEW表 每条政策每个人一条数据 + for(String str:folistByStand){ + JSONArray array = new JSONArray(); + array.add(objObject); + object.put("tableList",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + + } + } + + //设置fo + delegateTask.setVariable("foList",foList); + //设置发起人 + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainAfter.java new file mode 100644 index 00000000..dd1ba42d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainAfter.java @@ -0,0 +1,91 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class IssueAgainAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + //fo集合 + List foList = new ArrayList<>(); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("tableList"); + //循环政策数据 + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + //有条款 + for(Object obj1:arry){ + JSONObject objObject1 = (JSONObject) obj1; + //获取条款选择的fo + String fo = objObject1.getString("foId"); + List folistByItems = Arrays.asList(fo.split(",")); + foList.addAll(folistByItems); + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 每个条款每个人一条数据 + for(String str:folistByItems){ + JSONArray array = new JSONArray(); + array.add(objObject1); + object.getJSONArray("tableList").getJSONObject(0).put("itemsList",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + } + }else{ + //无条款 + //获取政策选择的fo + String fo = objObject.getString("foId"); + List folistByStand = Arrays.asList(fo.split(",")); + foList.addAll(folistByStand); + // TODO: 2021/3/17 + //插入数据库BUS_PROCESS_NEW表 每条政策每个人一条数据 + for(String str:folistByStand){ + JSONArray array = new JSONArray(); + array.add(objObject); + object.put("tableList",array); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(str); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + } + } + //设置fo + delegateTask.setVariable("foList",foList); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainFrount.java new file mode 100644 index 00000000..30e523af --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueAgainFrount.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class IssueAgainFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ +// for(BusProcessNew busProcessNew:list){ +// busProcessNew.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(busProcessNew); +// } + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"行政管理要求评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureAfter.java new file mode 100644 index 00000000..799823cb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureAfter.java @@ -0,0 +1,132 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class IssueSureAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + //默认设置通过汇总节点 + delegateTask.setVariable("hzFlag",0); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("tableList"); + //循环政策数据 + JSONArray jsonArray = new JSONArray(); + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + //有条款 + JSONArray jsonArray1 = new JSONArray(); + for(Object obj1:arry){ + JSONObject objObject1 = (JSONObject) obj1; + //判断统一提交的数据中的条款是否和当前任务匹配 + if(objObject1.getString("taskId").equals(delegateTask.getId())){ + //以下节点均需插入BUS_PROCESS_NEW表 数据 + //判断是否退回 + //不退回 + //判断是否符合 + if(objObject1.getString("jspg").equals("1")||objObject1.getString("jspg").equals("2")){ + //符合 + if(objObject1.getString("isInvolveAccess").equals("1")){//判断是否设计准入审核 + //涉及 + if(objObject1.getString("wczrsh").equals("1")){//是否完成 + //完成 直接结束 + delegateTask.setVariable("issueFlag",1); + + }else{ + //未完成 到整改节点 + delegateTask.setVariable("issueFlag",0); + } + }else{ + //不涉及 直接结束 + delegateTask.setVariable("issueFlag",1); + } + }else{ + //不符合 到整改节点 + delegateTask.setVariable("issueFlag",0); + } + } + if (delegateTask.getVariable("issueFlag").toString().equals("0")){ + jsonArray1.add(objObject1); + } + if (delegateTask.getVariable("foFlag").toString().equals("0")){ + objObject.put("itemsList",jsonArray1); + } + } + }else{ + //无条款 + //判断统一提交的数据中的条款是否和当前任务匹配 + if(objObject.getString("taskId").equals(delegateTask.getId())){ + ///以下节点均需插入BUS_PROCESS_NEW表 数据 + //判断是否退回 + //不退回 + //判断是否符合 + if(objObject.getString("jspg").equals("1") || objObject.getString("jspg").equals("2")){ + //符合 + if(objObject.getString("isInvolveAccess").equals("1")){//判断是否设计准入审核 + //涉及 + if(objObject.getString("wczrsh").equals("1")){//是否完成 + //完成 直接结束 + delegateTask.setVariable("issueFlag",1); + + }else{ + //未完成 到整改节点 + delegateTask.setVariable("issueFlag",0); + } + }else{ + //不涉及 直接结束 + delegateTask.setVariable("issueFlag",1); + } + }else{ + //不符合 到整改节点 + delegateTask.setVariable("issueFlag",0); + } + JSONArray array = new JSONArray(); + array.add(objObject); + JSONArray array1 = new JSONArray(); + array1.add(array); + object.put("tableList",array1); + if (delegateTask.getVariable("issueFlag").toString().equals("0")) { + jsonArray.add(objObject); + } + } + } + } + if (delegateTask.getVariable("issueFlag").toString().equals("0")){ + object.put("tableList",jsonArray); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(object.getString("createUserId")); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect)); + busBean.save(busProcessNew); + } + +// throw new ActivitiException(""); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureFrount.java new file mode 100644 index 00000000..d7aeafb6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/IssueSureFrount.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class IssueSureFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ +// for(BusProcessNew busProcessNew:list){ +// busProcessNew.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(busProcessNew); +// } + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"行政管理要求评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectAfter.java new file mode 100644 index 00000000..85cb5950 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectAfter.java @@ -0,0 +1,114 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +public class RectAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + //默认设置通过汇总节点 + delegateTask.setVariable("zgFlag",0); + + boolean flag = true; + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + //获取政策数据 + JSONArray taskBreak = object.getJSONArray("tableList"); + //循环政策数据 + JSONArray jsonArray = new JSONArray(); + for(Object obj:taskBreak){ + JSONObject objObject = (JSONObject) obj; + //获取政策中的条款 + JSONArray arry = objObject.getJSONArray("itemsList"); + if(arry!=null && arry.size()>0){ + for(Object obj1:arry){ + JSONObject objObject1 = (JSONObject) obj1; + //判断统一提交的数据中的条款是否和当前任务匹配 + if(objObject1.getString("taskId").equals(delegateTask.getId())){ + boolean checked = objObject1.getBoolean("checked"); + if(StringUtils.isNotEmpty(objObject1.getString("shchecked"))){ + boolean zrshyjDate = objObject1.getBoolean("shchecked"); + if(checked && zrshyjDate){ + flag = false; + } + }else{ + if(checked){ + flag = false; + } + } + if(!flag){ + delegateTask.setVariable("zgFlag",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else{ + delegateTask.setVariable("zgFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getAssignee()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + } + }else{ + if(objObject.getString("taskId").equals(delegateTask.getId())){ + boolean checked = objObject.getBoolean("checked"); + if(StringUtils.isNotEmpty(objObject.getString("shchecked"))){ + boolean zrshyjDate = objObject.getBoolean("shchecked"); + if(checked && zrshyjDate){ + flag = false; + } + }else{ + if(checked){ + flag = false; + } + } + if(!flag){ + delegateTask.setVariable("zgFlag",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else{ + delegateTask.setVariable("zgFlag",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(delegateTask.getAssignee()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("13"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + } + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectFrount.java new file mode 100644 index 00000000..8e6d7cf9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/RectFrount.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class RectFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ +// for(BusProcessNew busProcessNew:list){ +// busProcessNew.setTaskId(delegateTask.getId()); +// busBean.saveOrUpdate(busProcessNew); +// } + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"行政管理要求评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzAfter.java new file mode 100644 index 00000000..550ae9e9 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzAfter.java @@ -0,0 +1,11 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class hzAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzFrount.java new file mode 100644 index 00000000..982e43a6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PolicyWare/hzFrount.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.PolicyWare; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class hzFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"行政管理要求评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultAfter.java new file mode 100644 index 00000000..31e24a4a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultAfter.java @@ -0,0 +1,91 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mysql.cj.xdevapi.JsonArray; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.Children; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_activiti.dto.ProjectAssessDTO; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ApprovalResultAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busBeanName = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + +// Set set = new HashSet(); +// + JSONArray obj = object.getJSONArray("taskDistribution"); +// JSONArray array = ((JSONObject)obj.get(0)).getJSONArray("children"); + +// for(Object arr:array){ +// Children jsonObject = JSONObject.parseObject(arr.toString(), Children.class); +// List itemsList = jsonObject.getItemsList(); +// if(itemsList.size()>0){ +// //有条款 +// List items = new ArrayList<>(); +// for (int k = 0; k < itemsList.size(); k++) { +// set.add(itemsList.get(k).getVSEId()); +// String userId = lawsUserInfoService.getUserId(items.get(k).getDeptId(), items.get(k).getDREId(), UserRoleEnum.FO.getLable()); +// if(userId != null){ +// set.add(userId); +// } +// } +// }else{ +// set.add(jsonObject.getVSEId()); +// String userId = lawsUserInfoService.getUserId(jsonObject.getDeptId(), jsonObject.getDREId(), UserRoleEnum.FO.getLable()); +// if(userId != null){ +// set.add(userId); +// } +// } +// } + + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("PRC_NUM", ((JSONObject)obj.get(0)).getString("prcNum")); + BusProcessName one = busBeanName.getOne(queryWrapper1); + + List list =(List) delegateTask.getVariable("vseList"); + Set result = new HashSet(list); + for(String user:result){ + PersonMsgEO personMsgEO = new PersonMsgEO(); + personMsgEO.setMsgTitle("流程名称:《"+one.getPrcName()+"》 流程编号: "+one.getPrcNum()+" 已完成项目评估。请到流程中心种流程监控模块下查看流程数据中查看评估结果"); + personMsgEO.setMsgContent("流程名称:《"+one.getPrcName()+"》 流程编号: "+one.getPrcNum()+" 已完成项目评估。请到流程中心种流程监控模块下查看流程数据中查看 评估结果"); + personMsgEO.setUserId(user); + personMsgEO.setMsgType("TEXT"); + lawsUserInfoService.saveNewPersonMsg(personMsgEO); + } + ResponseMessage responseMessage = lawsUserInfoService.sendMail(result, "流程名称:《"+one.getPrcName()+"》 流程编号: "+one.getPrcNum()+" 已完成项目评估。请到流程中心种流程监控模块下查看流程数据中查看 评估结果"); + + List list1 =(List) delegateTask.getVariable("dreList"); + lawsUserInfoService.getFoByDREs(StringUtils.join(list1, ","),"流程名称:《"+one.getPrcName()+"》 流程编号: "+one.getPrcNum()+" 已完成项目评估。请到流程中心种流程监控模块下查看流程数据中查看 评估结果"); + +// throw new ActivitiException(""); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultFrount.java new file mode 100644 index 00000000..aaff57cb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ApprovalResultFrount.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ApprovalResultFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"项目评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ComplianceAssessmentAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ComplianceAssessmentAfter.java new file mode 100644 index 00000000..1e13309b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/ComplianceAssessmentAfter.java @@ -0,0 +1,316 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSONPObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mysql.cj.xdevapi.JsonArray; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.Children; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_activiti.dto.ProjectAssessDTO; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.ibatis.jdbc.Null; +import org.springframework.beans.BeanUtils; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class ComplianceAssessmentAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("flag1",1); + delegateTask.setVariable("flag2",1); + //人员集合 + List deptList = new ArrayList(); + //获取标准列表 + JSONArray stand = object.getJSONArray("standTableList"); + //获取项目列表 + JSONArray project = object.getJSONArray("typeProjectTableList"); + //获取总列表 + JSONArray taskDis = object.getJSONArray("taskDistribution"); + + //流程id 流程名称 结束时间 流程编号 + String deadline = object.getJSONObject("processForm").getString("prcDeadline"); + String describe = object.getString("describe"); + String createUserName = object.getJSONObject("processForm").getString("createUserName"); + String prcName = object.getJSONObject("processForm").getString("prcName"); + +// String prcName = "BZXMPG"+((JSONObject) stand.get(0)).getString("standName")+ +// ((JSONObject)project.get(0)).getString("productName")+ +// new SimpleDateFormat("yyyyMMdd").format(new Date()); + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setPrcName(prcName); + one1.setPrcMes(describe); + one1.setOverTime(deadline); + one1.setPrcType("3"); + one1.setCreatUserName(createUserName); + busProcessNameService.saveOrUpdate(one1); + } + + List vseList = new ArrayList<>(); + + List projectAssessDTOList = new ArrayList<>(); + for(int i=0;i0){ + for(int j=0;j itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + + if(itemsList.size()>0){ + //有条款 + List items = new ArrayList<>(); + for(int k=0;k childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + System.out.println(itemsList.get(k)); + itemsLists.add(itemsList.get(k)); + children.setItemsList(itemsLists); + childrenList.add(children); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + }else{ + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); +// projectAssessDTO = this.copy(jsonObject); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + List childrenList = projectAssessDTO.getChildren(); + for(Children children:childrenList){ + //有条款 + if(children.getItemsList().size()>0){ + List itemsList = children.getItemsList(); + for(ItemsList itemsList1:itemsList){ + if(itemsList1.getVSEId()!=null && !itemsList1.getVSEId().equals("")){ + String[] split = itemsList1.getVSEId().split(","); + ArrayList< String> arrayList = new ArrayList(split.length); + Collections.addAll(arrayList, split); + for(String attay:arrayList){ + deptList.add(attay); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(itemsList1.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(attay); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + vseList.add(attay); + } + }else{ + flagDept = true; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(itemsList1.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + }else{ + if(children.getVSEId()!=null && !children.getVSEId().equals("")){ + String[] split = children.getVSEId().split(","); + ArrayList< String> arrayList = new ArrayList(split.length); + Collections.addAll(arrayList, split); + for(String attay:arrayList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(children.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(attay); + busProcessNew.setFinishFlag("0"); + deptList.add(attay); + busBean.save(busProcessNew); + vseList.add(attay); + } + }else{ + flagDept = true; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(children.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + } + } + + if(delegateTask.getVariable("vseList")!=null){ + List list =(List) delegateTask.getVariable("vseList"); + list.addAll(vseList); + }else{ + delegateTask.setVariable("vseList",vseList); + } + + //第一次下发调取法规接口 +// if(delegateTask.getVariable("toSystem")==null){ +// List projectList = new ArrayList<>(); +// List standList = new ArrayList<>(); +// for(Object obj:project){ +// projectList.add(((Map)obj).get("id").toString()); +// } +// for(Object obj:stand){ +// standList.add(((Map)obj).get("id").toString()); +// } +// lawsUserInfoService.xxxx(standList,projectList); +// delegateTask.setVariable("toSystem",1); +// } + + delegateTask.setVariable("fqrUser",delegateTask.getAssignee()); + delegateTask.setVariable("hzFlag",delegateTask.getAssignee()); + delegateTask.setVariable("deptList",deptList); + + if(flagDept){ + delegateTask.setVariable("flag1",0); + delegateTask.setVariable("flag2",0); + }else{ + delegateTask.setVariable("flag1",0); + delegateTask.setVariable("flag2",1); + } + + } + + private JSONObject creatOrUPdateForClause(String pid, String sid, List userIds, + DelegateTask delegateTask, Object datas,Object object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + JSONObject data = (JSONObject) datas; + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + return null; + }else{ + return data; + } + } + + private void creatOrUPdateForStand(String pid, String sid, List userIds, DelegateTask delegateTask, JSONObject stand + ,Object object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(JSONObject.toJSONString(stand)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + }else{ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(JSONObject.toJSONString(stand)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + + private ProjectAssessDTO copy(ProjectAssessDTO projectAssessDTO){ + ProjectAssessDTO projectAssessDTO1 = new ProjectAssessDTO(); + projectAssessDTO1.setProdectCode(projectAssessDTO.getProdectCode()); + projectAssessDTO1.setCreationUser(projectAssessDTO.getCreationUser()); + projectAssessDTO1.setCreationTime(projectAssessDTO.getCreationTime()); + projectAssessDTO1.setPlanPassTime(projectAssessDTO.getPlanPassTime()); + projectAssessDTO1.setProductBrand(projectAssessDTO.getProductBrand()); + projectAssessDTO1.setFlatform(projectAssessDTO.getFlatform()); + projectAssessDTO1.setProductName(projectAssessDTO.getProductName()); + projectAssessDTO1.setProductSet(projectAssessDTO.getProductSet()); + projectAssessDTO1.setSaleMarket(projectAssessDTO.getSaleMarket()); + projectAssessDTO1.setModifyTime(projectAssessDTO.getModifyTime()); + projectAssessDTO1.setTargetMarket(projectAssessDTO.getTargetMarket()); + projectAssessDTO1.setChildren(projectAssessDTO.getChildren()); + projectAssessDTO1.setId(projectAssessDTO.getId()); + projectAssessDTO1.setProductType(projectAssessDTO.getProductType()); + projectAssessDTO1.setEopTime(projectAssessDTO.getEopTime()); + projectAssessDTO1.setDataType(projectAssessDTO.getDataType()); + projectAssessDTO1.setRelatePerson(projectAssessDTO.getRelatePerson()); + projectAssessDTO1.setSopTime(projectAssessDTO.getSopTime()); + projectAssessDTO1.setActualPassTime(projectAssessDTO.getActualPassTime()); + projectAssessDTO1.setCarModeFileList(projectAssessDTO.getCarModeFileList()); + projectAssessDTO1.setIsDevelop(projectAssessDTO.getIsDevelop()); + projectAssessDTO1.setPointTime(projectAssessDTO.getPointTime()); + projectAssessDTO1.setCarModel(projectAssessDTO.getCarModel()); + projectAssessDTO1.setOpinion(projectAssessDTO.getOpinion()); + projectAssessDTO1.setOpinionContent(projectAssessDTO.getOpinionContent()); + projectAssessDTO1.setVseOpinionContent(projectAssessDTO.getVseOpinionContent()); + projectAssessDTO1.setVseOpinion(projectAssessDTO.getVseOpinion()); + return projectAssessDTO1; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentAfter.java new file mode 100644 index 00000000..942ae79f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentAfter.java @@ -0,0 +1,224 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.Children; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_activiti.dto.ProjectAssessDTO; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.BeanUtils; + +import java.util.*; +import java.util.stream.Collectors; + +public class DistributionDepartmentAfter implements TaskListener{ + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + delegateTask.setVariable("objectJson",object); +// JSONArray clause = object.getJSONArray("");//条款 + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("flag3",1); + delegateTask.setVariable("flag4",1); + //部门集合 + List peopleList = new ArrayList(); + //获取总列表 + JSONArray taskDis = object.getJSONArray("taskDistribution"); + //Dre列表 + Set dre = new HashSet<>(); + + List projectAssessDTOList = new ArrayList<>(); + for(int i=0;i0){ + for(int j=0;j itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + Children children = jsonObject.getChildren().get(j); + if(itemsList.size()>0){ + //有条款 + List items = new ArrayList<>(); + for(int k=0;k childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + Children childrens = new Children(); + BeanUtils.copyProperties(jsonObject.getChildren().get(j), childrens); + itemsLists.add(itemsList.get(k)); + childrens.setItemsList(itemsLists); + childrenList.add(childrens); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + }else{ + if(children.getTaskId().equals(delegateTask.getId())){ + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + } + + List dreList = new ArrayList<>(); + + for (ProjectAssessDTO projectAssessDTO : projectAssessDTOList) { + List childrenList = projectAssessDTO.getChildren(); + for(Children children:childrenList){ + //有条款 + if(children.getItemsList().size()>0){ + List itemsList = children.getItemsList(); + for(ItemsList itemsList1:itemsList){ + if(itemsList1.getDREId()!=null && !itemsList1.getDREId().equals("")){ + String[] split = itemsList1.getDREId().split(","); + ArrayList< String> arrayList = new ArrayList(split.length); + Collections.addAll(arrayList, split); + for(String attay:arrayList){ + peopleList.add(attay); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(itemsList1.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(attay); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + delegateTask.setVariable("person",attay); + dreList.add(attay); + } + if(itemsList1.getXMPGJS()!=null){ + List list = Arrays.asList(itemsList1.getXMPGJS().split(",")); + for(String str:list){ + dre.add(str); + } + } + }else{ + flagDept = true; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(itemsList1.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + }else{ + if(children.getDREId()!=null && !children.getDREId().equals("")){ + String[] split = children.getDREId().split(","); + ArrayList< String> arrayList = new ArrayList(split.length); + Collections.addAll(arrayList, split); + for(String attay:arrayList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(children.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(attay); + busProcessNew.setFinishFlag("0"); + peopleList.add(attay); + busBean.save(busProcessNew); + delegateTask.setVariable("person",attay); + dreList.add(attay); + } + if(children.getXMPGJS()!=null){ + List list = Arrays.asList(children.getXMPGJS().split(",")); + for(String str:list){ + dre.add(str); + } + } + }else{ + flagDept = true; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(children.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTO)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + } + } + + delegateTask.setVariable("things",dreList); + + if(delegateTask.getVariable("dreList")==null){ + if(dre.size()>0){ + List result = new ArrayList<>(dre); + delegateTask.setVariable("dreList",result); + } + }else{ + List list =(List) delegateTask.getVariable("dreList"); + Set result = new HashSet(list); + result.addAll(dre); + List result2 = new ArrayList<>(result); + delegateTask.setVariable("dreList",result2); + } + + if(flagDept){ + delegateTask.setVariable("flag3",0); + delegateTask.setVariable("flag4",0); + }else{ + delegateTask.setVariable("flag3",0); + delegateTask.setVariable("flag4",1); + } + } + + private void creatOrUPdate(String pid, String sid, List userIds, IBusProcessService busBean) { + if (userIds != null && userIds.size()>0) { + for (Object userid : userIds) { + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("PID", pid); + queryWrapper.eq("SID", sid); + queryWrapper.eq("FLAG", 1); + BusProcess one = busBean.getOne(queryWrapper); + if(one!=null){ + one.setUserid((String) userid); + one.setFlag(2); + busBean.saveOrUpdate(one); + } + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentFrount.java new file mode 100644 index 00000000..b956ee0d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionDepartmentFrount.java @@ -0,0 +1,42 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.wrapper.Wrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DistributionDepartmentFrount implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"项目评估流程"); + +// BusProcessNew one1 = busBean.getOne(queryWrapper1); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserAfter.java new file mode 100644 index 00000000..25f090f3 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserAfter.java @@ -0,0 +1,158 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.Children; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_activiti.dto.ProjectAssessDTO; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.springframework.beans.BeanUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public class DistributionUserAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); +// JSONArray clause = object.getJSONArray("");//条款 + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("flag5",1); + delegateTask.setVariable("flag6",1); + //部门集合 + List deptList = new ArrayList(); + //获取标准列表 + JSONArray taskDis = object.getJSONArray("children"); + + + List projectAssessDTOList = new ArrayList<>(); + + //标准列表 + Children jsonObject = JSONObject.parseObject(taskDis.get(0).toString(), Children.class); + //条款列表 + List itemsList = jsonObject.getItemsList(); + if (itemsList.size() > 0) { + //有条款 + List items = new ArrayList<>(); + for (int k = 0; k < itemsList.size(); k++) { + if (itemsList.get(k).getTaskId().equals(delegateTask.getId())) { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + itemsLists.add(itemsList.get(k)); + jsonObject.setItemsList(itemsLists); + childrenList.add(jsonObject); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } else { + if (jsonObject.getTaskId().equals(delegateTask.getId())) { + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + + //有条款 + if (jsonObject.getItemsList().size() > 0) { + List itemsList2 = jsonObject.getItemsList(); + for (ItemsList itemsList1 : itemsList2) { +// String attay = this.findUserId(itemsList1.getDeptId(), itemsList1.getDREId(), UserRoleEnum.FO.getLable()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(itemsList1.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(object)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(delegateTask.getVariable("fqrUser").toString()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); +// delegateTask.setVariable("first", attay); + } + } else { +// String attay = this.findUserId(jsonObject.getDeptId(), jsonObject.getDREId(),UserRoleEnum.FO.getLable()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(jsonObject.getResId()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(object)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(delegateTask.getVariable("fqrUser").toString()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); +// delegateTask.setVariable("first", attay); + } + + if(flagDept){ + delegateTask.setVariable("flag5",0); + delegateTask.setVariable("flag6",0); + }else{ + delegateTask.setVariable("flag5",0); + delegateTask.setVariable("flag6",1); + } + + //查询是否还有未完成任务 + List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricActivityInstanceId().asc().list(); + + boolean flag=true; + for(HistoricActivityInstance historicActivityInstance:list1){ + if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("合规评估")){ + flag = false; + } + } + + if(flag){ + delegateTask.setVariable("hzFlag",0); + }else{ + delegateTask.setVariable("hzFlag",1); + } + + } + + private String findUserId(String orgname,String orgId,String hierarchy) { + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + String userId = lawsUserInfoService.getUserId(orgname, orgId, hierarchy); + if(userId == null){ + throw new ActivitiException("FO不存在"); + } + return userId; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserFrount.java new file mode 100644 index 00000000..19a6f8b6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/DistributionUserFrount.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DistributionUserFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"项目评估流程"); + +// BusProcessNew one1 = busBean.getOne(queryWrapper1); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalAfter.java new file mode 100644 index 00000000..ed70e1bd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalAfter.java @@ -0,0 +1,212 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.*; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.BeanUtils; + +import java.util.*; + +public class FirstApprovalAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + delegateTask.setVariable("objectJson",object); + + //获取标准列表 + JSONArray taskDis = object.getJSONArray("dicTypeList"); + + List projectAssessDTOList = new ArrayList<>(); + //标准列表 + for(int i=0;i0){ + for(int j=0;j itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + Children children = jsonObject.getChildren().get(j); + if(itemsList.size()>0){ + //有条款 + List items = new ArrayList<>(); + for(int k=0;k childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + itemsLists.add(itemsList.get(k)); + children.setItemsList(itemsLists); + childrenList.add(children); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + }else{ + if(children.getTaskId().equals(delegateTask.getId())){ + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + } + + JSONArray notInvolvedList = object.getJSONArray("nonComplianceList"); + Map map = new HashMap(); + + for(Object not:notInvolvedList){ + ProjectFormDTO notInvolved = JSONObject.parseObject(not.toString(), ProjectFormDTO.class); + if(notInvolved.getClauseNum()!=null){ + map.put(notInvolved.getResId(),notInvolved); + }else{ + map.put(notInvolved.getResId(),notInvolved); + } + } + + for(ProjectAssessDTO projectAssessDTO:projectAssessDTOList){ + if (projectAssessDTO.getChildren().get(0).getItemsList() != null && projectAssessDTO.getChildren().get(0).getItemsList().size() > 0) { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResId()); + if (projectAssessDTO1 != null) { + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setApprovalOpinions(projectAssessDTO1.getApprovalOpinions()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setApprovalContent(projectAssessDTO1.getApprovalContent()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionTime(new Date()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinion(projectAssessDTO1.getOpinion()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionContent(projectAssessDTO1.getOpinionContent()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionName(projectAssessDTO1.getOpinionName()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionNode(projectAssessDTO1.getOpinionNode()); + projectAssessDTO.setOpinion(projectAssessDTO1.getOpinion()); + projectAssessDTO.setOpinionTime(new Date()); + projectAssessDTO.setOpinionContent(projectAssessDTO1.getOpinionContent()); + } + } else { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getResId()); + if (projectAssessDTO1 != null) { + projectAssessDTO.getChildren().get(0).setApprovalOpinions(projectAssessDTO1.getApprovalOpinions()); + projectAssessDTO.getChildren().get(0).setApprovalContent(projectAssessDTO1.getApprovalContent()); + projectAssessDTO.setOpinion(projectAssessDTO1.getOpinion()); + projectAssessDTO.getChildren().get(0).setOpinionTime(new Date()); + projectAssessDTO.getChildren().get(0).setOpinion(projectAssessDTO1.getOpinion()); + projectAssessDTO.getChildren().get(0).setOpinionContent(projectAssessDTO1.getOpinionContent()); + projectAssessDTO.getChildren().get(0).setOpinionName(projectAssessDTO1.getOpinionName()); + projectAssessDTO.getChildren().get(0).setOpinionNode(projectAssessDTO1.getOpinionNode()); + projectAssessDTO.setOpinionContent(projectAssessDTO1.getOpinionContent()); + } + } + } + + if(notInvolvedList.size()>0){ + if(projectAssessDTOList.get(0).getOpinion() == null|| projectAssessDTOList.get(0).getOpinion().equals("") || projectAssessDTOList.get(0).getOpinion().equals("0")){ + // //通过 + delegateTask.setVariable("sp1",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTOList.get(0)));//todo + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setUserId(attay);//todo vesuserid + if(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()!=null){ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()); + }else{ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0) + .getItemsList().get(0).getVSEId()); + } + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + if(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()!=null){ + delegateTask.setVariable("second",projectAssessDTOList.get(0).getChildren().get(0).getVSEId()); + }else{ + delegateTask.setVariable("second",projectAssessDTOList.get(0).getChildren().get(0).getItemsList().get(0).getVSEId()); + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + }else{ + //不通过 + delegateTask.setVariable("sp1",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTOList.get(0)));//todo + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setUserId(attay);//todo dreuserId + if(projectAssessDTOList.get(0).getChildren().get(0).getDREId()!=null){ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0).getDREId()); + }else{ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0) + .getItemsList().get(0).getDREId()); + } + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + if(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()!=null){ + delegateTask.setVariable("second",projectAssessDTOList.get(0).getChildren().get(0).getVSEId()); + }else{ + delegateTask.setVariable("second",projectAssessDTOList.get(0).getChildren().get(0).getItemsList().get(0).getVSEId()); + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + } + }else{ + delegateTask.setVariable("sp1",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTOList.get(0)));//todo + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + if(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()!=null){ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()); + }else{ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0) + .getItemsList().get(0).getVSEId()); + } + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + if(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()!=null){ + delegateTask.setVariable("second",projectAssessDTOList.get(0).getChildren().get(0).getVSEId()); + }else{ + delegateTask.setVariable("second",projectAssessDTOList.get(0).getChildren().get(0).getItemsList().get(0).getVSEId()); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalFrount.java new file mode 100644 index 00000000..6e8db38f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/FirstApprovalFrount.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FirstApprovalFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } +// BusProcessNew one1 = busBean.getOne(queryWrapper1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"项目评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalAfter.java new file mode 100644 index 00000000..26c4a17c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalAfter.java @@ -0,0 +1,205 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_activiti.dto.Children; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_activiti.dto.ProjectAssessDTO; +import com.ydw.bat.wkflow.business_activiti.dto.ProjectFormDTO; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.springframework.beans.BeanUtils; + +import java.util.*; + +public class SecondApprovalAfter implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + + delegateTask.setVariable("objectJson",object); + //是否通过 + JSONArray taskDis = object.getJSONArray("dicTypeList"); + + List projectAssessDTOList = new ArrayList<>(); + //标准列表 + for(int i=0;i0){ + for(int j=0;j itemsList = jsonObject.getChildren().get(j).getItemsList(); + //标准层拼接外层数据 + Children children = jsonObject.getChildren().get(j); + if(itemsList.size()>0){ + //有条款 + List items = new ArrayList<>(); + for(int k=0;k childrenList = new ArrayList<>(); + List itemsLists = new ArrayList<>(); + itemsLists.add(itemsList.get(k)); + children.setItemsList(itemsLists); + childrenList.add(children); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + }else{ + if(children.getTaskId().equals(delegateTask.getId())){ + ProjectAssessDTO projectAssessDTO = new ProjectAssessDTO(); + BeanUtils.copyProperties(jsonObject, projectAssessDTO); + List childrenList = new ArrayList<>(); + childrenList.add(jsonObject.getChildren().get(j)); + projectAssessDTO.setChildren(childrenList); + projectAssessDTOList.add(projectAssessDTO); + } + } + } + } + } + + JSONArray accordList = object.getJSONArray("accordList"); + JSONArray nonComplianceList = object.getJSONArray("nonComplianceList"); + JSONArray toBeConfirmedList = object.getJSONArray("toBeConfirmedList"); + Map map = new HashMap(); + for(Object acc:accordList){ + ProjectFormDTO accord = JSONObject.parseObject(acc.toString(), ProjectFormDTO.class); + map.put(accord.getResId(), accord); + } + + for(Object non:nonComplianceList){ + ProjectFormDTO nonCompliance = JSONObject.parseObject(non.toString(), ProjectFormDTO.class); + map.put(nonCompliance.getResId(), nonCompliance); + } + + for(Object tobe:toBeConfirmedList){ + ProjectFormDTO toBeConfirmed = JSONObject.parseObject(tobe.toString(), ProjectFormDTO.class); + map.put(toBeConfirmed.getResId(), toBeConfirmed); + } + + for(ProjectAssessDTO projectAssessDTO:projectAssessDTOList){ + if (projectAssessDTO.getChildren().get(0).getItemsList() != null && projectAssessDTO.getChildren().get(0).getItemsList().size()>0) { + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getItemsList().get(0).getResId()); + if(projectAssessDTO1!= null){ + projectAssessDTO.setVseOpinion(projectAssessDTO1.getVseOpinion()); + projectAssessDTO.setVseOpinionContent(projectAssessDTO1.getVseOpinionContent()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionTime(new Date()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinion(projectAssessDTO1.getVseOpinion()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionContent(projectAssessDTO1.getVseOpinionContent()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionName(projectAssessDTO1.getOpinionName()); + projectAssessDTO.getChildren().get(0).getItemsList().get(0).setOpinionNode(projectAssessDTO1.getOpinionNode()); + } + }else{ + ProjectFormDTO projectAssessDTO1 = map.get(projectAssessDTO.getChildren().get(0).getResId()); + if(projectAssessDTO1!=null){ + projectAssessDTO.setVseOpinion(projectAssessDTO1.getVseOpinion()); + projectAssessDTO.setVseOpinionContent(projectAssessDTO1.getVseOpinionContent()); + projectAssessDTO.getChildren().get(0).setOpinionTime(new Date()); + projectAssessDTO.getChildren().get(0).setOpinion(projectAssessDTO1.getVseOpinion()); + projectAssessDTO.getChildren().get(0).setOpinionContent(projectAssessDTO1.getVseOpinionContent()); + projectAssessDTO.getChildren().get(0).setOpinionName(projectAssessDTO1.getOpinionName()); + projectAssessDTO.getChildren().get(0).setOpinionNode(projectAssessDTO1.getOpinionNode()); + } + } + } + + if(projectAssessDTOList.get(0).getVseOpinion().equals("0")){ + // //通过 + delegateTask.setVariable("sp2",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTOList.get(0)));//todo + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setUserId(attay);//todo vesuserid + if(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()!=null){ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0).getVSEId()); + }else{ + busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0) + .getItemsList().get(0).getVSEId()); + } + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + + //查询是否还有未完成任务 + List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricActivityInstanceId().asc().list(); + + boolean flag=true; + for(HistoricActivityInstance historicActivityInstance:list1){ + if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("二级审批")){ + flag = false; + } + } + + if(flag){ + delegateTask.setVariable("hzFlag",0); + }else{ + delegateTask.setVariable("hzFlag",1); + } + }else{ + //不通过 + delegateTask.setVariable("sp2",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSON.toJSONString(projectAssessDTOList.get(0)));//todo + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); +// busProcessNew.setUserId(attay);//todo dreuserId +// if(projectAssessDTOList.get(0).getChildren().get(0).getDREId()!=null){ +// busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0).getDREId()); +// }else{ +// busProcessNew.setUserId(projectAssessDTOList.get(0).getChildren().get(0) +// .getItemsList().get(0).getDREId()); +// } + busProcessNew.setUserId(delegateTask.getVariable("first").toString()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + } + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalFrount.java new file mode 100644 index 00000000..bb592555 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ProjectEvaluation/SecondApprovalFrount.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.ProjectEvaluation; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class SecondApprovalFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } +// BusProcessNew one1 = busBean.getOne(queryWrapper1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"项目评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppAfter.java new file mode 100644 index 00000000..cd449f36 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppAfter.java @@ -0,0 +1,226 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import com.ydw.bat.wkflow.util.Utils; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.MessageFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 标准采购员审批(后监听) + */ +public class BuyerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray arry = object.getJSONArray("dicTypeList"); + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0) { + JSONObject item = (JSONObject) remarks.get(remarks.size() - 1); + item.put("approvalTime", new Date()); + } + //项目经费 + JSONArray arr1 = new JSONArray(); + //标准费用 + JSONArray arr2 = new JSONArray(); + //有结果 + JSONArray arr3 = new JSONArray(); + for (Object arr : arry) { + Map map = (Map) arr; + ///:有结果;2无结果 + if(!map.get("itemRes").equals("1")){ + //1:项目经费;2:标准费用 + if (map.get("itemCost").equals("1")) { + arr1.add(arr); + } else { + arr2.add(arr); + } + }else { + arr3.add(arr); + } + } + Set managerList1 = new HashSet<>(); +// List managerListCopy = new ArrayList(); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage orgEOByUserId = lawsUserInfoService.getOrgByUserId(delegateTask.getAssignee()); + ResponseMessage userVO = lawsUserInfoService.getById(delegateTask.getVariable("bzcgyUserId").toString()); + //key: 项目经理 + //val: 项目编号对应数据集合 + Map xmjlMap = new HashMap<>(); + // 取产品中其中一个项目经理(集合) + ResponseMessage>> xmbhMap = lawsUserInfoService.queryMap(); + //key: 项目经理 + //val: 项目编号集合 + Map val = Utils.jsonArrGroup(arry,"handler","itemCode"); +// Map val2 = Utils.jsonArrGroup(arr2,"handler","itemCode"); + val.forEach((key, value) -> { + managerList1.add(key); + }); +// for (String xmjl:val.keySet()) { +// JSONArray jsonArray = new JSONArray(); +// for (Object item:arr1) { +// Map map = (Map) item; +// if (val.get(xmjl).size()>0){ +// if (val.get(xmjl).contains(map.get("itemCode"))){ +// jsonArray.add(item); +// } +// } +// } +// if (jsonArray.size()>0){ +// xmjlMap.put(xmjl,jsonArray); +// } +// } +// managerList1 = xmjlMap.keySet(); +// managerListCopy.addAll(managerList1); +// List managerList2 = new ArrayList(); +// val2.forEach((key, value) -> { +// managerList2.add(key); +// }); + // 总监 +// String managerByOrgId2 = lawsUserInfoService.getUserByRoleId(UserRoleEnum.EQSENIORMANAGER.getLable()); +// managerList2.add(managerByOrgId2); + +// for (Object item:arr2) { +// Map map = (Map) item; +// managerList2.add(map.get("handler").toString()); +// } + + + //有可能会存在项目经理和eq总监是一个人 + //取两个集合交集 +// managerListCopy.retainAll(managerList2); + List bossUserIds = new ArrayList<>(); + //更新任务状态 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + String fqUserId = ""; + if(delegateTask.getVariable("fqUserId") != null){ + fqUserId = delegateTask.getVariable("fqUserId").toString(); + }else { + JSONObject mesg = JSONObject.parseObject(one.getMesg()); + fqUserId = mesg.getString("fqUserId"); + } + //遍历企标、入库 + object.put("remarks", remarks); + object.put("fqUserId",fqUserId); + object.put("bzcgyUserId",userVO.getData().getUsid()); + object.put("bzcgyUserName",userVO.getData().getUname()); + if (object.getString("opinion").equals("0")) { + one.setCommitFlag("0"); + if(!val.isEmpty()){ + val.forEach((key, value) -> { + JSONArray jsonArray = new JSONArray(); + jsonArray.addAll(arr3); + jsonArray.addAll(value); + object.put("dicTypeList",jsonArray); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(key); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("9"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + delegateTask.setVariable("bzcgyUserId", userVO.getData().getUsid()); + delegateTask.setVariable("bzcgyFlag", 0); + delegateTask.setVariable("bossUserId", key); + }); + } +// if (managerList1.size()>0){ +// for (String xmjlId : managerList1) { +// JSONArray jsonArray = new JSONArray(); +// //加入对比结果为有的 +// jsonArray.addAll(arr3); +// if (managerListCopy.contains(xmjlId)){ +// //加入标准经费数据 +// jsonArray.addAll(arr2); +// //加入当前项目经理对应的数据 +// jsonArray.addAll(xmjlMap.get(xmjlId)); +// object.put("dicTypeList",jsonArray); +// }else { +// //加入当前项目经理对应的数据 +// jsonArray.addAll(xmjlMap.get(xmjlId)); +// object.put("dicTypeList",jsonArray); +// } +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(xmjlId); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getEventName()); +// busProcessNew.setMsgType("9"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// delegateTask.setVariable("bzcgyFlag", 0); +// delegateTask.setVariable("bossUserId", xmjlId); +// } +// } +// if (arr2.size()>0){ + +// for (String zjId : managerList2) { +// JSONArray jsonArray = new JSONArray(); +// //加入对比结果为有的 +// jsonArray.addAll(arr3); +// //加入标准经费数据 +// jsonArray.addAll(arr2); +// if (managerListCopy.contains(zjId)){ +// //加入当前(eq总监)项目经理对应的数据 +// jsonArray.addAll(xmjlMap.get(zjId)); +// object.put("dicTypeList",jsonArray); +// }else { +// object.put("dicTypeList",jsonArray); +// } +// object.put("remarks", remarks); +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(zjId); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getEventName()); +// busProcessNew.setMsgType("9"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// delegateTask.setVariable("bzcgyFlag", 0); +// delegateTask.setVariable("bossUserId", zjId); +// } +// } + } else { + one.setCommitFlag("1"); + delegateTask.setVariable("bzcgyFlag", 1); + delegateTask.setVariable("bzcgyUserId", userVO.getData().getUsid()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fqUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("9"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + bossUserIds.addAll(managerList1); + delegateTask.setVariable("bossUserIds",bossUserIds); + busBean.saveOrUpdate(one); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppFrount.java new file mode 100644 index 00000000..e52435ce --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/BuyerAppFrount.java @@ -0,0 +1,42 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * 标准采购员审批(前监听) + */ +public class BuyerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准采购流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationAfter.java new file mode 100644 index 00000000..f7f64f83 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationAfter.java @@ -0,0 +1,88 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 发起申请(后监听) + */ +public class InitiateApplicationAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + System.out.println(object.toJSONString()); + String OVERTIME = object.getString("prcDeadline"); + String username = object.getString("prcCreateUserName"); + JSONArray array = object.getJSONArray("dicTypeList"); + String itemRes = ""; + for(Object object1:array){ + if(((Map) object1).get("itemRes").toString().equals("2")){ + itemRes = ((Map) object1).get("standNum").toString(); + break; + } + } + String prcName = itemRes+"-采购申请"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("9"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + List managerList = new ArrayList(); + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage orgEOByUserId = lawsUserInfoService.getOrgByUserId(delegateTask.getAssignee()); + + // 下一节点处理人 +// String managerByOrgId = lawsUserInfoService.getUserId(orgEOByUserId.getData(),delegateTask.getAssignee(), UserRoleEnum.SENIORMANAGER.getLable()); + String managerByOrgId = object.getString("manageId"); + managerList.add(managerByOrgId); + + object.put("remarks",remarks); + object.put("fqUserId",delegateTask.getAssignee()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(managerList.get(0)); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("9"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + //gjjl集合 + delegateTask.setVariable("gjjlUserIds",managerList); + delegateTask.setVariable("bzcgyUserId", object.get("bzcgyUserId")); + delegateTask.setVariable("bzcgyFlag", 0); + delegateTask.setVariable("fqUserId", delegateTask.getAssignee()); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeAfter.java new file mode 100644 index 00000000..5231a54a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeAfter.java @@ -0,0 +1,102 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/8 15:14 + * @Version 1.0 + */ +public class InitiateApplicationChangeAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + + List managerList = new ArrayList(); + JSONArray remarks = object.getJSONArray("remarks"); + if (null != remarks && remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + + String fqUserId = ""; + String bzcgyUserId = ""; + String bzcgyUserName = ""; + JSONObject mesg = JSONObject.parseObject(one.getMesg()); + + if(object.get("bzcgyUserId") != null){ + bzcgyUserId = object.get("bzcgyUserId").toString(); + }else { + bzcgyUserId = mesg.getString("bzcgyUserId"); + } + if(object.get("bzcgyUserName") != null){ + bzcgyUserName = object.get("bzcgyUserName").toString(); + }else { + bzcgyUserName = mesg.getString("bzcgyUserName"); + } +// if(object.get("fqUserId") != null){ +// fqUserId = object.get("fqUserId").toString(); +// }else { +// fqUserId = mesg.getString("fqUserId"); +// } +// bzcgyUserId = (String) delegateTask.getVariable("bzcgyUserId"); + fqUserId =(String) delegateTask.getVariable("fqUserId"); + +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage orgEOByUserId = lawsUserInfoService.getOrgByUserId(delegateTask.getAssignee()); +// String managerByOrgId = lawsUserInfoService.getUserId(orgEOByUserId.getData(),delegateTask.getAssignee(), UserRoleEnum.SENIORMANAGER.getLable()); + String managerByOrgId = object.getString("manageId"); + managerList.add(managerByOrgId); + object.put("fqUserId", fqUserId); + object.put("bzcgyUserId", bzcgyUserId); + object.put("bzcgyUserName",bzcgyUserName); + object.put("remarks",remarks); + for (String gjjl:managerList) { + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(gjjl); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("9"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + //gjjl集合 + delegateTask.setVariable("gjjlUserIds",managerList); + delegateTask.setVariable("bzcgyUserId", bzcgyUserId); + delegateTask.setVariable("bzcgyFlag", 0); + delegateTask.setVariable("fqUserId", fqUserId); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeFrount.java new file mode 100644 index 00000000..c0aa5801 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/InitiateApplicationChangeFrount.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/8 15:14 + * @Version 1.0 + */ +public class InitiateApplicationChangeFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if (list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准采购流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppAfter.java new file mode 100644 index 00000000..d4e14b93 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppAfter.java @@ -0,0 +1,93 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * 高级经理审批(后监听) + */ +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + //更新任务状态 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + String bzcgyUserId = ""; + JSONObject mesg = JSONObject.parseObject(one.getMesg()); + + if(delegateTask.getVariable("bzcgyUserId") != null){ + bzcgyUserId = delegateTask.getVariable("bzcgyUserId").toString(); + }else { + + bzcgyUserId = mesg.getString("bzcgyUserId"); + } + String fqUserId = delegateTask.getVariable("fqUserId").toString(); +// if(delegateTask.getVariable("fqUserId") != null){ +// fqUserId = delegateTask.getVariable("fqUserId").toString(); +// }else { +// fqUserId = mesg.getString("fqUserId"); +// } + + ResponseMessage userVO = lawsUserInfoService.getById(bzcgyUserId); + + //遍历企标、入库 + object.put("remarks",remarks); + object.put("fqUserId",fqUserId); + object.put("bzcgyUserId",userVO.getData().getUsid()); + object.put("bzcgyUserName",userVO.getData().getUname()); + if(object.getString("opinion").equals("0")){ + one.setCommitFlag("0"); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(bzcgyUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("9"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + delegateTask.setVariable("gjjlFlag",0); + }else{ + one.setCommitFlag("1"); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fqUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("9"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + delegateTask.setVariable("gjjlFlag",1); + } + busBean.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppFrount.java new file mode 100644 index 00000000..ab8fd11c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/ManagerAppFrount.java @@ -0,0 +1,42 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * 高级经理审批(前监听) + */ +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准采购流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppAfter.java new file mode 100644 index 00000000..6b5bfa3e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppAfter.java @@ -0,0 +1,89 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +/** + * 项目经理或EQ总监审批(后监听) + */ +public class PMAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage userVO = lawsUserInfoService.getById(delegateTask.getVariable("bzcgyUserId").toString()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray jsonArray = object.getJSONArray("dicTypeList"); + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + //遍历企标、入库 + //更新任务状态 + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + if(object.get("opinion").toString().equals("0")){ + one.setCommitFlag("0"); + delegateTask.setVariable("bossFlag",0); + }else{ + one.setCommitFlag("1"); + //查询是否存在数据 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getVariable("fqUserId").toString()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + + BusProcessNew data = busBean.getOne(queryWrapper1); + if (data != null){ + JSONObject jsonObject = JSONObject.parseObject(data.getMesg()); + JSONArray oldArr = jsonObject.getJSONArray("dicTypeList"); + jsonArray.addAll(oldArr); + JSONArray oldRemarks = jsonObject.getJSONArray("remarks"); + remarks.addAll(oldRemarks); + }else { + data = new BusProcessNew(); + } + HashSet set = new LinkedHashSet(); + for (int i = 0; i < jsonArray.size(); i++) { + set.add(jsonArray.get(i)); + } + jsonArray = JSONArray.parseArray(set.toString()); + object.put("dicTypeList",jsonArray); + object.put("remarks",remarks); + object.put("bzcgyUserId",userVO.getData().getUsid()); + object.put("bzcgyUserName",userVO.getData().getUname()); + delegateTask.setVariable("bossFlag",1); + data.setUserId(delegateTask.getVariable("fqUserId").toString()); + data.setPId(delegateTask.getProcessInstanceId()); + data.setFinishFlag("0"); + data.setTaskInfo(delegateTask.getEventName()); + data.setMsgType("9"); + data.setMesg(object.toJSONString()); + busBean.saveOrUpdate(data); + } + busBean.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppFrouont.java b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppFrouont.java new file mode 100644 index 00000000..5c8b267c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/PurchaseRequest/PMAppFrouont.java @@ -0,0 +1,42 @@ +package com.ydw.bat.wkflow.listener.PurchaseRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * 项目经理或EQ总监审批(前监听) + */ +public class PMAppFrouont implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准采购流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactAfter.java new file mode 100644 index 00000000..d514e70e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactAfter.java @@ -0,0 +1,166 @@ +package com.ydw.bat.wkflow.listener.ReviewStandard; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import sun.tools.tree.Vset; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/24 10:14 + * @Version 1.0 + */ +public class DraftingContactAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("flag",0); + Object code = object.getString("standCode"); + Object cnName = object.getString("standName"); + Object type = object.getString("type"); + if ("0".equals(type)) { + lawsUserInfoService.addOrUpdateStandState(addOrUpdateStandStates(object,0)); + } else if ("1".equals(type)) { + lawsUserInfoService.addOrUpdateStandState(addOrUpdateStandStates(object,1)); + List list = lawsUserInfoService.standList(code.toString(),cnName.toString()).getData(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("prcNum",""); + jsonObject.put("prcType",""); + jsonObject.put("prcName",""); + jsonObject.put("prcDesc",""); + jsonObject.put("prcDeadline",""); + jsonObject.put("standName",cnName); + jsonObject.put("standCode",code); + jsonObject.put("tableData",list); + jsonObject.put("reasonAbolition",""); + jsonObject.put("FO",""); + jsonObject.put("FOName",""); + jsonObject.put("approvalHistory",new ArrayList<>()); + jsonObject.put("createUser",object.getString("userId")); + jsonObject.put("currentUserName",object.getString("userName")); + + BusMes busMes = new BusMes(); + busMes.setPrcType("7"); + busMes.setTaskId(String.valueOf(object.get("taskId"))); + busMes.setpId(String.valueOf(object.get("prcId"))); + busMes.setJson(jsonObject.toJSONString()); + busMes.setUserId(object.getString("userId")); + busMes.setUserName(object.getString("userName")); + autoSaveFirst(busMes); + + } else if ("2".equals(type)) { + lawsUserInfoService.addOrUpdateStandState(addOrUpdateStandStates(object,2)); + List list = lawsUserInfoService.standList(code.toString(),cnName.toString()).getData(); + JSONObject jsonObject = new JSONObject(); + JSONObject prcForm = new JSONObject(); + JSONObject qbzxdForm = new JSONObject(); + prcForm.put("prcNum",""); + prcForm.put("prcType",""); + prcForm.put("prcName",""); + prcForm.put("prcDesc",""); + prcForm.put("prcDeadline",""); + prcForm.put("prcCreateUser",object.getString("userId")); + prcForm.put("prcCreateUserName",object.getString("userName")); + + qbzxdForm.put("type","2"); + qbzxdForm.put("replacedStandNum",list.get(0).getReplacedStandNum()); + qbzxdForm.put("standCode",list.get(0).getStandCode()); + qbzxdForm.put("cnName",list.get(0).getStandEnName()); + qbzxdForm.put("enName",list.get(0).getStandName()); + qbzxdForm.put("planStartTime",""); + qbzxdForm.put("primaryDrafter",""); + qbzxdForm.put("primaryDrafterName",""); + qbzxdForm.put("compilersUser",""); + qbzxdForm.put("compilersUserName",""); + qbzxdForm.put("primaryDrafterDept",""); + qbzxdForm.put("primaryDrafterDeptName",""); + qbzxdForm.put("otherDrafterDept",""); + qbzxdForm.put("otherDrafterDeptName",""); + qbzxdForm.put("standLevel",""); + qbzxdForm.put("putTime",""); + qbzxdForm.put("planSource",""); + qbzxdForm.put("planReasonFile",""); + qbzxdForm.put("planReason",""); + qbzxdForm.put("planImpact",""); + qbzxdForm.put("planImpactFile",""); + qbzxdForm.put("testWork",""); + qbzxdForm.put("testWorkFile",""); + qbzxdForm.put("FORoleId",""); + qbzxdForm.put("FORoleName",""); + qbzxdForm.put("FO",""); + qbzxdForm.put("FOName",""); + qbzxdForm.put("compileUnit",""); + qbzxdForm.put("compileUnitName",""); + qbzxdForm.put("treeRoleIdListAll",new ArrayList<>()); + qbzxdForm.put("draftUser",""); + qbzxdForm.put("draftingUnitName",""); + qbzxdForm.put("draftingUnit",""); + jsonObject.put("prcForm",prcForm); + jsonObject.put("qbzxdForm",qbzxdForm); + String prcName = "QBZXDSQ"; + BusMes busMes = new BusMes(); + busMes.setPrcType("6"); + busMes.setTaskId(String.valueOf(object.get("taskId"))); + busMes.setpId(String.valueOf(object.get("prcId"))); + busMes.setJson(JSON.toJSONString(jsonObject)); + busMes.setUserId(object.getString("userId")); + busMes.setUserName(object.getString("userName")); + autoSaveFirst(busMes); + } + } + + private SarBussionessStandStateEO addOrUpdateStandStates(JSONObject object, Integer reviewResults){ + SarBussionessStandStateEO sarBussionessStandStateEO = new SarBussionessStandStateEO(); + sarBussionessStandStateEO.setId(object.get("id").toString()); + sarBussionessStandStateEO.setStandCode(object.get("standCode").toString()); + sarBussionessStandStateEO.setStandName(object.get("standName").toString()); + sarBussionessStandStateEO.setReviewResults(reviewResults); + return sarBussionessStandStateEO; + } + + public void autoSaveFirst(BusMes busMes) { + IBusProcessNewService iBusProcessNewService = SpringContextUtil.getBean(IBusProcessNewService.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("P_ID",busMes.getpId()); + BusProcessNew one = new BusProcessNew(); + BusProcessNew data = iBusProcessNewService.getOne(wrapper); + if(data != null){ + one = data; + } + if (busMes.getPrcType().equals("7")){ + one.setMsgType("7"); + } + if (busMes.getPrcType().equals("6")){ + one.setMsgType("6"); + } + one.setMesg(busMes.getJson()); + one.setPId(busMes.getpId()); + one.setUserId(busMes.getUserId()); + one.setTaskId(busMes.getTaskId()); + one.setTaskInfo("法规联络人发起复审流程"); + iBusProcessNewService.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactFront.java b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactFront.java new file mode 100644 index 00000000..da64eca6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/DraftingContactFront.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.ReviewStandard; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DraftingContactFront implements TaskListener { + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标复审流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerAfter.java new file mode 100644 index 00000000..9e481efc --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerAfter.java @@ -0,0 +1,184 @@ +package com.ydw.bat.wkflow.listener.ReviewStandard; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.*; + + +public class EngineerAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + System.out.println(delegateTask.getVariable("flag")); + if (delegateTask.getVariable("flag").toString().equals("1")) { + String loginUserId = object.getString("loginUserId"); + String fgllr = object.getString("fgllr"); + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + queryWrapper1.isNull("USER_ID"); + BusProcessNew one = busBean.getOne(queryWrapper1); + if (one != null) { + one.setUserId(loginUserId); + busBean.saveOrUpdate(one); + } + delegateTask.setVariable("fgllr", fgllr); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fgllr); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("19"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + }else { + delegateTask.setVariable("flag",0); + Object code = object.getString("standCode"); + Object cnName = object.getString("standName"); + Object type = object.getString("type"); + if ("0".equals(type)) { + lawsUserInfoService.addOrUpdateStandState(addOrUpdateStandStates(object,0)); + } else if ("1".equals(type)) { + lawsUserInfoService.addOrUpdateStandState(addOrUpdateStandStates(object,1)); + List list = lawsUserInfoService.standList(code.toString(),cnName.toString()).getData(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("prcNum",""); + jsonObject.put("prcType",""); + jsonObject.put("prcName",""); + jsonObject.put("prcDesc",""); + jsonObject.put("prcDeadline",""); + jsonObject.put("standName",cnName); + jsonObject.put("standCode",code); + jsonObject.put("tableData",list); + jsonObject.put("reasonAbolition",""); + jsonObject.put("FO",""); + jsonObject.put("FOName",""); + jsonObject.put("approvalHistory",new ArrayList<>()); + jsonObject.put("createUser",object.getString("userId")); + jsonObject.put("currentUserName",object.getString("userName")); + + BusMes busMes = new BusMes(); + busMes.setPrcType("7"); + busMes.setTaskId(String.valueOf(object.get("taskId"))); + busMes.setpId(String.valueOf(object.get("prcId"))); + busMes.setJson(jsonObject.toJSONString()); + busMes.setUserId(object.getString("userId")); + busMes.setUserName(object.getString("userName")); + autoSaveFirst(busMes); + } else if ("2".equals(type)) { + lawsUserInfoService.addOrUpdateStandState(addOrUpdateStandStates(object,2)); + List list = lawsUserInfoService.standList(code.toString(),cnName.toString()).getData(); + + JSONObject jsonObject = new JSONObject(); + JSONObject prcForm = new JSONObject(); + JSONObject qbzxdForm = new JSONObject(); + prcForm.put("prcNum",""); + prcForm.put("prcType",""); + prcForm.put("prcName",""); + prcForm.put("prcDesc",""); + prcForm.put("prcDeadline",""); + prcForm.put("prcCreateUser",object.getString("userId")); + prcForm.put("prcCreateUserName",object.getString("userName")); + + qbzxdForm.put("type","2"); + qbzxdForm.put("replacedStandNum",list.get(0).getReplacedStandNum()); + qbzxdForm.put("standCode",list.get(0).getStandCode()); + qbzxdForm.put("cnName",list.get(0).getStandEnName()); + qbzxdForm.put("enName",list.get(0).getStandName()); + qbzxdForm.put("planStartTime",""); + qbzxdForm.put("primaryDrafter",""); + qbzxdForm.put("primaryDrafterName",""); + qbzxdForm.put("compilersUser",""); + qbzxdForm.put("compilersUserName",""); + qbzxdForm.put("primaryDrafterDept",""); + qbzxdForm.put("primaryDrafterDeptName",""); + qbzxdForm.put("otherDrafterDept",""); + qbzxdForm.put("otherDrafterDeptName",""); + qbzxdForm.put("standLevel",""); + qbzxdForm.put("putTime",""); + qbzxdForm.put("planSource",""); + qbzxdForm.put("planReasonFile",""); + qbzxdForm.put("planReason",""); + qbzxdForm.put("planImpact",""); + qbzxdForm.put("planImpactFile",""); + qbzxdForm.put("testWork",""); + qbzxdForm.put("testWorkFile",""); + qbzxdForm.put("FORoleId",""); + qbzxdForm.put("FORoleName",""); + qbzxdForm.put("FO",""); + qbzxdForm.put("FOName",""); + qbzxdForm.put("compileUnit",""); + qbzxdForm.put("compileUnitName",""); + qbzxdForm.put("treeRoleIdListAll",new ArrayList<>()); + qbzxdForm.put("draftUser",""); + qbzxdForm.put("draftingUnitName",""); + qbzxdForm.put("draftingUnit",""); + jsonObject.put("prcForm",prcForm); + jsonObject.put("qbzxdForm",qbzxdForm); + String prcName = "QBZXDSQ"; + BusMes busMes = new BusMes(); + busMes.setPrcType("6"); + busMes.setTaskId(String.valueOf(object.get("taskId"))); + busMes.setpId(String.valueOf(object.get("prcId"))); + busMes.setJson(JSON.toJSONString(jsonObject)); + busMes.setUserId(object.getString("userId")); + busMes.setUserName(object.getString("userName")); + autoSaveFirst(busMes); + } + } + } + private SarBussionessStandStateEO addOrUpdateStandStates(JSONObject object, Integer reviewResults){ + SarBussionessStandStateEO sarBussionessStandStateEO = new SarBussionessStandStateEO(); + sarBussionessStandStateEO.setId(object.get("id").toString()); + sarBussionessStandStateEO.setStandCode(object.get("standCode").toString()); + sarBussionessStandStateEO.setStandName(object.get("standName").toString()); + sarBussionessStandStateEO.setReviewResults(reviewResults); + return sarBussionessStandStateEO; + } + + public void autoSaveFirst(BusMes busMes) { + IBusProcessNewService iBusProcessNewService = SpringContextUtil.getBean(IBusProcessNewService.class); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("P_ID",busMes.getpId()); + BusProcessNew one = new BusProcessNew(); + BusProcessNew data = iBusProcessNewService.getOne(wrapper); + if(data != null){ + one = data; + } + if (busMes.getPrcType().equals("7")){ + one.setMsgType("7"); + } + if (busMes.getPrcType().equals("6")){ + one.setMsgType("6"); + } + one.setMesg(busMes.getJson()); + one.setPId(busMes.getpId()); + one.setUserId(busMes.getUserId()); + one.setTaskId(busMes.getTaskId()); + one.setTaskInfo("法规联络人发起复审流程"); + iBusProcessNewService.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerFront.java b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerFront.java new file mode 100644 index 00000000..498a8734 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/ReviewStandard/EngineerFront.java @@ -0,0 +1,53 @@ +package com.ydw.bat.wkflow.listener.ReviewStandard; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; + + +public class EngineerFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper(); + queryWrapper.eq("P_ID", "default"); + BusProcessNew one = busBean.getOne(queryWrapper); + if (one.getUserId() == null) { + delegateTask.setVariable("flag", 1); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgIdNew(UserRoleEnum.ENTERPRISESTANDARDENGINEER.getLable()); + if (managerByOrgId.getData() == null || managerByOrgId.getData().size() == 0) { + throw new ActivitiException("企标工程师不存在"); + } + List qbgcs = new ArrayList<>(); + for (OrgEO orgEO : managerByOrgId.getData()) { + qbgcs.add(orgEO.getUsId()); + } + delegateTask.addCandidateUsers(qbgcs); + delegateTask.setVariable("flag", 1); + } else { + delegateTask.setVariable("flag", 0); + } + one.setPId(delegateTask.getProcessInstanceId()); + one.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one); + + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"企标复审流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppAfter.java new file mode 100644 index 00000000..02f9dca7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppAfter.java @@ -0,0 +1,214 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import com.ydw.bat.wkflow.util.Utils; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.*; + +public class BuyerAppAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray arry = object.getJSONArray("dicTypeList"); + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0) { + JSONObject item = (JSONObject) remarks.get(remarks.size() - 1); + item.put("approvalTime", new Date()); + } + //项目经费 + JSONArray arr1 = new JSONArray(); + //标准费用 + JSONArray arr2 = new JSONArray(); + //有结果 + JSONArray arr3 = new JSONArray(); + for (Object arr : arry) { + Map map = (Map) arr; + ///:有结果;2无结果 + if(!map.get("itemRes").equals("1")){ + //1:项目经费;2:标准费用 + if (map.get("itemCost").equals("1")) { + arr1.add(arr); + } else { + arr2.add(arr); + } + }else { + arr3.add(arr); + } + } + Set managerList1 = new HashSet<>(); +// List managerListCopy = new ArrayList(); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage orgEOByUserId = lawsUserInfoService.getOrgByUserId(delegateTask.getAssignee()); + ResponseMessage userVO = lawsUserInfoService.getById(delegateTask.getVariable("bzcgyUserId").toString()); + + //key: 项目经理 + //val: 项目编号对应数据集合 +// Map xmjlMap = new HashMap<>(); +// ResponseMessage>> xmbhMap = lawsUserInfoService.queryMap(); + //key: 项目经理 + //val: 项目编号集合 +// Map> val = xmbhMap.getData(); + Map val = Utils.jsonArrGroup(arry,"handler","itemCode"); + val.forEach((key, value) -> { + managerList1.add(key); + }); + +// for (String xmjl:val.keySet()) { +// JSONArray jsonArray = new JSONArray(); +// for (Object item:arr1) { +// Map map = (Map) item; +// if (val.get(xmjl).size()>0){ +// if (val.get(xmjl).contains(map.get("itemCode"))){ +// jsonArray.add(item); +// } +// } +// } +// if (jsonArray.size()>0){ +// xmjlMap.put(xmjl,jsonArray); +// } +// } +// managerList1 = xmjlMap.keySet(); +// +// managerListCopy.addAll(managerList1); +// List managerList2 = new ArrayList(); +// String managerByOrgId2 = lawsUserInfoService.getUserByRoleId(UserRoleEnum.EQSENIORMANAGER.getLable()); +// managerList2.add(managerByOrgId2); + //有可能会存在项目经理和eq总监是一个人 + //取两个集合交集 +// managerListCopy.retainAll(managerList2); + List bossUserIds = new ArrayList<>(); + //更新任务状态 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + //遍历企标、入库 + String fqUserId = ""; + if(delegateTask.getVariable("fqUserId") != null){ + fqUserId = delegateTask.getVariable("fqUserId").toString(); + }else { + JSONObject mesg = JSONObject.parseObject(one.getMesg()); + fqUserId = mesg.getString("fqUserId"); + } + //遍历企标、入库 + object.put("fqUserId",fqUserId); + object.put("bzcgyUserId",userVO.getData().getUsid()); + object.put("bzcgyUserName",userVO.getData().getUname()); + object.put("remarks", remarks); + if (object.getString("opinion").equals("0")) { + one.setCommitFlag("0"); + if(!val.isEmpty()){ + val.forEach((key, value) -> { + JSONArray jsonArray = new JSONArray(); + jsonArray.addAll(arr3); + jsonArray.addAll(value); + object.put("dicTypeList",jsonArray); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(key); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("15"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + delegateTask.setVariable("bzcgyUserId", userVO.getData().getUsid()); + delegateTask.setVariable("bzcgyFlag", 0); + delegateTask.setVariable("bossUserId", key); + }); + } + +// if (managerList1.size()>0){ +// for (String xmjlId : managerList1) { +// JSONArray jsonArray = new JSONArray(); +// //加入对比结果为有的 +// jsonArray.addAll(arr3); +// if (managerListCopy.contains(xmjlId)){ +// //加入标准经费数据 +// jsonArray.addAll(arr2); +// //加入当前项目经理对应的数据 +// jsonArray.addAll(xmjlMap.get(xmjlId)); +// object.put("dicTypeList",jsonArray); +// }else { +// //加入当前项目经理对应的数据 +// jsonArray.addAll(xmjlMap.get(xmjlId)); +// object.put("dicTypeList",jsonArray); +// } +// object.put("remarks", remarks); +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(xmjlId); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getEventName()); +// busProcessNew.setMsgType("15"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// delegateTask.setVariable("bzcgyFlag", 0); +// delegateTask.setVariable("bossUserId", xmjlId); +// } +// } +// if (!arr2.isEmpty()){ + +// for (String zjId : managerList2) { +// JSONArray jsonArray = new JSONArray(); +// //加入对比结果为有的 +// jsonArray.addAll(arr3); +// //加入标准经费数据 +// jsonArray.addAll(arr2); +// if (managerListCopy.contains(zjId)){ +// //加入当前(eq总监)项目经理对应的数据 +// jsonArray.addAll(xmjlMap.get(zjId)); +// object.put("dicTypeList",jsonArray); +// }else { +// object.put("dicTypeList",jsonArray); +// } +// object.put("remarks", remarks); +// BusProcessNew busProcessNew = new BusProcessNew(); +// busProcessNew.setUserId(zjId); +// busProcessNew.setPId(delegateTask.getProcessInstanceId()); +// busProcessNew.setFinishFlag("0"); +// busProcessNew.setTaskInfo(delegateTask.getEventName()); +// busProcessNew.setMsgType("15"); +// busProcessNew.setMesg(object.toJSONString()); +// busBean.save(busProcessNew); +// delegateTask.setVariable("bzcgyFlag", 0); +// delegateTask.setVariable("bossUserId", zjId); +// } +// } + } else { + one.setCommitFlag("1"); + delegateTask.setVariable("bzcgyFlag", 1); + delegateTask.setVariable("bzcgyUserId", userVO.getData().getUsid()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fqUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("15"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + } + bossUserIds.addAll(managerList1); + delegateTask.setVariable("bossUserIds",bossUserIds); + busBean.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppFrount.java new file mode 100644 index 00000000..f9c8d5d7 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/BuyerAppFrount.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class BuyerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准翻译申请流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationAfter.java new file mode 100644 index 00000000..fd1e7068 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationAfter.java @@ -0,0 +1,76 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class InitiateApplicationAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + System.out.println(object.toJSONString()); + String OVERTIME = object.getString("prcDeadline"); + String username = object.getString("prcCreateUserName"); + JSONArray array = object.getJSONArray("dicTypeList"); + String prcName = ((JSONObject)array.get(0)).getString("standNum")+"-翻译申请"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("15"); + one1.setPrcName(prcName); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + List managerList = new ArrayList(); + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage orgEOByUserId = lawsUserInfoService.getOrgByUserId(delegateTask.getAssignee()); +// String managerByOrgId = lawsUserInfoService.getUserId(orgEOByUserId.getData(),delegateTask.getAssignee(), UserRoleEnum.SENIORMANAGER.getLable()); + String managerByOrgId = object.getString("manageId"); + managerList.add(managerByOrgId); + + object.put("remarks",remarks); + object.put("fqUserId",delegateTask.getAssignee()); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(managerList.get(0)); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("15"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + //gjjl集合 + delegateTask.setVariable("gjjlUserIds",managerList); + delegateTask.setVariable("bzcgyUserId", object.get("bzcgyUserId")); + delegateTask.setVariable("bzcgyFlag", 0); + delegateTask.setVariable("fqUserId", delegateTask.getAssignee()); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeAfter.java new file mode 100644 index 00000000..1442c971 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeAfter.java @@ -0,0 +1,101 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/8 15:14 + * @Version 1.0 + */ +public class InitiateApplicationChangeAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + + List managerList = new ArrayList(); + JSONArray remarks = object.getJSONArray("remarks"); + if (null != remarks && remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } +// LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); +// ResponseMessage orgEOByUserId = lawsUserInfoService.getOrgByUserId(delegateTask.getAssignee()); +// String managerByOrgId = lawsUserInfoService.getUserId(orgEOByUserId.getData(),delegateTask.getAssignee(), UserRoleEnum.SENIORMANAGER.getLable()); + String fqUserId = ""; + String bzcgyUserId = ""; + String bzcgyUserName = ""; + JSONObject mesg = JSONObject.parseObject(one.getMesg()); + + if(object.get("bzcgyUserId") != null){ + bzcgyUserId = object.get("bzcgyUserId").toString(); + }else { + bzcgyUserId = mesg.getString("bzcgyUserId"); + } + if(object.get("bzcgyUserName") != null){ + bzcgyUserName = object.get("bzcgyUserName").toString(); + }else { + bzcgyUserName = mesg.getString("bzcgyUserName"); + } +// if(object.get("fqUserId") != null){ +// fqUserId = object.get("fqUserId").toString(); +// }else { +// fqUserId = mesg.getString("fqUserId"); +// } + + fqUserId =(String) delegateTask.getVariable("fqUserId"); + + String managerByOrgId = object.getString("manageId"); + managerList.add(managerByOrgId); + object.put("fqUserId", fqUserId); + object.put("bzcgyUserId", bzcgyUserId); + object.put("bzcgyUserName",bzcgyUserName); + object.put("remarks",remarks); + for (String gjjl:managerList) { + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(gjjl); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("15"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + + //gjjl集合 + delegateTask.setVariable("gjjlUserIds",managerList); + delegateTask.setVariable("bzcgyUserId", bzcgyUserId); + delegateTask.setVariable("bzcgyFlag", 0); + delegateTask.setVariable("fqUserId", fqUserId); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeFrount.java new file mode 100644 index 00000000..7dc57f0f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationChangeFrount.java @@ -0,0 +1,43 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +/** + * @Author 刘凌枫羽 + * @Date 2020/12/8 15:14 + * @Version 1.0 + */ +public class InitiateApplicationChangeFrount implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准翻译申请流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationFrount.java new file mode 100644 index 00000000..3db3e653 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/InitiateApplicationFrount.java @@ -0,0 +1,27 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class InitiateApplicationFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准翻译申请流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppAfter.java new file mode 100644 index 00000000..6a3c84f2 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppAfter.java @@ -0,0 +1,90 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; + +public class ManagerAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage userVO = lawsUserInfoService.getById(delegateTask.getVariable("bzcgyUserId").toString()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + //更新任务状态 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper1); + + String bzcgyUserId = ""; + JSONObject mesg = JSONObject.parseObject(one.getMesg()); + + if(delegateTask.getVariable("bzcgyUserId") != null){ + bzcgyUserId = delegateTask.getVariable("bzcgyUserId").toString(); + }else { + + bzcgyUserId = mesg.getString("bzcgyUserId"); + } + String fqUserId = delegateTask.getVariable("fqUserId").toString(); +// if(delegateTask.getVariable("fqUserId") != null){ +// fqUserId = delegateTask.getVariable("fqUserId").toString(); +// }else { +// fqUserId = mesg.getString("fqUserId"); +// } + + //遍历企标、入库 + object.put("remarks",remarks); + object.put("fqUserId",fqUserId); + object.put("bzcgyUserId",userVO.getData().getUsid()); + object.put("bzcgyUserName",userVO.getData().getUname()); + if(object.getString("opinion").equals("0")){ + one.setCommitFlag("0"); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(bzcgyUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("15"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + delegateTask.setVariable("gjjlFlag",0); + }else{ + one.setCommitFlag("1"); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setUserId(fqUserId); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getEventName()); + busProcessNew.setMsgType("15"); + busProcessNew.setMesg(object.toJSONString()); + busBean.save(busProcessNew); + delegateTask.setVariable("gjjlFlag",1); + } + busBean.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppFrount.java new file mode 100644 index 00000000..f3f5e6a5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/ManagerAppFrount.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ManagerAppFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准翻译申请流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppAfter.java new file mode 100644 index 00000000..38483e8a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppAfter.java @@ -0,0 +1,89 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; + +public class PMAppAfter implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ResponseMessage userVO = lawsUserInfoService.getById(delegateTask.getVariable("bzcgyUserId").toString()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + + JSONArray jsonArray = object.getJSONArray("dicTypeList"); + JSONArray remarks = object.getJSONArray("remarks"); + if (remarks.size() > 0){ + JSONObject item = (JSONObject) remarks.get(remarks.size()-1); + item.put("approvalTime",new Date()); + } + //遍历企标、入库 + //更新任务状态 + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("TASK_ID", delegateTask.getId()); + BusProcessNew one = busBean.getOne(queryWrapper2); + if(object.get("opinion").toString().equals("0")){ + one.setCommitFlag("0"); + delegateTask.setVariable("bossFlag",0); + }else{ + one.setCommitFlag("1"); + //查询是否存在数据 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getVariable("fqUserId").toString()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + + BusProcessNew data = busBean.getOne(queryWrapper1); + if (data != null){ + JSONObject jsonObject = JSONObject.parseObject(data.getMesg()); + JSONArray oldArr = jsonObject.getJSONArray("dicTypeList"); + jsonArray.addAll(oldArr); + JSONArray oldRemarks = jsonObject.getJSONArray("remarks"); + remarks.addAll(oldRemarks); + }else { + data = new BusProcessNew(); + } + HashSet set = new LinkedHashSet(); + for (int i = 0; i < jsonArray.size(); i++) { + set.add(jsonArray.get(i)); + } + jsonArray = JSONArray.parseArray(set.toString()); + object.put("dicTypeList",jsonArray); + object.put("remarks",remarks); + object.put("bzcgyUserId",userVO.getData().getUsid()); + object.put("bzcgyUserName",userVO.getData().getUname()); + delegateTask.setVariable("bossFlag",1); + data.setUserId(delegateTask.getVariable("fqUserId").toString()); + data.setPId(delegateTask.getProcessInstanceId()); + data.setFinishFlag("0"); + data.setTaskInfo(delegateTask.getEventName()); + data.setMsgType("15"); + data.setMesg(object.toJSONString()); + busBean.saveOrUpdate(data); + } + busBean.saveOrUpdate(one); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppFrouont.java b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppFrouont.java new file mode 100644 index 00000000..87a98298 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/TranslateRequest/PMAppFrouont.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.listener.TranslateRequest; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class PMAppFrouont implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1=list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准翻译申请流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/UserRoleEnum.java b/src/main/java/com/ydw/bat/wkflow/listener/UserRoleEnum.java new file mode 100644 index 00000000..c265f6df --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/UserRoleEnum.java @@ -0,0 +1,34 @@ +package com.ydw.bat.wkflow.listener; + +public enum UserRoleEnum { + + SENIORMANAGER("SENIORMANAGER","3"),//高级经理 + CONTACTPERSON("CONTACTPERSON","联络人"),//联络人还是用原有接口 + EQSENIORMANAGER("EQSENIORMANAGER","EQ-G-6"),//EQ系统经理 + CHIEFINSPECTOR("CHIEFINSPECTOR","1"),//总监 + ENTERPRISESTANDARDENGINEER("ENTERPRISESTANDARDENGINEER","企业标准管理工程师"),//企标工程师<法规系统>,不存在部门,新接口 + EQCHIEFINSPECTOR("EQCHIEFINSPECTOR","EQ-I-1"),//EQ总监 + VICHIEFINSPECTOR("VICHIEFINSPECTOR","VI-I-1"),//VI总监 + PROJECTMANAGER("SENIORMANAGER","项目经理"),//项目经理,idm系统不存在 + ENTERPRISESTANDARDFILINGEXPERT("ENTERPRISESTANDARDFILINGEXPERT","企标备案专家"),//企标备案专家,手动维护,不存在部门,新接口 + PROJECTCHIEFENGINEER("PROJECTCHIEFENGINEER","PM-I-2"),//项目总工,项目产品库人员信息 + FO("fo","6"), + CGR("CGR","采购人"); + + + + private String value; + private String lable; + + private UserRoleEnum(String value, String lable) { + this.value = value; + this.lable = lable; + } + public String getValue() { + return value; + } + public String getLable() { + return lable; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/WkFlowSendEmail.java b/src/main/java/com/ydw/bat/wkflow/listener/WkFlowSendEmail.java new file mode 100644 index 00000000..53865769 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/WkFlowSendEmail.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import com.ydw.bat.wkflow.util.token.TokenAspect; +import org.activiti.engine.delegate.DelegateTask; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class WkFlowSendEmail { + private static Logger logger = LoggerFactory.getLogger(DelegateTask.class); + + public static void sendEmailTodo(DelegateTask delegateTask, String PrcName) { + /** + * 注意: 这里的 try/catch 用于规避放在 发起流程 的前置监听 中引用 + * 存放在 发起流程 的前置监听 中 会导致查询为空,29行报错 如删除 该 try/catch 需排除所有前置监听 + */ + try { + IBusProcessNameService busProcessNameServiceBean = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID", delegateTask.getProcessInstanceId()); + BusProcessName busProcessName = busProcessNameServiceBean.getOne(queryWrapper2); + String creater = busProcessName.getCreatUserName(); + ResponseMessage userVOResponseMessage = lawsUserInfoService.getById(delegateTask.getAssignee()); + UserVO users = userVOResponseMessage.getData(); + String content = "您好," + busProcessName.getPrcNum() + "-" + busProcessName.getPrcName() + " 有您的待办任务,请登录全球标准法规管理系统 ( http://39.98.140.126:10005/#/login ) 查看详情 ( http://39.98.140.126:10005/#/processCenter?tabsName=ProcessCenter ) 。如有问题,请联系流程发起人[" + creater + "][邮箱地址:" + users.getEmail() + "]\n" + + " ——来自 全球标准法规管理系统"; + lawsUserInfoService.sendEmail(delegateTask.getAssignee(), content, "GSRM——【待办任务】[" + PrcName + "]有您的待办任务"); + }catch (Exception e){ + logger.error(e.getMessage()); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoAfter.java new file mode 100644 index 00000000..866bef05 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoAfter.java @@ -0,0 +1,164 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.entity.OrgEO; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class FoAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("deptFlag",1); + delegateTask.setVariable("deptFlag1",1); + //部门集合 + List foList = new ArrayList(); + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("dicTypeList"); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + +// JSONArray itemsList = taskBreak.getJSONArray("itemsList"); + + boolean flag = true; + for(Object stand:taskBreak){ + JSONArray itemsList = ((JSONObject)stand).getJSONArray("itemsList"); + if(itemsList.size()>0){ + //有条款 + JSONArray array = new JSONArray(); + for(Object item:itemsList){ + Map map = ((Map) item); + if(map.get("taskId").toString().equals(delegateTask.getId())){ + if(map.get("type").toString().equals("2")){ + flag=false; + JSONObject object1 = (JSONObject)stand; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(((Map) item).get("resId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + JSONArray array1 = new JSONArray(); + array1.add(item); + object1.put("itemsList", array1); + busProcessNew.setMesg(JSONObject.toJSONString(object1)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(delegateTask.getAssignee()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setCommitFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + }else{ + JSONObject object1 = (JSONObject)stand; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(((Map) item).get("resId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + JSONArray array1 = new JSONArray(); + array1.add(item); + object1.put("itemsList", array1); + busProcessNew.setMesg(JSONObject.toJSONString(object1)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(delegateTask.getVariable("fqr").toString()); + busProcessNew.setCommitFlag("1"); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + } + }else{ + //没条款 + if(((Map)stand).get("taskId").equals(delegateTask.getId())){ + if(((Map)stand).get("type").toString().equals("2")){ + flag=false; + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(((JSONObject) stand).toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(delegateTask.getAssignee()); + one1.setCommitFlag("1"); + one1.setFinishFlag("0"); + busBean.save(one1); + }else{ + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(((JSONObject) stand).toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(delegateTask.getVariable("fqr").toString()); + one1.setCommitFlag("0"); + one1.setFinishFlag("0"); + busBean.save(one1); + } + } + } + } + if(flag){ + delegateTask.setVariable("flag",1); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + }else{ + delegateTask.setVariable("flag",0); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + } + + //查询是否还有未完成任务 + List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricActivityInstanceId().asc().list(); + + boolean flag2=true; + for(HistoricActivityInstance historicActivityInstance:list1){ + if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("查看页面")){ + flag2 = false; + } + } + + if(flag2){ + delegateTask.setVariable("ck",1); + }else{ + delegateTask.setVariable("ck",0); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveAfter.java new file mode 100644 index 00000000..49142453 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveAfter.java @@ -0,0 +1,87 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class FoApproveAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("deptFlag",1); + delegateTask.setVariable("deptFlag1",1); + //部门集合 + List foList = new ArrayList(); + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("dicTypeList"); + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + +// JSONArray itemsList = taskBreak.getJSONArray("itemsList"); + + for(Object stand:taskBreak){ + JSONArray itemsList = ((JSONObject)stand).getJSONArray("itemsList"); + if(itemsList.size()>0){ + //有条款 + JSONArray array = new JSONArray(); + for(Object item:itemsList){ + Map map = ((Map) item); + if(map.get("taskId").toString().equals(delegateTask.getId())){ + JSONObject object1 = (JSONObject) stand; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(((Map) item).get("resId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + JSONArray array1 = new JSONArray(); + array1.add(item); + object1.put("itemsList", array1); + busProcessNew.setMesg(JSONObject.toJSONString(object1)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId(delegateTask.getAssignee()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + }else{ + //没条款 + if(((Map)stand).get("taskId").equals(delegateTask.getId())){ + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(((JSONObject) stand).toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + one1.setUserId(delegateTask.getAssignee()); + one1.setFinishFlag("0"); + busBean.save(one1); + } + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveFront.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveFront.java new file mode 100644 index 00000000..0e3f81e5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoApproveFront.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoApproveFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoFront.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoFront.java new file mode 100644 index 00000000..281a4ec5 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/FoFront.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAfter.java new file mode 100644 index 00000000..d08adf20 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAfter.java @@ -0,0 +1,173 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class IssuedAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //截止时间 流程描述 创建人 + String OVERTIME = object.getString("prcDeadline"); + String user = object.getString("userId"); + String username = object.getString("username"); + + + String prcName = "ZCFGPG"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("13"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + //部门集合 + List foList = new ArrayList(); + //是否全部选择部门 + boolean flagDept = false; + JSONArray taskBreak = object.getJSONArray("dicTypeList"); + JSONArray taskBreakNew = new JSONArray(); + for(Object stand:taskBreak){ + JSONArray itemsList = ((JSONObject)stand).getJSONArray("itemsList"); + ((JSONObject) stand).put("deadline",OVERTIME); + if(itemsList.size()>0){ + //有条款 +// JSONArray items = new JSONArray(); + List items = new ArrayList<>(); + for(Object item:itemsList){ + Map map = ((Map) item); + if (map.get("foId") == null || map.get("foId").equals("")) { + flagDept = true; + JSONObject jsonObject = this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), (String) map.get("id"), + null, delegateTask, item,(JSONObject)stand); + ItemsList itemsList1 = JSONObject.parseObject(item.toString(), ItemsList.class); + items.add(itemsList1); + } else { + foList.addAll((List)map.get("foId")); + this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), (String) map.get("id"), + (JSONArray) map.get("foId"), delegateTask, item,(JSONObject)stand); + } + } + Object standNew = new Object(); + standNew = stand; + JSONArray array= JSONArray.parseArray(JSON.toJSONString(items)); + ((JSONObject)standNew).put("itemsList",array); + object.put("itemsList",array); + if(items.size()>0){ + taskBreakNew.add(standNew); + } + }else{ + //没条款 + if(((Map) stand).get("foId") == null || ((Map) stand).get("foId").equals("")){ + flagDept = true; + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) ((Map) stand).get("id"), + null, delegateTask, (JSONObject)stand); + taskBreakNew.add(stand); + }else{ + foList.addAll((List) ((Map) stand).get("foId")); + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) ((Map) stand).get("id"), + (JSONArray) ((Map) stand).get("foId"), delegateTask, (JSONObject)stand); + } + } + } + if(taskBreakNew.size()>0){ + JSONObject job = new JSONObject(); + job.put("dicTypeList",taskBreakNew); + job.put("deadline",OVERTIME); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(job.toJSONString()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getAssignee()); + busBean.save(busProcessNew); + } + delegateTask.setVariable("foUserIds",foList); + delegateTask.setVariable("fqr",delegateTask.getAssignee()); + if(flagDept){ + delegateTask.setVariable("pg",0); + delegateTask.setVariable("pg1",0); + }else{ + delegateTask.setVariable("pg",0); + delegateTask.setVariable("pg1",1); + } + delegateTask.setVariable("ck",1); + } + + private JSONObject creatOrUPdateForClause(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, Object datas,JSONObject object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + JSONArray data = new JSONArray(); + data.add(datas); + object.put("itemsList",data); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + return null; + }else{ + return object; + } + } + + private void creatOrUPdateForStand(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, JSONObject stand) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(JSONObject.toJSONString(stand)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainAfter.java new file mode 100644 index 00000000..13b2af7d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainAfter.java @@ -0,0 +1,98 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class IssuedAgainAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //截止时间 流程描述 创建人 + String OVERTIME = object.getString("prcDeadline"); + String user = object.getString("currentUser"); + String username = object.getString("currentUserName"); + + + String prcName = "ZCFGRK"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("14"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + + JSONObject taskBreak = object.getJSONArray("taskBreak").getJSONObject(0); + JSONArray itemList = taskBreak.getJSONArray("itemsList"); + + List foUserIdList = new ArrayList<>(); + if(itemList != null && !itemList.isEmpty()){ + List foInfoList = new ArrayList<>(); + List againInfoList = new ArrayList<>(); + for(Object obj : itemList){ + String foId = ((JSONObject)obj).getString("LLR"); + if(StringUtils.isNotBlank(foId)){ + foUserIdList.add(foId); + foInfoList.clear(); + foInfoList.add(obj); + taskBreak.put("itemsList",foInfoList); + object.put("taskBreak", Arrays.asList(new Object[]{taskBreak})); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{foId}),object.toJSONString()); + }else{//条例没有下发fo,重新下发 + againInfoList.add(obj); + } + } + if(!againInfoList.isEmpty()){//剩余未分配条款交给发起人重新下发 + taskBreak.put("itemsList",againInfoList); + object.put("taskBreak",Arrays.asList(new Object[]{taskBreak})); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{user}),object.toJSONString()); + delegateTask.setVariable("againCreateUser",user); + delegateTask.setVariable("issuedAgainAgain","1"); + }else{//融合网关,不走的分支条件也需要赋值 + delegateTask.setVariable("issuedAgainAgain","-1"); + } + }else{//条例为空,政策当成条例下发 + String foId = taskBreak.getString("LLR"); + if(StringUtils.isNotBlank(foId)){ + foUserIdList.add(foId); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{foId}),object.toJSONString()); + } + } + if(!foUserIdList.isEmpty()){ + delegateTask.setVariable("issuedAgain","2"); + delegateTask.setVariable("foUserIdList",foUserIdList); + }else{ + delegateTask.setVariable("issuedAgain","-2"); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainFront.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainFront.java new file mode 100644 index 00000000..762a17cb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/IssuedAgainFront.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class IssuedAgainFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew one1 = list.get(0); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/ckFrount.java b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/ckFrount.java new file mode 100644 index 00000000..1e0f4d15 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/Zcfgpg/ckFrount.java @@ -0,0 +1,32 @@ +package com.ydw.bat.wkflow.listener.Zcfgpg; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ckFrount implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + for(BusProcessNew busProcessNew:list){ + BusProcessNew one1 = busProcessNew; + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/common/ReturnTaskBackListender.java b/src/main/java/com/ydw/bat/wkflow/listener/common/ReturnTaskBackListender.java new file mode 100644 index 00000000..5ea1aa14 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/common/ReturnTaskBackListender.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.common; + +import org.activiti.engine.RuntimeService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.runtime.Execution; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.ChkUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; + +public class ReturnTaskBackListender implements TaskListener { + + private static final long serialVersionUID = -6054576435306127485L; + + @Override + public void notify(DelegateTask delegateTask) { + // TODO 回退到已做过的任务节点 + if (ChkUtil.isNull(delegateTask.getAssignee())) { + // 获取流程id + String excId = delegateTask.getExecutionId(); + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + // 获取流程 + Execution execution = runtimeService.createExecutionQuery().executionId(excId).singleResult(); + if(ChkUtil.isNull(execution)) { + return ; + } + // 获取节点id + String recourseId = execution.getActivityId(); + + // 查询之前任务记录 + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_PROC_INST_ID", delegateTask.getProcessInstanceId()); + queryWrapper.eq("RESOURCE_ID", recourseId); + Datas datas = datasService.getOne(queryWrapper); + // 设置任务执行人为之前任务的执行人 + delegateTask.setAssignee(datas.getAssigner()); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/common/WorkflowUtil.java b/src/main/java/com/ydw/bat/wkflow/listener/common/WorkflowUtil.java new file mode 100644 index 00000000..041b9e9c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/common/WorkflowUtil.java @@ -0,0 +1,94 @@ +package com.ydw.bat.wkflow.listener.common; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; + +import java.util.ArrayList; +import java.util.List; + +public class WorkflowUtil { + + public static void saveBusProcessNew(DelegateTask delegateTask,List userIdList,String json){ + List result = new ArrayList<>(); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + for(String userId : userIdList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(json); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(userId); + result.add(busProcessNew); + } + busBean.saveBatch(result); + } + + public static void saveBusProcessNewForsub(DelegateTask delegateTask,List userIdList,String json){ + List result = new ArrayList<>(); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + for(String userId : userIdList){ + String subId = userId.split("[|]")[1]; + String userIdNew = userId.split("[|]")[0]; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(json); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(userIdNew); + busProcessNew.setSubId(subId); + result.add(busProcessNew); + } + busBean.saveBatch(result); + } + + /** + * 针对多实例节点审批操作 + * @param delegateTask + * @param userIdList + * @param json + * @param msgType + */ + public static void saveBusProcessNewApprove(DelegateTask delegateTask,List userIdList,String json,String msgType){ + List result = new ArrayList<>(); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + //无论是通过还是驳回,下个节点的数据不进行重复存储 + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + queryWrapper1.eq("MSG_TYPE",msgType); + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + return ; + } + for(String userId : userIdList){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType(msgType); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(json); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(userId); + result.add(busProcessNew); + } + busBean.saveBatch(result); + } + + public static void saveToUpdateNew(DelegateTask delegateTask, IBusProcessNewService busBean, String commitFlag) { + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag(commitFlag); +// one1.setCommitText(array.getString("opinionContent")); + busBean.saveOrUpdate(one1); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/DepartManagerReviewListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/DepartManagerReviewListender.java new file mode 100644 index 00000000..fd6a6258 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/DepartManagerReviewListender.java @@ -0,0 +1,28 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import java.util.List; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import com.ydw.bat.wkflow.business_auth.AuUsrFeignService; +import com.ydw.bat.wkflow.util.SessionTool; +import com.ydw.bat.wkflow.util.SpringContextUtil; + +public class DepartManagerReviewListender implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + // TODO 部门审批获取当前部门负责人 + AuUsrFeignService usrFeignService = SpringContextUtil.getBean(AuUsrFeignService.class); + List usrs = usrFeignService.getDepartManager(SessionTool.getSessionAdminId()).getResult(); + if (usrs.size() == 1) { + delegateTask.setAssignee(usrs.get(0)); + } else { + delegateTask.addCandidateUsers(usrs); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/FinaceReviewListener.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/FinaceReviewListener.java new file mode 100644 index 00000000..43ed2176 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/FinaceReviewListener.java @@ -0,0 +1,27 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import java.util.List; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import com.ydw.bat.wkflow.business_auth.AuUsrFeignService; +import com.ydw.bat.wkflow.util.SpringContextUtil; + +public class FinaceReviewListener implements TaskListener { + + private static final long serialVersionUID = 4840345301127363635L; + + @Override + public void notify(DelegateTask delegateTask) { + // TODO 财务审批获取财务人员 + AuUsrFeignService usrFeignService = SpringContextUtil.getBean(AuUsrFeignService.class); + List usrs = usrFeignService.getFinance().getResult(); + if (usrs.size() == 1) { + delegateTask.setAssignee(usrs.get(0)); + } else { + delegateTask.addCandidateUsers(usrs); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/GeneralManagerReviewListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/GeneralManagerReviewListender.java new file mode 100644 index 00000000..02be6b73 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/GeneralManagerReviewListender.java @@ -0,0 +1,27 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import java.util.List; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import com.ydw.bat.wkflow.business_auth.AuUsrFeignService; +import com.ydw.bat.wkflow.util.SpringContextUtil; + +public class GeneralManagerReviewListender implements TaskListener { + + private static final long serialVersionUID = -7330796978427682293L; + + @Override + public void notify(DelegateTask delegateTask) { + // TODO 总经理审批任务获取总经理 + AuUsrFeignService usrFeignService = SpringContextUtil.getBean(AuUsrFeignService.class); + List usrs = usrFeignService.getGeneralManager().getResult(); + if (usrs.size() == 1) { + delegateTask.setAssignee(usrs.get(0)); + } else { + delegateTask.addCandidateUsers(usrs); + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesAfterListender.java new file mode 100644 index 00000000..6d5386c1 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesAfterListender.java @@ -0,0 +1,14 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class LawsSkillAssessStandIssuesAfterListender implements TaskListener { + + private static final long serialVersionUID = -7330796978427682293L; + + @Override + public void notify(DelegateTask delegateTask) { + //todo 给选定标准赋值 + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesFrontListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesFrontListender.java new file mode 100644 index 00000000..cd90d948 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandIssuesFrontListender.java @@ -0,0 +1,49 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.HistoryService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricVariableInstance; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +//技术储备评估 +public class LawsSkillAssessStandIssuesFrontListender implements TaskListener { + + private static final long serialVersionUID = -7330796978427682293L; + + @Autowired + private HistoryService historyService; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准法规技术储备评估流程"); + + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGAfterListender.java new file mode 100644 index 00000000..1cd8cf5e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGAfterListender.java @@ -0,0 +1,42 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.HistoryService; +import org.activiti.engine.RuntimeService; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.task.Task; + +import java.util.List; + +public class LawsSkillAssessStandJGAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + + //查询是否还有未完成任务 + List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricActivityInstanceId().asc().list(); + + boolean flag=true; + for(HistoricActivityInstance historicActivityInstance:list1){ + if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("发起人汇总")){ + flag = false; + } + } + + if(!flag){ + throw new ActivitiException("还有未提交的任务,暂时无法入库"); + } + + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + List tasksList = taskService.createTaskQuery().processInstanceId(delegateTask.getProcessInstanceId()).active().list(); + if(tasksList.size()==1){ + RuntimeService runtimeService = SpringContextUtil.getBean(RuntimeService.class); + runtimeService.signalEventReceived("hz"); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGFrontListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGFrontListender.java new file mode 100644 index 00000000..69d20d36 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandJGFrontListender.java @@ -0,0 +1,41 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class LawsSkillAssessStandJGFrontListender implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID",delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + for(BusProcessNew busProcessNew:list){ + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准法规技术储备评估流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGAfterListender.java new file mode 100644 index 00000000..7b7c4e48 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGAfterListender.java @@ -0,0 +1,173 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.UserRoleEnum; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.ProcessEngine; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricTaskInstance; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class LawsSkillAssessStandPGAfterListender implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + ProcessEngine processEngine = SpringContextUtil.getBean(ProcessEngine.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("exaStand",1); + delegateTask.setVariable("exaStand1",0); + //部门集合 + List foList = new ArrayList(); + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("dicTypeList"); + + JSONArray itemsList = object.getJSONArray("itemsList"); + + String backFlag = object.getString("backFlag"); + + delegateTask.setVariable("exaStand2",1); + delegateTask.setVariable("exaStand3",1); + + delegateTask.setVariable("hzFlag",1); + + if(backFlag.equals("0")){ + //退回 + boolean flag = true; + int i =(int) delegateTask.getVariable("nrOfActiveInstances"); + if (i==1){ + flag = true; + }else{ + flag = false; + } + + if(flag){ + delegateTask.setVariable("exaStand3",0); + }else{ + delegateTask.setVariable("exaStand2",0); + } + + if(itemsList.size()>0){ + //有条款 + JSONArray items = new JSONArray();//拼接条款 + for(Object item:itemsList){ + Map map = ((Map) item); + if(((Map) item).get("taskId").equals(delegateTask.getId())){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + object.put("backSaveFlag",0); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) delegateTask.getVariable("fqUser")); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + }else{ + //没条款 + //查询fo人员 + if(((Map) object).get("taskId").equals(delegateTask.getId())){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + object.put("backSaveFlag",0); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) delegateTask.getVariable("fqUser")); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("3");//退回 + busBean.saveOrUpdate(one1); + } + }else{ + if(itemsList.size()>0){ + //有条款 + JSONArray array = new JSONArray(); + for(Object item:itemsList){ + Map map = ((Map) item); + JSONObject object1 = object; + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(((Map) item).get("resId").toString()); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + object1.put("itemsList", item); + busProcessNew.setMesg(JSONObject.toJSONString(object1)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + String userId = ((Map) item).get("manageId").toString(); + delegateTask.setVariable("exaAssignee",userId); + busProcessNew.setUserId(userId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + }else{ + //没条款 + BusProcessNew one1 = new BusProcessNew(); + one1.setTaskInfo(delegateTask.getTaskDefinitionKey()); + one1.setMesg(object.toJSONString()); + one1.setPId(delegateTask.getProcessInstanceId()); + String userId = ((Map) object).get("manageId").toString(); + delegateTask.setVariable("exaAssignee",userId); + one1.setUserId(userId); + one1.setFinishFlag("0"); + busBean.save(one1); + } + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("4");//提交 + busBean.saveOrUpdate(one1); + } + } + if(!backFlag.equals("0")){ + if(flagDept){ + delegateTask.setVariable("exaStand",0); + delegateTask.setVariable("exaStand1",1); + }else{ + delegateTask.setVariable("exaStand",0); + delegateTask.setVariable("exaStand1",0); + } + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGFrontListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGFrontListender.java new file mode 100644 index 00000000..b825aba6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandPGFrontListender.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +public class LawsSkillAssessStandPGFrontListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID",delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准法规技术储备评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHAfterListender.java new file mode 100644 index 00000000..fc616793 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHAfterListender.java @@ -0,0 +1,148 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcess; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.HistoryService; +import org.activiti.engine.ProcessEngine; +import org.activiti.engine.TaskService; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.activiti.engine.history.HistoricActivityInstance; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.impl.persistence.entity.HistoricTaskInstanceEntity; +import org.activiti.engine.task.Task; + +import java.util.List; +import java.util.Map; + +public class LawsSkillAssessStandSHAfterListender implements TaskListener{ + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + HistoryService historyService = SpringContextUtil.getBean(HistoryService.class); + TaskService taskService = SpringContextUtil.getBean(TaskService.class); + ProcessEngine processEngine = SpringContextUtil.getBean(ProcessEngine.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + +// JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + JSONArray jsonArray= JSONArray.parseArray(datas.getFormValsJson()); + + for(Object o : jsonArray){ + Map map = (Map) o; + String shType = ""; + String taskId = ""; + if(map.get("itemsList")!=null && ((JSONArray)map.get("itemsList")).size()>0){ + shType = ((JSONObject)((JSONArray)map.get("itemsList")).get(0)).getString("shType"); + taskId = ((JSONObject)((JSONArray)map.get("itemsList")).get(0)).getString("taskId"); + }else{ + shType = map.get("shType").toString(); + taskId = map.get("taskId").toString(); + } +// String shType = object.getString("shType"); +// if(shType == null || shType.equals("")){ +// JSONArray arry = object.getJSONArray("itemsList"); +// shType = ((JSONObject) arry.get(0)).getString("shType"); +// } + + if(taskId.equals(delegateTask.getId())){ + delegateTask.setVariable("shType",1); + + String userid = (String) delegateTask.getVariable("fqUser"); + delegateTask.setVariable("sumAssignee",userid); + //是否审批通过 + if(shType.equals("0")){ + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); + busBean.saveOrUpdate(one1); + } + + //查询是否还有未完成任务 + List list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(delegateTask.getProcessInstanceId()) + .orderByHistoricActivityInstanceId().asc().list(); + + boolean flag=true; + for(HistoricActivityInstance historicActivityInstance:list1){ + if(historicActivityInstance.getEndTime()==null && !historicActivityInstance.getActivityName().equals("审核")){ + flag = false; + } + } + + + + if(flag){ + delegateTask.setVariable("shType",0); + delegateTask.setVariable("hzFlag",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSONObject.toJSONString(o)); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(userid); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + + }else{ + delegateTask.setVariable("shType",1); + delegateTask.setVariable("hzFlag",0); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSONObject.toJSONString(o)); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(userid); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + delegateTask.setVariable("shFlag",0); + }else{ + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); + busBean.saveOrUpdate(one1); + } + + List list=processEngine.getHistoryService() // 历史相关Service + .createHistoricTaskInstanceQuery() // 创建历史任务实例查询 + .processInstanceId(delegateTask.getProcessInstanceId())// 用流程实例id查询 + .executionId(delegateTask.getExecutionId()) + .taskName("技术评估") + .finished() // 查询已经完成的任务 + .list(); + + delegateTask.setVariable("shFlag",1); + delegateTask.setVariable("shType",1); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(JSONObject.toJSONString(o)); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getVariable("dept").toString()); + busProcessNew.setFinishFlag("0"); + busBean.save(busProcessNew); + } + } + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHFrontListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHFrontListender.java new file mode 100644 index 00000000..d783023a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessStandSHFrontListender.java @@ -0,0 +1,44 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; + +public class LawsSkillAssessStandSHFrontListender implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID",delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + delegateTask.setAssignee(busProcessNew.getUserId()); + } + + WkFlowSendEmail.sendEmailTodo(delegateTask,"标准法规技术储备评估流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessSumListender.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessSumListender.java new file mode 100644 index 00000000..734eef15 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/LawsSkillAssessSumListender.java @@ -0,0 +1,18 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class LawsSkillAssessSumListender implements TaskListener { + + private static final long serialVersionUID = -7330796978427682293L; + + @Override + public void notify(DelegateTask delegateTask) { + //查询所有标准是否都已经审核完成 + //1、查询审核通过的标准 2、审核通过标准和最开始下发标准对比3、对比结果一致执行评估汇总 + + + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/purchase/TogeReviewListener.java b/src/main/java/com/ydw/bat/wkflow/listener/purchase/TogeReviewListener.java new file mode 100644 index 00000000..e03cff1b --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/purchase/TogeReviewListener.java @@ -0,0 +1,255 @@ +package com.ydw.bat.wkflow.listener.purchase; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.mysql.cj.xdevapi.JsonArray; +import com.tmsps.fk.common.base.exception.BusinessException; +import com.ydw.bat.wkflow.business_activiti.dto.ItemsList; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.*; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SessionTool; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import javafx.beans.binding.ObjectExpression; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.base.Joiner; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +//公文签发 +public class TogeReviewListener implements TaskListener { + + private static final long serialVersionUID = -1375463595675408879L; + + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JsonUtil.jsonStrToJsonObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + //是否全部选择部门 + boolean flagDept = false; + //默认融合网关全部不走 + delegateTask.setVariable("estStand1",1); + delegateTask.setVariable("estStand",0); + //部门集合 + List foList = new ArrayList(); + //获取分解单信息 + JSONArray taskBreak = object.getJSONArray("dicTypeList"); +// //标准信息 +// JSONObject stand = object.getJSONObject("stand"); + //条款新消息(没有条款size为0) +// JSONArray itemsList = ((JSONObject)taskBreak.get(0)).getJSONArray("itemsList"); + + //流程id 流程名称 结束时间 流程编号 + String PID = object.getString("PID"); + String PNAME = object.getString("processName"); + String OVERTIME = object.getString("deadline"); + String PNUM = object.getString("PNUM"); + String MES = object.getString("ProcessDescription"); + String name = object.getString("username"); + + + LawsUserInfoService lawsUserInfoService = SpringContextUtil.getBean(LawsUserInfoService.class); + String dept = object.getString("dept"); +// ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgId("高级经理", dept); +// delegateTask.setVariable("exaAssignee",managerByOrgId.getData().get(0).getUsId()); + + + + delegateTask.setVariable("PID",PID); + delegateTask.setVariable("processName",PNAME); + delegateTask.setVariable("deadline",OVERTIME); + delegateTask.setVariable("PNUM",PNUM); + delegateTask.setVariable("ProcessDescription",MES); + + String textStatus = ""; + if(StringUtils.isNotEmpty(((JSONObject) taskBreak.get(0)).getString("textStatus"))){ + switch (((JSONObject) taskBreak.get(0)).getString("textStatus")){ + case "FBGBJBD": + textStatus = "发布稿"; + break; + case "ZBJBD": + textStatus = "增补件"; + break; + case "SSG": + textStatus = "送审稿"; + break; + case "BPG": + textStatus = "报批稿"; + break; + case "ZQYJG": + textStatus = "征求意见稿"; + break; + case "CA": + textStatus = "草案"; + break; + } + } + + String prcName = ((JSONObject) taskBreak.get(0)).getString("resName")+"-"+ + textStatus+"技术储备评估"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setPrcName(PNAME); + one1.setPrcMes(MES); + one1.setOverTime(OVERTIME); + one1.setPrcType("2"); + one1.setPrcName(prcName); + one1.setCreatUserName(name); + busProcessNameService.saveOrUpdate(one1); + } + JSONArray taskBreakNew = new JSONArray(); + for(Object stand:taskBreak){ + JSONArray itemsList = ((JSONObject)stand).getJSONArray("itemsList"); + ((JSONObject) stand).put("deadline",OVERTIME); + if(itemsList.size()>0){ + //有条款 +// JSONArray items = new JSONArray(); + List items = new ArrayList<>(); + for(Object item:itemsList){ + Map map = ((Map) item); + if (map.get("foId") == null || map.get("foId").equals("")) { + flagDept = true; + JSONObject jsonObject = this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), (String) map.get("id"), + null, delegateTask, item,(JSONObject)stand); + ItemsList itemsList1 = JSONObject.parseObject(item.toString(), ItemsList.class); + items.add(itemsList1); +// ResponseMessage foId = lawsUserInfoService.getOrgByUserId(((JSONArray) map.get("foId")).get(0).toString()); +// ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgId("高级经理", foId.getData()); +// delegateTask.setVariable("exaAssignee",managerByOrgId.getData().get(0).getUsId()); + + } else { + foList.addAll((List)map.get("foId")); + this.creatOrUPdateForClause(delegateTask.getProcessInstanceId(), (String) map.get("id"), + (JSONArray) map.get("foId"), delegateTask, item,(JSONObject)stand); + } + } + Object standNew = new Object(); + standNew = stand; + JSONArray array= JSONArray.parseArray(JSON.toJSONString(items)); + ((JSONObject)standNew).put("itemsList",array); + object.put("itemsList",array); + if(items.size()>0){ + taskBreakNew.add(standNew); + } + }else{ + //没条款 + if(((Map) stand).get("foId") == null || ((Map) stand).get("foId").equals("")){ + flagDept = true; + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) ((Map) stand).get("id"), + null, delegateTask, (JSONObject)stand); + taskBreakNew.add(stand); + }else{ + foList.addAll((List) ((Map) stand).get("foId")); + this.creatOrUPdateForStand(delegateTask.getProcessInstanceId(), (String) ((Map) stand).get("id"), + (JSONArray) ((Map) stand).get("foId"), delegateTask, (JSONObject)stand); + +// ResponseMessage foId = lawsUserInfoService.getOrgByUserId(((JSONArray)((Map) stand).get("foId")).get(0).toString()); +// ResponseMessage> managerByOrgId = lawsUserInfoService.getManagerByOrgId("高级经理", foId.getData()); +// delegateTask.setVariable("exaAssignee",managerByOrgId.getData().get(0).getUsId()); + } + } + } + if(taskBreakNew.size()>0){ + JSONObject job = new JSONObject(); + job.put("dicTypeList",taskBreakNew); + job.put("deadline",OVERTIME); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setPId(delegateTask.getProcessInstanceId()); + busProcessNew.setMesg(job.toJSONString()); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busProcessNew.setUserId(delegateTask.getAssignee()); + busBean.save(busProcessNew); + } + + delegateTask.setVariable("deptList",foList); + delegateTask.setVariable("fqUser", delegateTask.getAssignee()); + List list = new ArrayList(); + list.add(delegateTask.getAssignee()); + delegateTask.setVariable("fqUserList",list); + delegateTask.setVariable("sumAssignee", delegateTask.getAssignee()); + if(flagDept){ + delegateTask.setVariable("estStand1",0); + delegateTask.setVariable("estStand",1); + delegateTask.setVariable("estStandAg0",0); + delegateTask.setVariable("estStandAg1",0); + }else{ + delegateTask.setVariable("estStand1",0); + delegateTask.setVariable("estStand",0); + delegateTask.setVariable("estStandAg0",0); + delegateTask.setVariable("estStandAg1",1); + } + delegateTask.setVariable("shFlag",1); + } + + + private JSONObject creatOrUPdateForClause(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, Object datas,JSONObject object) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + JSONArray data = new JSONArray(); + data.add(datas); + object.put("itemsList",data); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("clause"); + busProcessNew.setClauseId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(object.toJSONString()); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + return null; + }else{ + return object; + } + } + + private void creatOrUPdateForStand(String pid, String sid, JSONArray userIds, DelegateTask delegateTask, JSONObject stand) { + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + if(userIds!=null){ + for(Object uiserId:userIds){ + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setMsgType("stand"); + busProcessNew.setStandId(sid); + busProcessNew.setPId(pid); + busProcessNew.setMesg(JSONObject.toJSONString(stand)); + busProcessNew.setTaskInfo(delegateTask.getTaskDefinitionKey()); + busProcessNew.setUserId((String) uiserId); + busProcessNew.setFinishFlag("0"); + busProcessNew.setTaskInfo(delegateTask.getName()); + busBean.save(busProcessNew); + } + } + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleAfterListender.java new file mode 100644 index 00000000..2e2817eb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleAfterListender.java @@ -0,0 +1,85 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class AppImpleAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + if(((Map)object1).get("PMOpinionStep9").equals("0")){ + //通过 + ((Map)object1).put("PMOpinionStep9Time",new Date()); + delegateTask.setVariable("lsFlag", 0); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + }else{ + //不通过 + delegateTask.setVariable("lsFlag",1); + ((Map)object1).put("PMOpinionStep9Time",new Date()); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + } + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleFrountListender.java new file mode 100644 index 00000000..0ca50a20 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppImpleFrountListender.java @@ -0,0 +1,38 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class AppImpleFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanAfterListender.java new file mode 100644 index 00000000..3bc4095f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanAfterListender.java @@ -0,0 +1,98 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class AppPlanAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + if(((Map)object1).get("opinion").equals("0")){ + ((Map)object1).put("opinionTime",new Date()); + //通过 + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + if(((Map)object1).get("stepFirTime")!=null && !((Map)object1).get("stepFirTime").equals("已完成") + && !((Map)object1).get("stepFirTime").equals("N/A")){ + delegateTask.setVariable("txFlag",0); + }else if(((Map)object1).get("stepSecTime")!=null && !((Map)object1).get("stepSecTime").equals("已完成") + && !((Map)object1).get("stepSecTime").equals("N/A")){ + delegateTask.setVariable("txFlag",1); + delegateTask.setVariable("sjFlag",0); + }else if(((Map)object1).get("stepThiTime")!=null && !((Map)object1).get("stepThiTime").equals("已完成") + && !((Map)object1).get("stepThiTime").equals("N/A")){ + delegateTask.setVariable("txFlag",1); + delegateTask.setVariable("sjFlag",1); + delegateTask.setVariable("yzFlag",0); + } + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + }else{ + ((Map)object1).put("opinionTime",new Date()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + + //不通过 + delegateTask.setVariable("txFlag",2); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + } + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanFrountListender.java new file mode 100644 index 00000000..eacee1fc --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppPlanFrountListender.java @@ -0,0 +1,37 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class AppPlanFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsAfterListender.java new file mode 100644 index 00000000..bd83472f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsAfterListender.java @@ -0,0 +1,90 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class AppResultsAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + if(((Map)object1).get("PMOpinionStep7").equals("0")){ + ((Map)object1).put("PMOpinionStep7Time",new Date()); + //通过 + if(((Map)object1).get("stepThiTime")!=null && !((Map)object1).get("stepThiTime").equals("已完成") + && !((Map)object1).get("stepThiTime").equals("N/A")){ + delegateTask.setVariable("yzFlag",0); + }else{ + delegateTask.setVariable("yzFlag",1); + } + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + }else{ + ((Map)object1).put("PMOpinionStep7Time",new Date()); + //不通过 + delegateTask.setVariable("yzFlag",2); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + } + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsFrountListender.java new file mode 100644 index 00000000..cd4ef118 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppResultsFrountListender.java @@ -0,0 +1,38 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class AppResultsFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeAfterListender.java new file mode 100644 index 00000000..10e91d62 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeAfterListender.java @@ -0,0 +1,95 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Date; +import java.util.Map; + +public class AppSchemeAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + if(((Map)object1).get("PMOpinion").equals("0")){ + ((Map)object1).put("PMOpinionTime",new Date()); + //通过 + if(((Map)object1).get("stepSecTime")!=null && !((Map)object1).get("stepSecTime").equals("N/A") + && !((Map)object1).get("stepSecTime").equals("已完成")){ + delegateTask.setVariable("sjFlag",0); + }else if(((Map)object1).get("stepThiTime")!=null && !((Map)object1).get("stepThiTime").equals("已完成") + && !((Map)object1).get("stepThiTime").equals("N/A")){ + delegateTask.setVariable("sjFlag",2); + delegateTask.setVariable("yzFlag",0); + }else{ + delegateTask.setVariable("sjFlag",2); + delegateTask.setVariable("yzFlag",1); + } + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("0"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + }else{ + ((Map)object1).put("PMOpinionTime",new Date()); + //不通过 + delegateTask.setVariable("sjFlag",1); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + one1.setCommitFlag("1"); +// one1.setCommitText(map.get("opinionContent").toString()); + busBean.saveOrUpdate(one1); + } + } + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeFrountListender.java new file mode 100644 index 00000000..e2cbdbb0 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/AppSchemeFrountListender.java @@ -0,0 +1,37 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class AppSchemeFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleAfterListender.java new file mode 100644 index 00000000..ac99cd48 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleAfterListender.java @@ -0,0 +1,132 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.ActivitiException; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Map; + +public class ChangeImpleAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + delegateTask.setVariable("ggFlag",0); + +// boolean ggFlag = prcForm.getBoolean("checked"); +// boolean ggFlag = ((JSONObject)tableData.get(0)).getBoolean("checked"); + +// if(!ggFlag){ +// //有延期时间 +// delegateTask.setVariable("ggFlag",1); +// for(Object object1:tableData){ +// if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ +// JSONObject prcNameNew = new JSONObject(); +// prcNameNew.put("prcForm",object.getJSONObject("prcForm")); +// JSONArray array = new JSONArray(); +// array.add(object1); +// prcNameNew.put("tableData",array); +// this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); +// } +// } +// QueryWrapper queryWrapper1 = new QueryWrapper(); +// queryWrapper1.eq("TASK_ID",delegateTask.getId()); +// BusProcessNew one1 = busBean.getOne(queryWrapper1); +// if(one1!=null){ +// if(((JSONObject)tableData.get(0)).getString("thrRemark")!=null && +// !((JSONObject)tableData.get(0)).getString("thrRemark").toString().equals("")){ +// one1.setCommitText(((JSONObject)tableData.get(0)).getString("thrRemark").toString()); +// busBean.saveOrUpdate(one1); +// } +// } +// }else{ +// //没有延期时间 +// delegateTask.setVariable("ggFlag",0); +// for(Object object1:tableData){ +// if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ +// JSONObject prcNameNew = new JSONObject(); +// prcNameNew.put("prcForm",object.getJSONObject("prcForm")); +// JSONArray array = new JSONArray(); +// array.add(object1); +// prcNameNew.put("tableData",array); +// this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("frUserId"),prcNameNew.toString()); +// } +// } +// } + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + boolean ggFlag = ((JSONObject) object1).getBoolean("checked"); + if(!ggFlag){ + //有延期时间 + delegateTask.setVariable("ggFlag",1); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("dreUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + if(((JSONObject)tableData.get(0)).getString("thrRemark")!=null && + !((JSONObject)tableData.get(0)).getString("thrRemark").toString().equals("")){ + one1.setCommitText(((JSONObject)tableData.get(0)).getString("thrRemark").toString()); + busBean.saveOrUpdate(one1); + } + } + }else{ + //没有延期时间 + delegateTask.setVariable("ggFlag",0); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("frUserId"),prcNameNew.toString()); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("TASK_ID",delegateTask.getId()); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + if(one1!=null){ + if(((JSONObject)tableData.get(0)).getString("thrRemark")!=null && + !((JSONObject)tableData.get(0)).getString("thrRemark").toString().equals("")){ + one1.setCommitText(((JSONObject)tableData.get(0)).getString("thrRemark").toString()); + busBean.saveOrUpdate(one1); + } + } + } + + } + } + + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleFrountListender.java new file mode 100644 index 00000000..5fa0e763 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/ChangeImpleFrountListender.java @@ -0,0 +1,37 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class ChangeImpleFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeAfterListender.java new file mode 100644 index 00000000..97f9999a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeAfterListender.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Map; + +public class DesignSchemeAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("frUserId"),prcNameNew.toString()); + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeFrountListender.java new file mode 100644 index 00000000..d08935cb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/DesignSchemeFrountListender.java @@ -0,0 +1,37 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class DesignSchemeFrountListender implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanAfterListender.java new file mode 100644 index 00000000..7f12f56e --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanAfterListender.java @@ -0,0 +1,56 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Map; + +public class FillPlanAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("frUserId"),prcNameNew.toString()); + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanFrountListender.java new file mode 100644 index 00000000..327d95fe --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/FillPlanFrountListender.java @@ -0,0 +1,39 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FillPlanFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID",delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list.size()>0){ + BusProcessNew busProcessNew = list.get(0); + busProcessNew.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(busProcessNew); + } + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/IssueAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/IssueAfterListender.java new file mode 100644 index 00000000..c98be4b3 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/IssueAfterListender.java @@ -0,0 +1,105 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class IssueAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //具体数据 + JSONArray tableData = object.getJSONArray("tableData"); + String username =object.getJSONObject("prcForm").getString("createUserName"); + String userId =object.getJSONObject("prcForm").getString("createUserId"); + String overTime =object.getJSONObject("prcForm").getString("prcDeadline"); + String standName = object.getJSONObject("prcForm").getString("standName"); + String proName = object.getJSONObject("prcForm").getString("proName"); + + String prcName = standName+"("+proName+")"+"未符合项跟踪" ; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setPrcName(prcName); + one1.setOverTime(overTime); + one1.setPrcType("5"); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + object.getJSONObject("prcForm").put("prcNum",one1.getPrcNum()); + object.getJSONObject("prcForm").put("prcName",prcName); + object.getJSONObject("prcForm").put("prcType","5"); + List dreUserId = new ArrayList<>(); + + for(Object object1:tableData){ + String dre = (String) ((Map)object1).get("responseEngin"); + if(dre.indexOf(",")>-1){ + //多个dre + String[] split = dre.split(","); + for(String dreId:split){ + dreUserId.add(dreId); + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + this.inster(delegateTask.getProcessInstanceId(),dreId,prcNameNew.toString()); + } + }else{ + dreUserId.add(dre); + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + this.inster(delegateTask.getProcessInstanceId(),dre,prcNameNew.toString()); + } + } + + delegateTask.setVariable("dreUserIds",dreUserId); + delegateTask.setVariable("frUserId",userId); + delegateTask.setVariable("txFlag",4); + delegateTask.setVariable("sjFlag",4); + delegateTask.setVariable("yzFlag",4); + delegateTask.setVariable("lsFlag",4); + + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsAfterListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsAfterListender.java new file mode 100644 index 00000000..952d798c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsAfterListender.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.Map; + +public class VerResultsAfterListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONArray tableData = object.getJSONArray("tableData"); + JSONObject prcForm = object.getJSONObject("prcForm"); + + for(Object object1:tableData){ + if((((Map)object1).get("taskId").equals(delegateTask.getId()))){ + JSONObject prcNameNew = new JSONObject(); + prcNameNew.put("prcForm",object.getJSONObject("prcForm")); + JSONArray array = new JSONArray(); + array.add(object1); + prcNameNew.put("tableData",array); + prcNameNew.put("selectedId",object.getString("selectedId")); + this.inster(delegateTask.getProcessInstanceId(), (String) delegateTask.getVariable("frUserId"),prcNameNew.toString()); + } + } + } + + private void inster(String pId,String dre,String json){ + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + BusProcessNew busProcessNew = new BusProcessNew(); + busProcessNew.setPId(pId); + busProcessNew.setMesg(json); + busProcessNew.setUserId(dre); + busBean.save(busProcessNew); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsFrountListender.java b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsFrountListender.java new file mode 100644 index 00000000..e59ae751 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/unqualified/VerResultsFrountListender.java @@ -0,0 +1,38 @@ +package com.ydw.bat.wkflow.listener.unqualified; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.sun.javafx.tk.Toolkit; +import com.ydw.bat.wkflow.business_auth.LawsUserInfoService; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.entity.ResponseMessage; +import com.ydw.bat.wkflow.business_main.datas.entity.UserVO; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.WkFlowSendEmail; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class VerResultsFrountListender implements TaskListener{ + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + + + WkFlowSendEmail.sendEmailTodo(delegateTask,"未符合项跟踪流程"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoAfter.java new file mode 100644 index 00000000..c7621b2a --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoAfter.java @@ -0,0 +1,11 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +public class FoAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveAfter.java new file mode 100644 index 00000000..65dc57ef --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveAfter.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.List; + +public class FoApproveAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONObject taskBreak = object.getJSONArray("taskBreak").getJSONObject(0); + + //其他审核人审核节点执行人集合 + List userIdList = new ArrayList(); + + String foApprove = object.get("currentUser") == null ? "" : object.get("currentUser").toString(); + userIdList.add(foApprove); + delegateTask.setVariable("approveFoUserId",foApprove); + + if(userIdList != null && !userIdList.isEmpty()){ + WorkflowUtil.saveBusProcessNew(delegateTask,userIdList,object.toJSONString()); + } + + //默认通过,流程结束 + String spFlag = "1"; + JSONArray itemList = taskBreak.getJSONArray("itemsList"); + if(itemList != null && !itemList.isEmpty()){ + spFlag = ((JSONObject)itemList.get(0)).getString("sfgb"); + }else{ + spFlag = taskBreak.get("sfgb") == null ? "" : taskBreak.get("sfgb").toString(); + } + delegateTask.setVariable("foFlag",spFlag); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveFront.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveFront.java new file mode 100644 index 00000000..38ebeb9d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoApproveFront.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoApproveFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + BusProcessNew bus = list.get(0); + bus.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(bus); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoFront.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoFront.java new file mode 100644 index 00000000..90f5dd16 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/FoFront.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class FoFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + BusProcessNew bus = list.get(0); + bus.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(bus); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAfter.java new file mode 100644 index 00000000..53e12927 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAfter.java @@ -0,0 +1,116 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mysql.cj.xdevapi.JsonArray; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class IssuedAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //截止时间 流程描述 创建人 + String OVERTIME = object.getString("prcDeadline"); + String user = object.getString("currentUser"); + String username = object.getString("currentUserName"); + + + String prcName = "ZCFGRK"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("14"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + + JSONObject taskBreak = object.getJSONArray("taskBreak").getJSONObject(0); + JSONArray itemList = taskBreak.getJSONArray("itemsList"); + + List foUserIdList = new ArrayList<>(); + if(itemList != null && !itemList.isEmpty()){ + List foInfoList = new ArrayList<>(); + List againInfoList = new ArrayList<>(); + for(Object obj : itemList){ + String foId = ((JSONObject)obj).getString("LLR"); + if(StringUtils.isNotBlank(foId)){ + String[] foIdArr = foId.split(","); + for(String foIdTemp : foIdArr){ + foUserIdList.add(foIdTemp); + foInfoList.clear(); + foInfoList.add(obj); + taskBreak.put("itemsList",foInfoList); + object.put("taskBreak",Arrays.asList(new Object[]{taskBreak})); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{foIdTemp}),object.toJSONString()); + } + + }else{//条例没有下发fo,重新下发 + againInfoList.add(obj); + } + } + if(!againInfoList.isEmpty()){//剩余未分配条款交给发起人重新下发 + taskBreak.put("itemsList",againInfoList); + object.put("taskBreak",Arrays.asList(new Object[]{taskBreak})); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{user}),object.toJSONString()); + delegateTask.setVariable("againCreateUser",user); + delegateTask.setVariable("issuedAgain","1"); + }else{ + delegateTask.setVariable("issuedAgain","-1"); + } + }else{//条例为空,政策当成条例下发 + delegateTask.setVariable("againCreateUser",user); + String foId = taskBreak.getString("LLR"); + if(StringUtils.isNotBlank(foId)){ + String[] foIdArr = foId.split(","); + for(String foIdTemp : foIdArr){ + delegateTask.setVariable("issuedAgain","-1"); + foUserIdList.add(foIdTemp); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{foIdTemp}),object.toJSONString()); + } + + }else{ + delegateTask.setVariable("issuedAgain","1"); + delegateTask.setVariable("againCreateUser",user); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{user}),object.toJSONString()); + } + } + if(!foUserIdList.isEmpty()){ + delegateTask.setVariable("issued","2"); + delegateTask.setVariable("foUserIdList",foUserIdList); + }else{ + delegateTask.setVariable("issued","-2"); + } + + + + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainAfter.java new file mode 100644 index 00000000..821b92a6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainAfter.java @@ -0,0 +1,98 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessName; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class IssuedAgainAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + //截止时间 流程描述 创建人 + String OVERTIME = object.getString("prcDeadline"); + String user = object.getString("currentUser"); + String username = object.getString("currentUserName"); + + + String prcName = "ZCFGRK"; + QueryWrapper queryWrapper2 = new QueryWrapper(); + queryWrapper2.eq("PRC_ID",delegateTask.getProcessInstanceId()); + BusProcessName one1 = busProcessNameService.getOne(queryWrapper2); + if(one1!=null){ + one1.setOverTime(OVERTIME); + one1.setPrcType("14"); + one1.setPrcName(prcName); + one1.setCreatUser(user); + one1.setCreatUserName(username); + busProcessNameService.saveOrUpdate(one1); + } + + + JSONObject taskBreak = object.getJSONArray("taskBreak").getJSONObject(0); + JSONArray itemList = taskBreak.getJSONArray("itemsList"); + + List foUserIdList = new ArrayList<>(); + if(itemList != null && !itemList.isEmpty()){ + List foInfoList = new ArrayList<>(); + List againInfoList = new ArrayList<>(); + for(Object obj : itemList){ + String foId = ((JSONObject)obj).getString("LLR"); + if(StringUtils.isNotBlank(foId)){ + foUserIdList.add(foId); + foInfoList.clear(); + foInfoList.add(obj); + taskBreak.put("itemsList",foInfoList); + object.put("taskBreak", Arrays.asList(new Object[]{taskBreak})); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{foId}),object.toJSONString()); + }else{//条例没有下发fo,重新下发 + againInfoList.add(obj); + } + } + if(!againInfoList.isEmpty()){//剩余未分配条款交给发起人重新下发 + taskBreak.put("itemsList",againInfoList); + object.put("taskBreak",Arrays.asList(new Object[]{taskBreak})); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{user}),object.toJSONString()); + delegateTask.setVariable("againCreateUser",user); + delegateTask.setVariable("issuedAgainAgain","1"); + }else{//融合网关,不走的分支条件也需要赋值 + delegateTask.setVariable("issuedAgainAgain","-1"); + } + }else{//条例为空,政策当成条例下发 + String foId = taskBreak.getString("LLR"); + if(StringUtils.isNotBlank(foId)){ + foUserIdList.add(foId); + WorkflowUtil.saveBusProcessNew(delegateTask,Arrays.asList(new String[]{foId}),object.toJSONString()); + } + } + if(!foUserIdList.isEmpty()){ + delegateTask.setVariable("issuedAgain","2"); + delegateTask.setVariable("foUserIdList",foUserIdList); + }else{ + delegateTask.setVariable("issuedAgain","-2"); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainFront.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainFront.java new file mode 100644 index 00000000..b516c68c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/IssuedAgainFront.java @@ -0,0 +1,28 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class IssuedAgainFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + BusProcessNew one1 = busBean.getOne(queryWrapper1); + one1.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(one1); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsAfter.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsAfter.java new file mode 100644 index 00000000..ddede826 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsAfter.java @@ -0,0 +1,63 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.Datas; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNameService; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.listener.common.WorkflowUtil; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SvppsAfter implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + IBusProcessNameService busProcessNameService = SpringContextUtil.getBean(IBusProcessNameService.class); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("ACTI_TASK_ID", delegateTask.getId()); + Datas datas = datasService.getOne(queryWrapper); + + JSONObject object = JSONObject.parseObject(datas.getFormValsJson()); + delegateTask.setVariable("objectJson",object); + + JSONObject taskBreak = object.getJSONArray("taskBreak").getJSONObject(0); + + //其他审核人审核节点执行人集合 + List userIdList = new ArrayList(); + + String foApprove = object.get("currentUser") == null ? "" : object.get("currentUser").toString(); + userIdList.add(foApprove); + delegateTask.setVariable("approveFoUserId",foApprove); + + if(userIdList != null && !userIdList.isEmpty()){ + WorkflowUtil.saveBusProcessNew(delegateTask,userIdList,object.toJSONString()); + } + + //是否技术评估 + String sfjspg = object.get("ifIn") == null ? "" : object.get("ifIn").toString(); + + //默认通过,流程结束 + String spFlag = "1"; + JSONArray itemList = taskBreak.getJSONArray("itemsList"); + if(itemList != null && !itemList.isEmpty()){ + spFlag = ((JSONObject)itemList.get(0)).getString("jspg"); + }else{ + spFlag = taskBreak.get("jspg") == null ? "" : taskBreak.get("jspg").toString(); + } + //如果不进行技术评估,流程直接结束,如果进行技术评估,流程走向则取决于技术评估结果 + if("1".equalsIgnoreCase(sfjspg)){ + spFlag = "1"; + } + delegateTask.setVariable("svppsFlag",spFlag); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsFront.java b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsFront.java new file mode 100644 index 00000000..111eb3ff --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/listener/zcfgrk/SvppsFront.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.listener.zcfgrk; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.ydw.bat.wkflow.business_main.datas.entity.BusProcessNew; +import com.ydw.bat.wkflow.business_main.datas.service.IBusProcessNewService; +import com.ydw.bat.wkflow.business_main.datas.service.IDatasService; +import com.ydw.bat.wkflow.util.SpringContextUtil; +import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.delegate.TaskListener; + +import java.util.List; + +public class SvppsFront implements TaskListener { + @Override + public void notify(DelegateTask delegateTask) { + IDatasService datasService = SpringContextUtil.getBean(IDatasService.class); + IBusProcessNewService busBean = SpringContextUtil.getBean(IBusProcessNewService.class); + + QueryWrapper queryWrapper1 = new QueryWrapper(); + queryWrapper1.eq("USER_ID", delegateTask.getAssignee()); + queryWrapper1.eq("P_ID",delegateTask.getProcessInstanceId()); + queryWrapper1.isNull("TASK_ID"); + List list = busBean.list(queryWrapper1); + if(list != null && !list.isEmpty()){ + BusProcessNew bus = list.get(0); + bus.setTaskId(delegateTask.getId()); + busBean.saveOrUpdate(bus); + } + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/CreatedTools.java b/src/main/java/com/ydw/bat/wkflow/util/CreatedTools.java new file mode 100644 index 00000000..bdbd4eda --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/CreatedTools.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.util; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class CreatedTools { + + private final static DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + + // 返回long型的创建时间 + public static long getCreated() { + Date d = new Date(); + long l = Long.parseLong(df.format(d)); + return l; + } + + public static long getCreated(int add) { + long t = System.currentTimeMillis() + add; + Timestamp time = new Timestamp(t); + long l = Long.parseLong(df.format(time)); + return l; + } + + public static long t() { + return 0l; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/SessionMemberTool.java b/src/main/java/com/ydw/bat/wkflow/util/SessionMemberTool.java new file mode 100644 index 00000000..021cc483 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/SessionMemberTool.java @@ -0,0 +1,59 @@ +package com.ydw.bat.wkflow.util; + +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.CookieUtil; +import com.tmsps.fk.common.util.DesUtil; +import com.ydw.bat.wkflow.config.WebConfig; + +/** + * Session业务相关工具类 + * + * @author 冯晓东 398479251@qq.com + * + */ +public class SessionMemberTool { + + // Session 分割符 + private static final String SPLIT = ":"; + + /** + * 设置 or 取消设置 登录key + * + * 加密 memberId + * + * @param sessionKey + * @return + */ + public static String setSessionMemberLoginKey(String memberId) { + String sessionKey = DesUtil.encrypt(WebConfig.MEMBERSESSION + SPLIT + memberId, WebConfig.DESKEY); + CookieUtil.setCookie(WebUtil.getReponse(), WebConfig.MEMBERSESSION, sessionKey, 10 * 365 * 24 * 60 * 60); + return sessionKey; + } + + /** + * 解密 memberId + * + * @param loginKey + * @return + */ + public static String getMemberIdFromKey(String loginKey) { + if (ChkUtil.isNull(loginKey) || "null".equals(loginKey)) { + return null; + } + System.err.println(loginKey); + String key = DesUtil.decrypt(loginKey, WebConfig.DESKEY); + if (key == null || !key.startsWith(WebConfig.MEMBERSESSION + SPLIT)) { + return null; + } + String memberId = key.substring((WebConfig.MEMBERSESSION + SPLIT).length()); + return memberId; + } + + public static void setSessionMemberId(String memberId) { + WebUtil.getSession().setAttribute("MEMBER_ID", memberId); + } + + public static String getSessionMemberId() { + return (String) WebUtil.getSession().getAttribute("MEMBER_ID"); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/SessionTool.java b/src/main/java/com/ydw/bat/wkflow/util/SessionTool.java new file mode 100644 index 00000000..dba84eec --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/SessionTool.java @@ -0,0 +1,55 @@ +package com.ydw.bat.wkflow.util; + +import com.alibaba.fastjson.JSONObject; +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.CookieUtil; +import com.tmsps.fk.common.util.DesUtil; +import com.tmsps.fk.common.util.JsonUtil; +import com.ydw.bat.wkflow.config.WebConfig; + +/** + * Session业务相关工具类 + * + * @author 冯晓东 398479251@qq.com + * + */ +public class SessionTool { + + // Session 分割符 + private static final String SPLIT = ":"; + // 短信验证码 + public static final String CODE = "SMS_CODE"; + + /** + * 设置 or 取消设置 登录key + * + * @param sessionKey + */ + public static void setSessionAdminLoginKey(String userJson) { + String sessionKey = DesUtil.encrypt(WebConfig.ADMINSESSION + SPLIT + userJson, WebConfig.DESKEY); + CookieUtil.setCookie(WebUtil.getReponse(), WebConfig.ADMINSESSION, sessionKey, 1 * 24 * 60 * 60); + } + + public static JSONObject getSessionAdmin() { + String sessionKey = CookieUtil.getCookie(WebUtil.getRequest(), WebConfig.ADMINSESSION); + if (ChkUtil.isNull(sessionKey)) { + return null; + } else { + String key = DesUtil.decrypt(sessionKey, WebConfig.DESKEY); + if (!key.startsWith(WebConfig.ADMINSESSION + SPLIT)) { + return null; + } + String userJson = key.substring((WebConfig.ADMINSESSION + SPLIT).length()); + JSONObject user = JsonUtil.jsonStrToJsonObject(userJson); + return user; + } + } + + public static String getSessionAdminId() { + JSONObject userJSON = getSessionAdmin(); + if(ChkUtil.isNotNull(userJSON)) { + return userJSON.getString("objectId"); + } + return null; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/SpringContextUtil.java b/src/main/java/com/ydw/bat/wkflow/util/SpringContextUtil.java new file mode 100644 index 00000000..36c0ac8c --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/SpringContextUtil.java @@ -0,0 +1,38 @@ +package com.ydw.bat.wkflow.util; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringContextUtil implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringContextUtil.applicationContext = applicationContext; + } + + // 获取applicationContext + public static ApplicationContext getApplicationContext() { + return applicationContext; + } + + // 通过name获取 Bean. + public static Object getBean(String name) { + return getApplicationContext().getBean(name); + } + + // 通过class获取Bean. + public static T getBean(Class clazz) { + return getApplicationContext().getBean(clazz); + } + + // 通过name,以及Clazz返回指定的Bean + public static T getBean(String name, Class clazz) { + return getApplicationContext().getBean(name, clazz); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/TjTools.java b/src/main/java/com/ydw/bat/wkflow/util/TjTools.java new file mode 100644 index 00000000..5b25bcfb --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/TjTools.java @@ -0,0 +1,118 @@ +package com.ydw.bat.wkflow.util; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.tmsps.fk.common.util.ChkUtil; + + +public class TjTools { + + // 获取统计数据 + public static Map groupBy(List> list, String key) { + Map result = new HashMap<>(); + if (ChkUtil.isNull(list)) { + return result; + } + + for (Map map : list) { + String val = (String) map.get(key); + if (val == null) { + continue; + } + + Integer cnt = result.get(val); + + if (cnt == null) { + cnt = 1; + } else { + cnt++; + } + + result.put(val, cnt); + } + return result; + + } + + // 分组保存每年12个月的数据 + public static List> groupByAddTimes(List> list, + List> type) { + if (list.size() == 0 || type.size() == 0) { + return null; + } + List> list2 = new ArrayList>(); + // 遍历type中的数据 + type.forEach(t -> { + // 创建map用来保存数据 + Map map = new HashMap(); + // 创建int[] 用来保存12个月的数据 + int[] data = new int[12]; + // 遍历list中的数据 + if (t.get("type") != null) { + list.forEach(l -> { + long num = (long) l.get("num"); + String times = (String) l.get("times"); + if (l.get("type") != null && l.get("type").equals(t.get("type"))) { + data[ChkUtil.getInteger(times.substring(times.indexOf("-") + 1)) - 1] = (int) num; + } + }); + map.put("name", t.get("type")); + map.put("data", data); + list2.add(map); + } + }); + return list2; + } + + // 保存每年12个月的数据 + public static Map addTimes(Map map) { + Map map1 = new HashMap(); + int[] a = new int[12]; + Set timeKey = map.keySet(); + for (String s : timeKey) { + a[ChkUtil.getInteger(s.substring(s.indexOf("-") + 1)) - 1] = map.get(s); + } + map1.put("time", a); + return map1; + } + + // 保存每年每天的数据 + public static Map addYearTimes(List> list, int date) { + Map map = new LinkedHashMap(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d"); + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, date); + cal.set(Calendar.MONTH, 1); + cal.set(Calendar.DAY_OF_YEAR, 1); + Calendar cal1 = Calendar.getInstance(); + cal1.set(Calendar.YEAR, date + 1); + cal1.set(Calendar.MONTH, 1); + cal1.set(Calendar.DAY_OF_YEAR, 1); + cal1.set(Calendar.HOUR_OF_DAY, 0); + cal1.set(Calendar.MINUTE, 0); + cal1.set(Calendar.SECOND, 0); + while (cal.compareTo(cal1) < 0) { + map.put(sdf.format(cal.getTime()), 0); + cal.add(Calendar.DAY_OF_YEAR, 1); + } + list.forEach(l -> { + map.put((String) l.get("times"), l.get("num")); + }); + return map; + + } + + public static void main(String[] args) { + + addYearTimes(null, 2017); + + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/Utils.java b/src/main/java/com/ydw/bat/wkflow/util/Utils.java new file mode 100644 index 00000000..17f9c111 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/Utils.java @@ -0,0 +1,40 @@ +package com.ydw.bat.wkflow.util; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Description: TODO + * @author: super_liu + * @date: 2021年03月04日 17:13 + */ +public class Utils { + + public static Map jsonArrGroup(JSONArray arr, String groupName, String sGroupName) { + Map map = new HashMap<>(); + String tempIdStr = ""; + JSONArray list; + for(Object obj : arr){ + JSONObject jsonObject = (JSONObject) obj; + tempIdStr = jsonObject.getString(groupName); + if(tempIdStr.equals("")){ + continue; + } + if(map.containsKey(tempIdStr)){ + list = map.get(tempIdStr); + list.add(obj); + }else{ + list = new JSONArray(); + list.add(obj); + map.put(tempIdStr, list); + } + } + return map; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/WebUtil.java b/src/main/java/com/ydw/bat/wkflow/util/WebUtil.java new file mode 100644 index 00000000..f875ef5d --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/WebUtil.java @@ -0,0 +1,60 @@ +package com.ydw.bat.wkflow.util; + +import javax.servlet.ServletContext; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.springframework.web.context.ContextLoader; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +/** + * web层相关工具类 + * + * @author 冯晓东 398479251@qq.com + * + */ +public class WebUtil { + + public static HttpServletRequest getRequest() { + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) + .getRequest(); + return request; + } + + public static HttpServletResponse getReponse() { + HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) + .getResponse(); + return response; + } + + public static HttpSession getSession() { + HttpSession sn = WebUtil.getRequest().getSession(); + return sn; + } + + public static ServletContext getServletContext() { + WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext(); + if (webApplicationContext == null) { + return null; + } + ServletContext servletContext = webApplicationContext.getServletContext(); + return servletContext; + } + + /** + * 同步获取token值并移除 + * + * @param string + * @return + */ + public static synchronized String getAsyncToken(String key) { + HttpSession sn = WebUtil.getRequest().getSession(); + String val = (String) sn.getAttribute(key); + sn.removeAttribute(key); + return val; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/activiti/ActivitiTools.java b/src/main/java/com/ydw/bat/wkflow/util/activiti/ActivitiTools.java new file mode 100644 index 00000000..e9782915 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/activiti/ActivitiTools.java @@ -0,0 +1,204 @@ +/** + * + */ +package com.ydw.bat.wkflow.util.activiti; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.history.HistoricTaskInstance; +import org.activiti.engine.repository.Model; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.task.Task; + +/** + * TODO 工作流表结构转换 + * @author hxj + * + */ +public class ActivitiTools { + + public static List> turnModels(List models) { + List> list = new ArrayList<>(); + for (Model model : models) { + Map map = new HashMap<>(); + map.put("id", model.getId()); + map.put("name", model.getName()); + map.put("key", model.getKey()); + map.put("category", model.getCategory()); + map.put("createTime", model.getCreateTime()); + map.put("lastUpdateTime", model.getLastUpdateTime()); + map.put("version", model.getVersion()); + map.put("metaInfo", model.getMetaInfo()); + map.put("deploymentId", model.getDeploymentId()); + map.put("tenanId", model.getTenantId()); + list.add(map); + } + return list; + } + + public static List> turnProcessDefinitions(List models) { + List> list = new ArrayList<>(); + for (ProcessDefinition model : models) { + Map map = new HashMap<>(); + map.put("id", model.getId()); + map.put("category", model.getCategory()); + map.put("name", model.getName()); + map.put("key", model.getKey()); + map.put("description", model.getDescription()); + map.put("version", model.getVersion()); + map.put("resourceName", model.getResourceName()); + map.put("deploymentId", model.getDeploymentId()); + map.put("diagramResourceName", model.getDiagramResourceName()); + map.put("hasStartFormKey", model.hasStartFormKey()); + map.put("isGraphicalNotationDefined", model.hasGraphicalNotation()); + map.put("suspensionState", model.isSuspended()); + map.put("tenanId", model.getTenantId()); + list.add(map); + } + return list; + } + + public static List> turnTasks(List models) { + List> list = new ArrayList<>(); + for (Task model : models) { + Map map = new HashMap<>(); + map.put("id", model.getId()); + map.put("name", model.getName()); + map.put("description", model.getDescription()); + map.put("priority", model.getPriority()); + map.put("owner", model.getOwner()); + map.put("assignee", model.getAssignee()); + map.put("processInstanceId", model.getProcessInstanceId()); + map.put("executionId", model.getExecutionId()); + map.put("processDefinitionId", model.getProcessDefinitionId()); + map.put("createTime", model.getCreateTime()); + map.put("taskDefinitionKey", model.getTaskDefinitionKey()); + map.put("dueDate", model.getDueDate()); + map.put("category", model.getCategory()); + map.put("parentTaskId", model.getParentTaskId()); + map.put("tenantId", model.getTenantId()); + map.put("formKey", model.getFormKey()); + map.put("delegationState", model.getDelegationState()); + map.put("suspended", model.isSuspended()); + map.put("taskLocalVariables", model.getTaskLocalVariables()); + map.put("processVariables", model.getProcessVariables()); + list.add(map); + } + return list; + } + + public static Map turnProcessInstance(ProcessInstance model) { + Map map = new HashMap<>(); + map.put("id", model.getId()); + map.put("isSuspended", model.isSuspended()); + map.put("isEnded", model.isEnded()); + map.put("activityId", model.getActivityId()); + map.put("processInstanceId", model.getProcessInstanceId()); + map.put("parentId", model.getParentId()); + map.put("superExecutionId", model.getSuperExecutionId()); + map.put("tenantId", model.getTenantId()); + map.put("name", model.getName()); + map.put("description", model.getDescription()); + map.put("processDefinitionId", model.getProcessDefinitionId()); + map.put("processDefinitionName", model.getProcessDefinitionName()); + map.put("processDefinitionKey", model.getProcessDefinitionKey()); + map.put("processDefinitionVersion", model.getProcessDefinitionVersion()); + map.put("deploymentId", model.getDeploymentId()); + map.put("businessKey", model.getBusinessKey()); + map.put("processVariables", model.getProcessVariables()); + map.put("localizedName", model.getLocalizedName()); + map.put("localizedDescription", model.getLocalizedDescription()); + return map; + } + + public static List> turnProcessInstances(List models) { + List> list = new ArrayList<>(); + for (ProcessInstance model : models) { + Map map = new HashMap<>(); + map.put("id", model.getId()); + map.put("isSuspended", model.isSuspended()); + map.put("isEnded", model.isEnded()); + map.put("activityId", model.getActivityId()); + map.put("processInstanceId", model.getProcessInstanceId()); + map.put("parentId", model.getParentId()); + map.put("superExecutionId", model.getSuperExecutionId()); + map.put("tenantId", model.getTenantId()); + map.put("name", model.getName()); + map.put("description", model.getDescription()); + map.put("processDefinitionId", model.getProcessDefinitionId()); + map.put("processDefinitionName", model.getProcessDefinitionName()); + map.put("processDefinitionKey", model.getProcessDefinitionKey()); + map.put("processDefinitionVersion", model.getProcessDefinitionVersion()); + map.put("deploymentId", model.getDeploymentId()); + map.put("businessKey", model.getBusinessKey()); + map.put("processVariables", model.getProcessVariables()); + map.put("localizedName", model.getLocalizedName()); + map.put("localizedDescription", model.getLocalizedDescription()); + list.add(map); + } + return list; + } + + public static List> turnHistoryProcessInstances(List models) { + List> list = new ArrayList<>(); + for (HistoricProcessInstance model : models) { + Map map = new HashMap<>(); + map.put("id", model.getId()); + map.put("businessKey", model.getBusinessKey()); + map.put("processDefinitionId", model.getProcessDefinitionId()); + map.put("processDefinitionName", model.getProcessDefinitionName()); + map.put("processDefinitionKey", model.getProcessDefinitionKey()); + map.put("processDefinitionVersion", model.getProcessDefinitionVersion()); + map.put("deploymentId", model.getDeploymentId()); + map.put("startTime", model.getStartTime()); + map.put("endTime", model.getEndTime()); + map.put("durationInMillis", model.getDurationInMillis()); + map.put("startUserId", model.getStartUserId()); + map.put("startActivityId", model.getStartActivityId()); + map.put("deleteReason", model.getDeleteReason()); + map.put("superProcessInstanceId", model.getSuperProcessInstanceId()); + map.put("tenantId", model.getTenantId()); + map.put("name", model.getName()); + map.put("description", model.getDescription()); + map.put("processVariables", model.getProcessVariables()); + list.add(map); + } + return list; + } + + public static List> turnHistoricTaskInstance(List models) { + List> list = new ArrayList<>(); + for (HistoricTaskInstance model : models) { + Map map = new HashMap<>(); + map.put("assignee", model.getAssignee()); + map.put("category", model.getCategory()); + map.put("claimTime", model.getClaimTime()); + map.put("createTime", model.getCreateTime()); + map.put("deleteReason", model.getDeleteReason()); + map.put("description", model.getDescription()); + map.put("dueDate", model.getDueDate()); + map.put("drationInMillis", model.getDurationInMillis()); + map.put("endTime", model.getEndTime()); + map.put("executionId", model.getExecutionId()); + map.put("formKey", model.getFormKey()); + map.put("id", model.getId()); + map.put("name", model.getName()); + map.put("owner", model.getOwner()); + map.put("ParentTaskId", model.getParentTaskId()); + map.put("priority", model.getPriority()); + map.put("processDefinitionId", model.getProcessDefinitionId()); + map.put("processInstanceId", model.getProcessInstanceId()); + map.put("processVariables", model.getProcessVariables()); + map.put("startTime", model.getStartTime()); + map.put("taskDefinitionKey", model.getTaskDefinitionKey()); + map.put("taskLocalVariables", model.getTaskLocalVariables()); + list.add(map); + } + return list; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/coder/CodeGenerator.java b/src/main/java/com/ydw/bat/wkflow/util/coder/CodeGenerator.java new file mode 100644 index 00000000..0e680371 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/coder/CodeGenerator.java @@ -0,0 +1,157 @@ +/** + * + */ +package com.ydw.bat.wkflow.util.coder; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException; +import com.baomidou.mybatisplus.core.toolkit.StringPool; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.generator.AutoGenerator; +import com.baomidou.mybatisplus.generator.InjectionConfig; +import com.baomidou.mybatisplus.generator.config.DataSourceConfig; +import com.baomidou.mybatisplus.generator.config.FileOutConfig; +import com.baomidou.mybatisplus.generator.config.GlobalConfig; +import com.baomidou.mybatisplus.generator.config.PackageConfig; +import com.baomidou.mybatisplus.generator.config.StrategyConfig; +import com.baomidou.mybatisplus.generator.config.TemplateConfig; +import com.baomidou.mybatisplus.generator.config.po.TableInfo; +import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; +import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine; + +/** + * 代码生成 - mybatis-plus + * 官方示例 + * @author 冯晓东 + * + */ +public class CodeGenerator { + + private static final String parent = "com.ydw.bat.wkflow.business_main"; + + private static final String jdbcUrl = "jdbc:mysql://106.2.13.59:8037/bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8"; + private static final String driver = "com.mysql.cj.jdbc.Driver"; + private static final String uname = "rczbuser"; + private static final String password = "91isoft@PT"; + + /** + *

    + * 读取控制台内容 + *

    + */ + public static String scanner(String tip) { + @SuppressWarnings("resource") + Scanner scanner = new Scanner(System.in); + StringBuilder help = new StringBuilder(); + help.append("请输入" + tip + ":"); + System.out.println(help.toString()); + if (scanner.hasNext()) { + String ipt = scanner.next(); + if (StringUtils.isNotEmpty(ipt)) { + return ipt; + } + } + throw new MybatisPlusException("请输入正确的" + tip + "!"); + } + + public static void main(String[] args) { + // 代码生成器 + AutoGenerator mpg = new AutoGenerator(); + + // 全局配置 + GlobalConfig gc = new GlobalConfig(); + String projectPath = System.getProperty("user.dir"); + gc.setOutputDir(projectPath + "/src/main/java"); + gc.setAuthor("冯晓东"); + gc.setOpen(false); + //实体属性 Swagger2 注解 + gc.setSwagger2(true); + mpg.setGlobalConfig(gc); + + // 数据源配置 + DataSourceConfig dsc = new DataSourceConfig(); + dsc.setUrl(jdbcUrl); + // dsc.setSchemaName("public"); + dsc.setDriverName(driver); + dsc.setUsername(uname); + dsc.setPassword(password); + mpg.setDataSource(dsc); + + // 包配置 + PackageConfig pc = new PackageConfig(); + pc.setModuleName(scanner("模块名")); + pc.setParent(parent); + mpg.setPackageInfo(pc); + + // 自定义配置 + InjectionConfig cfg = new InjectionConfig() { + @Override + public void initMap() { + // to do nothing + } + }; + + // 如果模板引擎是 freemarker + //String templatePath = "/templates/mapper.xml.ftl"; + // 如果模板引擎是 velocity + String templatePath = "/templates/mapper.xml.vm"; + + // 自定义输出配置 + List focList = new ArrayList<>(); + // 自定义配置会被优先输出 + focList.add(new FileOutConfig(templatePath) { + @Override + public String outputFile(TableInfo tableInfo) { + // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!! + return projectPath + "/src/main/resources/mapper/" + pc.getModuleName() + + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML; + } + }); + /* + cfg.setFileCreate(new IFileCreate() { + @Override + public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) { + // 判断自定义文件夹是否需要创建 + checkDir("调用默认方法创建的目录"); + return false; + } + }); + */ + cfg.setFileOutConfigList(focList); + mpg.setCfg(cfg); + + // 配置模板 + TemplateConfig templateConfig = new TemplateConfig(); + + // 配置自定义输出模板 + //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别 + // templateConfig.setEntity("templates/entity2.java"); + // templateConfig.setService(); + // templateConfig.setController(); + + templateConfig.setXml(null); + mpg.setTemplate(templateConfig); + + // 策略配置 + StrategyConfig strategy = new StrategyConfig(); + strategy.setNaming(NamingStrategy.underline_to_camel); + strategy.setColumnNaming(NamingStrategy.underline_to_camel); +// strategy.setSuperEntityClass("你自己的父类实体,没有就不用设置!"); + strategy.setEntityLombokModel(true); + strategy.setRestControllerStyle(true); + // 公共父类 +// strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!"); + // 写于父类中的公共字段 + strategy.setSuperEntityColumns("id"); + strategy.setInclude(scanner("表名,多个英文逗号分割").split(",")); + strategy.setControllerMappingHyphenStyle(true); + strategy.setTablePrefix("t_"); + mpg.setStrategy(strategy); + mpg.setTemplateEngine(new VelocityTemplateEngine()); + mpg.execute(); + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/date/DateTools.java b/src/main/java/com/ydw/bat/wkflow/util/date/DateTools.java new file mode 100644 index 00000000..71e8b4ef --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/date/DateTools.java @@ -0,0 +1,493 @@ +package com.ydw.bat.wkflow.util.date; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +import com.tmsps.fk.common.util.ChkUtil; + +public class DateTools { + + // 增加对应天数 + public static Timestamp addDay(Timestamp end, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(end.getTime()); + + cal.add(Calendar.DAY_OF_YEAR, day); + return new Timestamp(cal.getTimeInMillis()); + + } + + // 增加对应天数 + public static java.sql.Date addDay(java.sql.Date end, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(end.getTime()); + + cal.add(Calendar.DAY_OF_YEAR, day); + return new java.sql.Date(cal.getTimeInMillis()); + + } + + public static String getstrDate(long created) { + String creat = created + ""; + String year = creat.substring(0, 4); + String month = creat.substring(4, 6); + String day = creat.substring(6, 8); + String hour = creat.substring(8, 10); + String minute = creat.substring(10, 12); + String sec = creat.substring(12, 14); + return year + "年" + month + "月" + day + "日 " + hour + "时" + minute + "分" + sec + "秒"; + } + + public static String getstrDate1(long created) { + String creat = created + ""; + String year = creat.substring(0, 4); + String month = creat.substring(4, 6); + String day = creat.substring(6, 8); + String hour = creat.substring(8, 10); + String minute = creat.substring(10, 12); + String sec = creat.substring(12, 14); + return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec; + } + + public static String getstrDate2(String created) { + String creat = created + ""; + String year = creat.substring(0, 4); + String month = creat.substring(4, 6); + String day = creat.substring(6, 8); + String hour = creat.substring(8, 10); + String minute = creat.substring(10, 12); + String sec = creat.substring(12, 14); + return year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + sec; + } + + // 增加对应年数 + public static Timestamp addYear(Timestamp end, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(end.getTime()); + + cal.add(Calendar.YEAR, day); + return new Timestamp(cal.getTimeInMillis()); + + } + + // 增加一年 + public static String addOneYear(String date) { + String pattern = "yyyy-MM-dd"; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(date); + Timestamp time = new Timestamp(d.getTime()); + return DateTools.addYear(time, 1).toString(); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + // 减一年 + public static String subtractOneYear(String date) { + String pattern = "yyyy-MM-dd"; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(date); + Timestamp time = new Timestamp(d.getTime()); + return DateTools.addYear(time, -1).toString(); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + // 增加对应秒数 + public static Timestamp addSecond(Timestamp end, int sec) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(end.getTime()); + + cal.add(Calendar.SECOND, sec); + return new Timestamp(cal.getTimeInMillis()); + } + + public static int countDays(Timestamp begin, Timestamp end) { + long beginTime = begin.getTime(); + long endTime = end.getTime(); + int days = (int) ((endTime - beginTime) / (1000 * 60 * 60 * 24)); + return days; + } + + public static long strToLong(String date) { + + String pattern = "yyyy-MM-dd HH:mm:ss"; + java.sql.Date date1 = strToDate(date, pattern); + if (date1 != null) { + return date1.getTime(); + } else { + return 0L; + } + } + + public static long strToLong1(String date) { + + String pattern = "yyyy-MM-dd HH:mm"; + java.sql.Date date1 = strToDate(date, pattern); + if (date1 != null) { + return date1.getTime(); + } else { + return 0L; + } + } + + public static long strToLongTwo(String date) { + + String pattern = "yyyy-MM-dd"; +// return strToDate(date, pattern).getTime(); + java.sql.Date date1 = strToDate(date, pattern); + if (date1 != null) { + return date1.getTime(); + } else { + return 0L; + } + } + + public static long strToLongTwo1(String date) { + + String pattern = "yyyyMMddHHmmss"; +// return strToDate(date, pattern).getTime(); + java.sql.Date date1 = strToDate(date, pattern); + if (date1 != null) { + return date1.getTime(); + } else { + return 0L; + } + } + + /** + * 字符串转 Timestamp对象 + * + * @param date + */ + public static Timestamp strToTimestamp(String date) { + String pattern = "yyyy-MM-dd"; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(date); + return new Timestamp(d.getTime()); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + public static String addOneDay(String date) { + String pattern = "yyyy-MM-dd"; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(date); + Timestamp time = new Timestamp(d.getTime()); + return DateTools.addDay(time, 1).toString(); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + + } + + /** + * 字符串转 Timestamp对象 + * + * @param date + */ + public static Timestamp strToDatestamp(String datetime) { + String pattern = "yyyy-MM-dd HH:mm:ss"; + return strToDatestamp(datetime, pattern); + } + + public static Timestamp strToDatestamp(String datetime, String pattern) { + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(datetime); + return new Timestamp(d.getTime()); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + + } + + /** + * 字符串转 Timestamp对象 + * + * @param date + */ + + public static String strDateToStr(String date) { + + return format(strToDate(date)); + } + + public static java.sql.Date strToDate(String date) { + String pattern = "yyyy-MM-dd"; + return strToDate(date, pattern); + } + + public static java.sql.Date strNumToDate(String date) { + String pattern = "yyyyMMdd"; + return strToDate(date, pattern); + } + + public static java.sql.Date strToDate(String date, String pattern) { + if (ChkUtil.isNull(date)) { + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(date); + return new java.sql.Date(d.getTime()); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + public static java.sql.Date strToDate2(String date) { + if (ChkUtil.isNull(date)) { + return null; + } + date = date.replace("Z", " UTC"); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS Z"); + try { + Date d = sdf.parse(date); + return new java.sql.Date(d.getTime()); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + public static java.sql.Date strToDate(String date, String pattern, boolean ifNullToNow) { + if (ChkUtil.isNull(date)) { + if (ifNullToNow) { + return new java.sql.Date(System.currentTimeMillis()); + } else { + return null; + } + } + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + try { + Date d = sdf.parse(date); + return new java.sql.Date(d.getTime()); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } + + // 取得当前的年月 + public static String getYearMonth() { + String pattern = "yyyy-MM"; + SimpleDateFormat sdf = new SimpleDateFormat(pattern); + return sdf.format(new Date(System.currentTimeMillis())); + } + + // 获取上个月的年月 + public static String getLastYearMonth() { + Calendar cal = Calendar.getInstance(); + // 取得系统当前时间所在月第一天时间对象 + cal.set(Calendar.DAY_OF_MONTH, 1); + // 日期减一,取得上月最后一天时间对象 + cal.add(Calendar.DAY_OF_MONTH, -1); + java.util.Date date = cal.getTime(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM"); + return df.format(date); + } + + public static java.sql.Date getYearMonth(String date) { + String pattern = "yyyy-MM"; + return strToDate(date, pattern); + } + + public static int getYear() { + Calendar cal = Calendar.getInstance(); + int year = cal.get(Calendar.YEAR); + return year; + } + + public static int getMonth() { + Calendar cal = Calendar.getInstance(); + int month = cal.get(Calendar.MONTH); + return month; + } + + public static String getToday() { + Calendar cal = Calendar.getInstance(); + java.util.Date date = cal.getTime(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + return df.format(date); + } + + public static String getToday(String reg) { + Calendar cal = Calendar.getInstance(); + java.util.Date date = cal.getTime(); + SimpleDateFormat df = new SimpleDateFormat(reg); + return df.format(date); + } + + public static String format() { + return DateTools.format(new java.sql.Date(System.currentTimeMillis())); + } + + public static String format(java.sql.Date date) { + if (ChkUtil.isNull(date)) { + return ""; + } + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + return df.format(date); + } + + public static String getTodayTime() { + Calendar cal = Calendar.getInstance(); + java.util.Date date = cal.getTime(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return df.format(date); + } + + public static int countDaysVSToday(java.sql.Date start) { + Timestamp now = new Timestamp(System.currentTimeMillis()); + + int days = (int) ((now.getTime() - start.getTime()) / (1000 * 60 * 60 * 24)); + return days; + + } + + // 获取每月最大天数 + // 参数 yyyy-MM 格式 + public static int getDayOfMonth(String yearMonth) { + java.sql.Date date = getYearMonth(yearMonth); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(date.getTime()); + int dateOfMonth = cal.getActualMaximum(Calendar.DATE); + return dateOfMonth; + } + + // 获取每月最大天数 + public static int getDayOfMonth(int year, int month) { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.YEAR, year); + cal.set(Calendar.MONTH, month - 1);// Java月份才0开始算 + int dateOfMonth = cal.getActualMaximum(Calendar.DATE); + return dateOfMonth; + } + + public static String formatDateTime(Timestamp date) { + if (ChkUtil.isNull(date)) { + return ""; + } + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return df.format(date); + } + + public static String formatDateTime(Date date) { + if (ChkUtil.isNull(date)) { + return ""; + } + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return df.format(date); + } + + public static String formatDate(Timestamp date) { + if (ChkUtil.isNull(date)) { + return ""; + } + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + return df.format(date); + } + + public static String formatDate(Timestamp date, String patten) { + if (ChkUtil.isNull(date)) { + return ""; + } + SimpleDateFormat df = new SimpleDateFormat(patten); + return df.format(date); + } + + public static String formatDate(Date date) { + if (ChkUtil.isNull(date)) { + return ""; + } + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + return df.format(date); + } + + // 获取某月的最后一天 month格式:yyyy-MM-dd or yyyy-MM + public static String getMonthFinalDay(String month) { + if (month.length() < 10) { + month = month + "-01"; + } + Calendar cal = Calendar.getInstance(); + cal.setTime(DateTools.strToDate(month)); + cal.add(Calendar.MONTH, 1); + cal.set(Calendar.DAY_OF_MONTH, 1); + // 日期减一,取得上月最后一天时间对象 + cal.add(Calendar.DAY_OF_MONTH, -1); + java.util.Date date = cal.getTime(); + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + return df.format(date); + } + + // 获取距今i天的时间 long型 + public static long getSomeDaysBefore(int i) { + Calendar c = Calendar.getInstance(); + c.setTime(strToDate(getToday())); + c.add(Calendar.DAY_OF_YEAR, i); + + return c.getTimeInMillis(); + } + + public static Long getstrDate3(String str) throws ParseException { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long a = sdf.parse(str).getTime(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmss"); + String newdate = sdf1.format(new Date(a)); + return Long.valueOf(newdate); + } + + public static void main(String[] args) throws ParseException { + + String str = getstrDate1(20181113110947L); + System.out.println(str); +// System.err.println(getDayOfMonth(2000, 2)); +// System.err.println(getDayOfMonth("2000-02")); + /* + * System.err.println(getYearToLong(2016)); + * System.err.println(getYearToLong(2017)); + * System.err.println(getYearToLong(2018)); + */ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + long a = sdf.parse(str).getTime(); + SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmss"); + System.out.println(sdf1.format(new Date(a))); + } + + public static long getYearToLong(int year) { + java.sql.Date date = strToDate(year + "-01-01"); + return date.getTime(); + } + + public static long getCreated() { + Date d = new Date(); + SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); + long l = Long.parseLong(df.format(d)); + return l; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/file/FileTools.java b/src/main/java/com/ydw/bat/wkflow/util/file/FileTools.java new file mode 100644 index 00000000..3bb2ed47 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/file/FileTools.java @@ -0,0 +1,333 @@ +package com.ydw.bat.wkflow.util.file; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileFilter; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.HashMap; +import java.util.Map; + +import com.tmsps.fk.common.util.ChkUtil; +import com.tmsps.fk.common.util.JsonUtil; + +public class FileTools { + + // 解析propertis中的字符串 + public static String parseStr(String str) { + + str = str.replace("{", "").replace("}", ""); + System.err.println(JsonUtil.toJson(str)); + + String[] split = str.split(","); + System.err.println(JsonUtil.toJson(split)); + + Map map = new HashMap(); + for (int i = 0; i < split.length; i++) { + String[] split2 = split[i].split("="); + map.put(split2[0].trim(), split2[1].trim()); + } + return map.get("bidPrice").toString(); + } + + // 解析propertis中的字符串 + public static Map parseStrToMap(String str) { + + str = str.replace("{", "").replace("}", ""); + + String[] split = str.split(","); + + Map map = new HashMap(); + for (int i = 0; i < split.length; i++) { + String[] split2 = split[i].split("="); + map.put(split2[0].trim(), split2[1].trim()); + } + return map; + } + + public static String getSuffix(String filename) { + if (ChkUtil.isNull(filename)) { + return ""; + } + if (!filename.contains(".")) { + return ""; + } + return filename.substring(filename.lastIndexOf(".") + 1); + } + + /** + * + * copy文件从一个目录到另一个目录 + * + * @param srcFile 源文件路径 + * @param destFile 目标文件路径 + * @return + */ + public static boolean copyFile(String srcFile, String destFile) { + boolean flag = false; + FileInputStream fin = null; + FileOutputStream fout = null; + FileChannel fcin = null; + FileChannel fcout = null; + try { + // 获取源文件和目标文件的输入输出流 + fin = new FileInputStream(srcFile); + fout = new FileOutputStream(destFile); + // 获取输入输出通道 + fcin = fin.getChannel(); + fcout = fout.getChannel(); + // 创建缓冲区 + ByteBuffer buffer = ByteBuffer.allocate(1024); + while (true) { + // clear方法重设缓冲区,使它可以接受读入的数据 + buffer.clear(); + // 从输入通道中将数据读到缓冲区 + int r = fcin.read(buffer); + // read方法返回读取的字节数,可能为零,如果该通道已到达流的末尾,则返回-1 + if (r == -1) { + flag = true; + break; + } + // flip方法让缓冲区可以将新读入的数据写入另一个通道 + buffer.flip(); + // 从输出通道中将数据写入缓冲区 + fcout.write(buffer); + } + fout.flush(); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (null != fin) { + fin.close(); + } + if (null != fout) { + fout.close(); + } + if (null != fcin) { + fcin.close(); + } + if (null != fcout) { + fcout.close(); + } + } catch (IOException ex) { + ex.printStackTrace(); + } + } + return flag; + } + + /** + * 判断文件夹中所有文件的名字是否含有.bid + * + * @param file 想要读取的文件对象 + * @return boolean + */ + public static boolean checkFileName(String filePath, String exclusive_name) { + File f = new File(filePath); + if (!f.exists()) { + System.out.println(filePath + " not exists"); + return false; + } + + // 含有.bid,返回true,否则返回false + boolean status = false; + File fa[] = f.listFiles(); + for (int i = 0; i < fa.length; i++) { + File fs = fa[i]; + String name = fs.getName(); + if (name.contains(exclusive_name)) { + status = true; + return status; + } else { + status = false; + } + } + return status; + } + + /** + * 读取txt文件的内容 + * + * @param file 想要读取的文件对象 + * @return 返回文件内容 + */ + /* + * public static String getKey(File file) { try { return + * FileUtils.readFileToString(file, "utf-8"); } catch (IOException e) { + * e.printStackTrace(); return ""; } } public static String getKeyOld(File file) + * { StringBuilder result = new StringBuilder(); try { BufferedReader br = new + * BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件 String s = + * null; while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行 + * result.append(System.lineSeparator() + s); } br.close(); } catch (Exception + * e) { e.printStackTrace(); } return result.toString().trim(); } + */ + + /** + * + * 查找某个文件下,包含某个关键字的文件 + * + * @param folder + * @param keyWord + * @return + */ + public static File searchFile(File folder, final String keyWord) {// 递归查找包含关键字的文件 + + File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件 + @Override + public boolean accept(File pathname) {// 实现FileFilter类的accept方法 + // 目录或文件包含关键字 + if (pathname.isFile() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())) { + return true; + } + + return false; + } + }); + + File foldResult = null; + for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件 + if (subFolders[i].isFile()) {// 如果是文件则将文件添加到结果列表中 + foldResult = subFolders[i]; + } else {// 如果是文件夹,则递归调用本方法,然后把所有的文件加到结果列表中 + searchFile(subFolders[i], keyWord); + } + } + + return foldResult; + } + + /** + * + * 查找某个文件下,包含某个关键字的文件夹 + * + * @param folder + * @param keyWord + * @return + */ + public static File searchFileFolder(File folder, final String keyWord) {// 递归查找包含关键字的文件 + + File[] subFolders = folder.listFiles(new FileFilter() {// 运用内部匿名类获得文件 + @Override + public boolean accept(File pathname) {// 实现FileFilter类的accept方法 + // 目录或文件包含关键字 + if (pathname.isDirectory() && pathname.getName().toLowerCase().contains(keyWord.toLowerCase())) { + return true; + } + return false; + } + }); + + File foldResult = null; + for (int i = 0; i < subFolders.length; i++) {// 循环显示文件夹或文件 + if (subFolders[i].isDirectory()) {// 如果是文件夹则将文件夹添加到结果列表中 + foldResult = subFolders[i]; + } + } + + return foldResult; + } + + /** + * 文件写入数据 + * + * @param content + * @param write_url + * @return + */ + public static boolean writeFile(String content, String url) { + if (ChkUtil.isNull(url)) { + return false; + } + BufferedWriter writer = null; + try { + + File file = new File(url); + if (file.exists()) { + file.delete(); + } + if (!file.exists()) { + file.createNewFile(); + } + FileOutputStream writerStream = new FileOutputStream(file); + writer = new BufferedWriter(new OutputStreamWriter(writerStream, "UTF-8")); + writer.write(content); + writer.flush(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + try { + if (writer != null) { + writer.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + return true; + } + + public static void main(String[] args) { + + // String s = "x.ds"; System.err.println(FileTools.getSuffix(s)); + + // boolean fileName = + // checkFileName("C:\\tmp\\74f926b3-26cb-4d36-8f86-634b49323d33"); + // System.err.println(fileName); + + // File file = new + // File("C:\\data\\data\\bid\\6Yyfh6wZxyBJkYDzn5M95T\\key.txt"); + // System.out.println(getKey(file)); + + // File folder = new + // File("C:\\data\\data\\bid\\KTugyHVuGAvFrkCngLBXnc");// 默认目录 + // String keyword = ".bid"; + // if (!folder.exists()) {// 如果文件夹不存在 + // System.out.println("目录不存在:" + folder.getAbsolutePath()); + // return; + // } + // File result = searchFile(folder, keyword);// 调用方法获得文件数组 + // System.out.println("在 " + folder + " 以及所有子文件时查找对象" + keyword); + // System.out.println(result.getAbsolutePath() + " ");// 显示文件绝对路径 + String unzip_dir_url = "C:/data/data/bid/8rGZfcqDHbc9W7WTKUUrZe/ceshi"; + File attachmentFileFolder = FileTools.searchFile(new File(unzip_dir_url), ".docx"); + System.err.println(JsonUtil.toJson(attachmentFileFolder)); + // File[] attachmentFiles = attachmentFileFolder.listFiles(); + // System.err.println(JsonUtil.toJson(attachmentFiles)); + + } + + public static String readFileToString(String file) { + String content = ""; + // 2、建立数据通道 + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + byte[] buf = new byte[1024]; + int length = 0; + // 循环读取文件内容,输入流中将最多buf.length个字节的数据读入一个buf数组中,返回类型是读取到的字节数。 + // 当文件读取到结尾时返回 -1,循环结束。 + while ((length = fis.read(buf)) != -1) { + content += new String(buf, 0, length); + } + // 最后记得,关闭流 + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return content; + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/form/FormReadTools.java b/src/main/java/com/ydw/bat/wkflow/util/form/FormReadTools.java new file mode 100644 index 00000000..8e704efd --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/form/FormReadTools.java @@ -0,0 +1,71 @@ +package com.ydw.bat.wkflow.util.form; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import com.tmsps.fk.common.util.ChkUtil; + +/** + * 读取模板表单 + * + * var formData = '@loadFormData()'; + * + * 替换 '@loadFormData()' 为json值 + * + * @author 冯晓东 + * + */ +public class FormReadTools { + + private static final String htmlSubmit; + private static final String htmlRead; + + static { + htmlSubmit = readModel("/models/form/form.html"); + htmlRead = readModel("/models/form/form-read.html"); + } + + public static String readModel(String file) { + String htmlStr = ""; + InputStream is = FormReadTools.class.getResourceAsStream(file); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String line = null; + try { + while ((line = br.readLine()) != null) { + htmlStr += line + "\n"; + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return htmlStr; + } + + public static String replaceSubmitModel(String json) { + if (ChkUtil.isNull(json)) { + return null; + } + // var formData = '@loadFormData()'; + return htmlSubmit.replace("'@loadFormData()'", json); + } + + public static String replaceReadModel(String json) { + if (ChkUtil.isNull(json)) { + return null; + } + // var formData = '@loadFormData()'; + return htmlRead.replace("'@loadFormData()'", json); + } + + public static void main(String[] args) { + System.err.println(readModel("/form_model/form.html")); + System.err.println(readModel("/form_model/form-read.html")); + } +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/token/TokenAspect.java b/src/main/java/com/ydw/bat/wkflow/util/token/TokenAspect.java new file mode 100644 index 00000000..29b91db6 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/token/TokenAspect.java @@ -0,0 +1,50 @@ +package com.ydw.bat.wkflow.util.token; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import com.tmsps.fk.common.base.exception.BusinessException; +import com.ydw.bat.wkflow.util.WebUtil; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +/** + * 重复提交aop + * + * @author 冯晓东 + */ +@Aspect +@Component +public class TokenAspect { + + private static final Logger logger = LoggerFactory.getLogger(TokenAspect.class); + + /** + * @param jp + * + * 经测试,会按照单个浏览器,并行执行. 无需担心同步问题. + */ + @Before("@annotation(com.tmsps.fk.common.token.TokenCheck)") + public void before(JoinPoint jp) throws Throwable { + String token = WebUtil.getRequest().getParameter("token"); + logger.info("token --> {}", token); + if (token == null || "".equals(token.trim())) { + throw new BusinessException("500:Parameter can not be null."); + } + if (!token.contains("@@")) { + throw new BusinessException("500:Parameter is invalid key."); + } + + String key = token.split("@@")[0]; + String snToken = WebUtil.getAsyncToken("token@@" + key); + + logger.info("session token --> {}", snToken); + if (!token.equals(snToken)) { + throw new BusinessException("500:Token is invalid."); + } + + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/token/TokenController.java b/src/main/java/com/ydw/bat/wkflow/util/token/TokenController.java new file mode 100644 index 00000000..07fd911f --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/token/TokenController.java @@ -0,0 +1,30 @@ +package com.ydw.bat.wkflow.util.token; + +import java.util.UUID; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.ydw.bat.wkflow.util.WebUtil; + +@RestController +public class TokenController { + + /** + * + * @param key + * @return + */ + @GetMapping("/getToken") + public String getToken(String key) { + if (key == null || "".equals(key.trim())) { + throw new RuntimeException("500:Parameter can not be null."); + } + + // 设置token值 + String token = key + "@@" + UUID.randomUUID(); + WebUtil.getSession().setAttribute("token@@" + key, token); + return token; + } + +} diff --git a/src/main/java/com/ydw/bat/wkflow/util/tree/AuthTreeTools.java b/src/main/java/com/ydw/bat/wkflow/util/tree/AuthTreeTools.java new file mode 100644 index 00000000..04619315 --- /dev/null +++ b/src/main/java/com/ydw/bat/wkflow/util/tree/AuthTreeTools.java @@ -0,0 +1,79 @@ +package com.ydw.bat.wkflow.util.tree; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +/** + * + * @author 冯晓东 398479251@qq.com + * + */ +public class AuthTreeTools { + + /** + * 预处理树节点 + * + * @param menuList + * @param isChecked + * @return + */ + private static JSONArray handleTree(JSONArray menuList, boolean isChecked) { + for (int i = 0; i < menuList.size(); i++) { + JSONObject map = menuList.getJSONObject(i); + map.put("key", map.getString("code")); + map.put("value", map.getString("code")); + map.put("title", map.getString("name")); + if (isChecked) { + map.put("checked", false); + } + } + return menuList; + } + + public static List> turnListToTree(JSONArray menuList) { + // 转换List为树形结构 + return turnListToTree(menuList, false); + } + + @SuppressWarnings("unchecked") + public static List> turnListToTree(JSONArray menuList, boolean isChecked) { + // 转换List为树形结构 + menuList = handleTree(menuList, isChecked); + + List> nodeList = new ArrayList>(); + + for (int i = 0; i < menuList.size(); i++) { + JSONObject node1 = menuList.getJSONObject(i); + String node1_code = (String) node1.get("code"); + String node1_parent_code = node1_code.substring(0, node1_code.length() - 3); + + boolean mark = false; + for (int j = 0; j < menuList.size(); j++) { + Map node2 = menuList.getJSONObject(j); + String node2_code = (String) node2.get("code"); + + if (node1_parent_code != null && node1_parent_code.equals(node2_code)) { + mark = true; + if (node2.get("children") == null) { + node2.put("children", new ArrayList>()); + } + ((List>) node2.get("children")).add(node1); + node2.put("leaf", false); + if (!isChecked) { + node2.put("expanded", false); + } + break; + } + } + if (!mark) { + nodeList.add(node1); + } + } + return nodeList; + } + +} diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml new file mode 100644 index 00000000..8df7b006 --- /dev/null +++ b/src/main/resources/application-prod.yml @@ -0,0 +1,42 @@ +wkfow: + auth: fk-auth +server: + port: 17210 + tomcat: + uri-encoding: UTF-8 + servlet: + context-path: /bat-wkflow +logging: + level: + root: info + org.springfromework.web: info + org.hibernate: info +eureka: + client: + serviceUrl: + defaultZone: http://127.0.0.1:16000/eureka/ +spring: + application: + name: bat-wkflow + http: + encoding: + charset: UTF-8 + enabled: true + force: true + servlet: + multipart: + maxFileSize: "100MB" + maxRequestSize: "100MB" + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://test.eqbidding.com:3306/bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8 + username: fxd + password: 123456 + activiti: + database-schema-update: true + # 自动部署验证设置:true-开启(默认)、false-关闭 + check-process-definitions: false +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 00000000..7a426393 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,49 @@ +wkfow: + auth: fk-auth +server: + port: 17211 + tomcat: + uri-encoding: UTF-8 + servlet: + context-path: /bat-wkflow + max-http-header-size: 102400 +logging: + level: + root: info + org.springfromework.web: info + org.hibernate: info +eureka: + client: + serviceUrl: + defaultZone: http://127.0.0.1:8671/eureka/ +spring: + application: + name: bat-wkflow + http: + encoding: + charset: UTF-8 + enabled: true + force: true + servlet: + multipart: + maxFileSize: "100MB" + maxRequestSize: "100MB" + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3306/bat-wkflow?nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai&useSSL=false&characterEncoding=utf-8 + username: root + password: root + activiti: + database-schema-update: true + # 自动部署验证设置:true-开启(默认)、false-关闭 + check-process-definitions: false + profiles: + active: dev +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +ribbon: + ReadTimeout: 60000 + ConnectTimeout: 60000 diff --git a/src/main/resources/doc/必读.txt b/src/main/resources/doc/必读.txt new file mode 100644 index 00000000..00ee0ebb --- /dev/null +++ b/src/main/resources/doc/必读.txt @@ -0,0 +1,4 @@ +系统对接: +http://localhost:17201/bat-wkflow/swagger-ui.html + + diff --git a/src/main/resources/generatorConfig.xml b/src/main/resources/generatorConfig.xml new file mode 100644 index 00000000..a71d9f4e --- /dev/null +++ b/src/main/resources/generatorConfig.xml @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 00000000..795548e9 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,35 @@ +############# +# 输出到控制台 +############# + +# log4j.rootLogger日志输出类别和级别:只输出不低于该级别的日志信息DEBUG < INFO < WARN < ERROR < FATAL +# WARN:日志级别 CONSOLE:输出位置自己定义的一个名字 logfile:输出位置自己定义的一个名字 +log4j.rootLogger=WARN,CONSOLE,logfile +# 配置CONSOLE输出到控制台 +log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender +# 配置CONSOLE设置为自定义布局模式 +log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout +# 配置CONSOLE日志的输出格式 [frame] 2019-08-22 22:52:12,000 %r耗费毫秒数 %p日志的优先级 %t线程名 %C所属类名通常为全类名 %L代码中的行号 %x线程相关联的NDC %m日志 %n换行 +log4j.appender.CONSOLE.layout.ConversionPattern=[frame] %d{yyyy-MM-dd HH:mm:ss,SSS} - %-4r %-5p [%t] %C:%L %x - %m%n + +################ +# 输出到日志文件中 +################ + +# 配置logfile输出到文件中 文件大小到达指定尺寸的时候产生新的日志文件 +log4j.appender.logfile=org.apache.log4j.RollingFileAppender +# 保存编码格式 +log4j.appender.logfile.Encoding=UTF-8 +# 输出文件位置此为项目根目录下的logs文件夹中 +log4j.appender.logfile.File=/usr/local/adc-da-gsrm/logs/gsrm_workflow/workflow-log.log +# 后缀可以是KB,MB,GB达到该大小后创建新的日志文件 +log4j.appender.logfile.MaxFileSize=300MB +# 设置滚定文件的最大值3 指可以产生root.log.1、root.log.2、root.log.3和root.log四个日志文件 +log4j.appender.logfile.MaxBackupIndex=50 +# 配置logfile为自定义布局模式 +log4j.appender.logfile.layout=org.apache.log4j.PatternLayout +log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %F %p %m%n + +########################## +# 对不同的类输出不同的日志文件 +########################## \ No newline at end of file diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml new file mode 100644 index 00000000..0319ca9a --- /dev/null +++ b/src/main/resources/logback-spring.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + + + INFO + + ACCEPT + + ACCEPT + + + + + ${LOG_HOME}/${LOG_HOME_SYSTEM}/${PROJECT_NAME}.workflow_all.%d{yyyy-MM-dd}.%i.log + + 70 + + 100MB + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + ERROR + ACCEPT + DENY + + + + ${LOG_HOME}/${LOG_HOME_SYSTEM}/${PROJECT_NAME}.workflow_error.%d{yyyy-MM-dd}.%i.log + + 30 + + 100MB + + + + + [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n + UTF-8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/category/CategoryMapper.xml b/src/main/resources/mapper/category/CategoryMapper.xml new file mode 100644 index 00000000..bd8fa3bb --- /dev/null +++ b/src/main/resources/mapper/category/CategoryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/datas/BusProcessEntrustMapper.xml b/src/main/resources/mapper/datas/BusProcessEntrustMapper.xml new file mode 100644 index 00000000..82c31454 --- /dev/null +++ b/src/main/resources/mapper/datas/BusProcessEntrustMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/datas/BusProcessMapper.xml b/src/main/resources/mapper/datas/BusProcessMapper.xml new file mode 100644 index 00000000..687e2535 --- /dev/null +++ b/src/main/resources/mapper/datas/BusProcessMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/datas/BusProcessNameMapper.xml b/src/main/resources/mapper/datas/BusProcessNameMapper.xml new file mode 100644 index 00000000..492b07f8 --- /dev/null +++ b/src/main/resources/mapper/datas/BusProcessNameMapper.xml @@ -0,0 +1,32 @@ + + + + + + diff --git a/src/main/resources/mapper/datas/BusProcessNewMapper.xml b/src/main/resources/mapper/datas/BusProcessNewMapper.xml new file mode 100644 index 00000000..de0bff7c --- /dev/null +++ b/src/main/resources/mapper/datas/BusProcessNewMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + diff --git a/src/main/resources/mapper/datas/DatasMapper.xml b/src/main/resources/mapper/datas/DatasMapper.xml new file mode 100644 index 00000000..d1a63a92 --- /dev/null +++ b/src/main/resources/mapper/datas/DatasMapper.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/main/resources/mapper/datas/HiDatasMapper.xml b/src/main/resources/mapper/datas/HiDatasMapper.xml new file mode 100644 index 00000000..3ab529f7 --- /dev/null +++ b/src/main/resources/mapper/datas/HiDatasMapper.xml @@ -0,0 +1,7 @@ + + + + + delete t1 from t_hi_datas t1 left join t_datas t2 on t1.DATAS_ID=t2.OBJECT_ID where t2.ACTI_PROC_INST_ID=#{processInstanceId} + + diff --git a/src/main/resources/mapper/delegate/DelegateMapper.xml b/src/main/resources/mapper/delegate/DelegateMapper.xml new file mode 100644 index 00000000..fff61bb7 --- /dev/null +++ b/src/main/resources/mapper/delegate/DelegateMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/delegate_business/DelegateBusinessMapper.xml b/src/main/resources/mapper/delegate_business/DelegateBusinessMapper.xml new file mode 100644 index 00000000..7e4a7088 --- /dev/null +++ b/src/main/resources/mapper/delegate_business/DelegateBusinessMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/file/FileMapper.xml b/src/main/resources/mapper/file/FileMapper.xml new file mode 100644 index 00000000..01b3884f --- /dev/null +++ b/src/main/resources/mapper/file/FileMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/form/FormAccessoryMapper.xml b/src/main/resources/mapper/form/FormAccessoryMapper.xml new file mode 100644 index 00000000..45d09110 --- /dev/null +++ b/src/main/resources/mapper/form/FormAccessoryMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/form/FormMapper.xml b/src/main/resources/mapper/form/FormMapper.xml new file mode 100644 index 00000000..3635fb21 --- /dev/null +++ b/src/main/resources/mapper/form/FormMapper.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/src/main/resources/mapper/form/FormVariableMapper.xml b/src/main/resources/mapper/form/FormVariableMapper.xml new file mode 100644 index 00000000..d20378ea --- /dev/null +++ b/src/main/resources/mapper/form/FormVariableMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/mapper/system/SystemMapper.xml b/src/main/resources/mapper/system/SystemMapper.xml new file mode 100644 index 00000000..56253dcb --- /dev/null +++ b/src/main/resources/mapper/system/SystemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/src/main/resources/models/form/form-read.html b/src/main/resources/models/form/form-read.html new file mode 100644 index 00000000..b6059b78 --- /dev/null +++ b/src/main/resources/models/form/form-read.html @@ -0,0 +1,95 @@ + + + + + + + + 表单阅读 + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + \ No newline at end of file diff --git a/src/main/resources/models/form/form.html b/src/main/resources/models/form/form.html new file mode 100644 index 00000000..e6cc92b3 --- /dev/null +++ b/src/main/resources/models/form/form.html @@ -0,0 +1,154 @@ + + + + + + + + 表单提交 + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    + + + + \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/images/bg.png b/src/main/resources/static/diagram-viewer/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..42c4a829f2d0b434878bc20c9b4d062258b83c7c GIT binary patch literal 3383 zcmV-74ao9|P)GJaO>gww8@$u{H>+J08@bK{M?d|XH@9ysI-xTdE0000P zbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU;ok>JNRCwCWTv>J;M-t1T zlo=bA``>mxWP4;;61$pgKOcbXSGgb%03z2JtK#jl0vV)BW$X0hbPrDyeW)ofrCq_* z=orvRO9xeBgR+X{J)w?b&pyb2hXLf9Sr*$vZwio4%ST(Y`*MogJ=vEzXVDC+OkNyM zU>K7_7o^me*4kz7Hi@gn?y=br`4&qSF*(VWE$m80X)bHXZOCH5ol=8MN^+E_M1A3= zsWcefHOx9(d*0T@9PKb%{;DkRDo*Z3}))I>8~hi z9M^F4wZhqqCat{}C)Go`gXUnS6Tuc#2Ctru%Wk;{gK@eNX4^3~t^@|Nr}tVmX4VY7 zZJpGpftnsDKzS^gb~lTG@_U8JGyzwq(~%Su@bGMq&`~CZ-Q(FDkcpaH0pE^7!)D;fRoDBvec2 zL1wCFn%i<40=-g@(ya(O`b}qwsk+28xk`lc(B;xFbuhzKGa@|Z&hhx#aw+|VDxGyG zwR}8B2M?WRjK3tvD_6)df-~AvNzzN2vn$GeL zN!56;{(__BcC_IsiFQH&<%`r9YM19=)(7C|VUS$7k3+B7x4)gH^$jQPpx0w1>SO4& zipDf}Li9-D>AHyNu?q9W=GUy@j5(>@B`SRU{UNU7}p9LHMG&O_5egxdyOX6vA0Kz18C{s0ulnv@e&5D(fReS*Uaex zd==HL)7`cslG<4Vl2gFhGBPxD8P)+6#W9+cMksQOEpLfQ%Lz}9*P1So(%!|yrtEJu zTEtkUP0Qgw@v1v4#Xe%#ba~nYRhaEdtJ{MlvXWhngkt(&5rc|SU$GnUX6Zy}UjmG5 zv%0EvWRhGmsN7_PhuOAMM$Cda}2gjD4exK$Xx|MOQB#$OSh-_Wo>%jpwE{$U!n?gQ~{j_vAk2sg^ZdX!}SzgWMFWPMkx zS6WU^OoDSLlc=UxwjvYb*0>@^mXyOf_CcyvuO5g{hFFG6pncj~WnUibR2wVH(LH@( zr<^C1O6503e2J`JwWg$~uC+C`z1Wkg@^a+KYmk++CeW!NCe0m`-ZZ75M77aXuAZ@n z@F|@P^o6Mb`KBCGX?Zff0cJ>9(Z`lc##qNS-=LBk%XrjM`cx?8PO zfJw_SIB%w4RDn3gT&%gi2!l}BPm4S22~@dD(4J^07yD{MXz3D~MFe#^MoCEF;T$l| z5GVYG+imztY1_|wHZ6)-3cLeBCIcKn*@K=sCBzYN4;HxN(xD6YjS$7 zD29ZK=%zO`nyGs3H{Lk>&Q83t1nloXcz%zc_$o?qt_yd7v5FXdKiWC9lu`nZI)%p72Ci zO=r6RF}C33TKDhb>r0Ql?l&(lS13bXxBD^u3;kHFKc$<;1*JM9H7^yE*53*7BmKrl z3GpK|{l6-Jdl~Gn6j>Gt_#IvCZfS??ju_;{K=x2*S8Ey`bIRn2otiY;WO@CR>A6{> znZ?G;Oiy03?Xc&364U!F|6FpI?L!h5JTn?uJ6+X~a0*@0G8w6z>q;86s4BkgaN+1Q zDuBz1%PsM6rhC$yBqoYAiA}evPN73%7x$pEFiaq;xpHt3i?Vt+92V+}qV}j)su+0V z5YxvJQCty*@6+txE`GKcSBeR9Y&oHIU)ldOX8aqzzJ4Oby>rJ}(3U$*NPu0RE)cH! zU-K`}tz6$(_78ewAF}Kp^vKqDCeFbGnB51ow$ld`A!e#uDXwsN$a>71zn>Ur1-(w- z8_B-gpFiL@>Wg5_0lGWYi~>dsWN&{ZU>|K=U0hoX<%Et8Kku zCYzM3T{_dEluDr6eaUa4dbE7618av+4kRkA|aR@G2GoDg^Sx6ZRMw>usEV?jZe*-2+Chd8foNZQ|_Yb$QEQ3)_gr2C|nRc_OMK< zOpc@1eMR9@rI}v{M(e&*d^`N|L@8SLMg1Q*w0ak6K36bV_j87nOg2=U%`5s4jvB8w z9nuUpb2*r>3icH>wlo;+DFBU2T>NGFaozu-UvvfcdzIg;^SXaHUXqOZp%AV6dcvop z!A~%1-S5Re5+rz3Ay_{MOAqJ~ANaM0*I?ZT?00PDC(Q5mw=zvbTUO6{m^l0u&Uztn z_>0c08(qF!IU6tS^8e5t)_v#gH38Valm2yot#94*C-uzrgk<;OywUp?cl}h1`>jOy z6QAwA`}dASxbEv^{z?>l5{xmr>QH=>ok=UZ>9OdwF-8W-aF8hP*zy=>4rv?oPgT5i zzg#?vMRyQ#ZM(@kEAZVtega)KAY1nC@eWNPK+Nh92eL52x)=MIa=$wEvo&74oqKwu zS-&qKWLe{r>7ccKGN18I?)vTiXwdE4^?Jgh|BNj4I}*cs-~9g(lpg%gABrTb`{47E ztM>yStownAPu;Cwtm(Q1zTZm1Q{R7YSJqD?nRh((PmyHa5sKFR^xTIUzz5sXbzi`{ z1#(ZucGrD<^L0~+|8I8J{UJ#9ES)zYh;T}CT!KDRoLKj>0xyg|{MDtd`|0eP6Od0G zzNOoPKIdN;^jY_ltS_4j`R?o2eFywQ@cm#>c_Q-uD(d$=Azk-_zb{sEO~LDaHtkiy z>7Kd!k^>5>;5$M z=cgY2$@bU%ll$Abw@>mt*L|trvxCAv6EN2OcM4uvqW>fg>(2DeH(B&aD7poZ>wbvt z-Qn0zn95jB7)39&RlcFudO}XPGm-k_&0P1{?@Q16A2)E_ucj$^ z82jVpXx(>8UIPh#2dY2vQg>2ZcV1X|HpR8>&&WN&fp4SPx_`@GGk5;Obl-jV_C5Ri zGurHRKU(p4vi=tj&O9)Sv+f&#AGDz#GN+zUe?AaZezf{=?PosrnA~H_ zy5{!0xBrEC@Biu}YWHIuA9YqAk*3#uvh=~6%0pWFx<3p0+5XN?U8no6I=t|4#lPs? zy59;vB`VyMI@S|L$;*R3+v_*)QT&3ce(HM^zd+4(Ur%`*%lbd}`yYU6!4R&SI79#d N002ovPDHLkV1kqr$Rz*( literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/breadcrumbs.png b/src/main/resources/static/diagram-viewer/images/breadcrumbs.png new file mode 100644 index 0000000000000000000000000000000000000000..f70c2d43ab33329ce02bb8445572b5ea2f488818 GIT binary patch literal 580 zcmeAS@N?(olHy`uVBq!ia0vp^f!3-qDq?+7-lw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqKyGQA+G=a{rmCr=jSh94jw-C`}gl7$4-9u`0>=4^XD&I z{`2S0;iD(6-MD%A%C$3RFT8pC?%DGf-@bi+_~^;K`wyNzdw%lt*;}{o9zS{J`HPn) zPMtk)=;-S=Z*ShZ^YZ2E<0npExOn-=lV^{gJiU7T=Gk)>-@bc)|G}d>ckdrLcH-QH zOOGBudGPSj&!4~EzyEOT#HqXY9^ANj`^S$Tr%s>y`t94RSFbN$y?*-a`S0JqfBO9S z;iJcY|Ngyt?Z*HA{}rb3pZ@Fh)5yqO;gh;x9(NtS z6wh=nDRcbzSz^)cD1}}2OG_SdE^>DLId7Xl?mJtTdb24jJQS+_>IkgNSD3YfZ_(_Y zN6y?AU3a9`MS6DLwcputB9vcJed8zdSyQ(Q*~hTwtKRROQ8F!2y0iQ3u_u2Squ-YA zoO*8U#B=jF^}6`A?Y?9<&0M709-1UQ)xSUEuE3tDH@0ruTQqOsLv_7vLZZxiOJ_X~ miwoyv^3sk=m2#|Om0(Cy*>QBGt`j@Zw+x=HelF{r5}E*P$z3`C literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/checker-bg.png b/src/main/resources/static/diagram-viewer/images/checker-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a23232d93846c619b78a6775804f303f304e26ec GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnL3?x0byx0z;7>k44ofy`glX(f`um$*pxPJfs z{r~^}KCeaefg&QFE{-7_*OL(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-JV``BRCwC#*})BiFbn`dI|?K4;>#Z0fKfUOqp$&c@a4q_Af=yzqDlcf2_dQM zS0!q3N*xDWG{!)Qp`g$ZxWEOTY3Tg}4ofk8(R4MIzv4&ClYyq)vXjn}hNeX~ylFSn z)m3h89AE{2>VLZm_9I|FKD){%1}EISUq|v&XxqW+<4@tQ(4-nqji;c=n==)jie`0{ zyYU<}yB*$z=c2v(cx=26+WP>Ch4)1Vot&Zg5OlO7pNo%CW-8XtOvU)-MS=g`oQm+x zivoAm<`u#>&*|7FS=OuD>UtihY^XB;CC~L89G2sGob~EP?Exxl| z>=jRm=B&KR3C+Q)+|X3K_UQnr@wXlMxeSE#cZQMUKnTtTLTC?OvIz@abg7{Hc_nax g3tZp=e2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4wVBWazv-`QBQm>I{VmwmKKjdu literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/error_catch.png b/src/main/resources/static/diagram-viewer/images/deployer/error_catch.png new file mode 100644 index 0000000000000000000000000000000000000000..0a33f08c8080056813b48166843708f20de3e558 GIT binary patch literal 1307 zcmV+$1?2jPP)W(qu^|iwRq&W}TV* z_Aqm1k9Y3;Ke;UJ4-U+nd(P*4=FYk2{O-LPNj!}4*n<|xHy(+fcRUh5?@%JHX_`&b zw6`@)dtKAC^EnwL3oZa|0ARd~s$ga+TA}N>rfC-d_yJhsReu4fCwZqJaE4IvxAx$^ zGyq%xFsp!@J`_xouW^5x$mK;v)3D62zCfr$h!z(Yv%9-n7T*J4DS%x9;4=Ub0M}HD zPYThlt}X@w0orUfS^k{@*dI%r4Q1j0OaKl9e0h19B!0L!s&F%gRbVtec9l8X;dk`D8OT5W0YfSYl}riMe@M?Su&poa8D=wyCdf+}z~x z@o|!PI2>kueZ4Go3qVkOZ*Fd;-|uHhNr~L1UZwag0iK$gN{EF*A-1%%5CH9VI}Z*H zlH|Q!ui-qdt*vDs5a8_WtX#jD(Ip4zS^+kj&Gh^IB*|zr%8rhXGcui>orY7Ux3~99 zyNZg6#2(Pl&>$asO{I7up>nxg37LU`0mC!7u&|IMet3Au^73*5v21d6b(JLP^ZDey ze*?IvL>#(=YH@LqBsnrNq8Hv3pR22@d31D?B)_w>!}0NPZftBM>V}4fWX4BXIb|uH zNT{l+su+nxI6XbBm;Mm39q<=XH#j(GIA!EGIXPivWu?ryqEdW8fQN^NIX5?_mtI1A zV*$`1>NQQH*XvCyK0iM%bAAS5_rV2=LzhrZOia*ZGRcE|1)x;d=M!<<;cze%3Z)cp zZ*P}bZ)GE$t@yA2mz9;Vw6s(n=vx3*gFcr4{2|)u(_Rt#`}^`qI0f*8N^zsCjR1Z` zip(wE?^SvE^!a>A;<_DmC0pr?;*b(5UAY6mp2d$|5q%mP8_(P&k)*@nkeRQj6u)U8 z{X2lVtl+>?@pYL1I5RVokX~C`lbL@a#bbz^#i2{6;^i(3?*B5#kBa^li-o(pyCg}s z+bwgi=fcb+-mjCsm+cy>%!P zYm=pK=fzAj*f$bP)K~!jg?U_wT6;Tv`znc%rOoG4=f+(U8+eOe1v~it9M2n!s zLuj8RZfjLRv}qA(fh`iEMK5YqV393q5fVhwA}XXZ3WDrUvOF!`JRFCa`_G8vfdh|u z=YI3O`|iw~nNcFbVvJ=AE#MnV;$_E@c-av}Tq)J2lsc`HI;NB=XEH=2IDtVxlI)Mc zG^GkXk1M5GfJvY=+4KYG6p@J_upwgnt%sPC2512;MBwTp!ZLZp+%ie$zDUckId^*? zbW4G>0B?bn0qo_#9bg9Ni!FXeBQC(%0QPW-^EjF~&;)!ii2nw*dazGsI2U7z?=?s_ z@}VR5a1LX8O!1nfxByj4=5Am*Gxm9It*7+bWEt3se*)GRm>ZM2?AYTm#rqtj8#$=q ztp;8c93yQp#m7CwXMtTgtO{_iU`(yh!9#kdhjb&K0Zkd+B~5*IO!3PB;sW%hSiPFM zk3c1gIQ2ecDp33zuny=3{%Y#ZXi5CH;+Pw%2f&KVm>Ztrr>xI#7UCx~J9-MV=8S0vzBo$H0vlqA=XGrY zyriIWOUCs$ijUYz8^tMZs3w5*7C(B#LHtNe@w|rWGtgmqP;UZ$T1bDT;4y@=IQb3L z6gl^Q2Kjyq@c|d6NxYhYPh)wG&2TEfm_d9;O!4&k`~w_tg{N5C5=Nf%xDQj;tE@_W zJ}M$LO|3RWWDGc8@b!={R5we*z(L=c&hVOnSInR78KB*Z7emTHzAGbs+m}`9s}vEr z4_rxY8t`QWKiGHPVf|H06?iWqcfC1fi^q!p`>oqT#G)1d2V(uTusIOVa{vGU07*qo IM6N<$f-YxoF8}}l literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/manual.png b/src/main/resources/static/diagram-viewer/images/deployer/manual.png new file mode 100644 index 0000000000000000000000000000000000000000..7aa3b85300b3bdca540a4b5a5af42f7e42ec9583 GIT binary patch literal 3319 zcmVOz@Z0f2-7z;ux~O9+4z06=<WDR*FRcSTFz- zW=q650N5=6FiBTtNC2?60Km==3$g$R3;-}uh=nNt1bYBr$Ri_o0EC$U6h`t_Jn<{8 z5a%iY0C<_QJh>z}MS)ugEpZ1|S1ukX&Pf+56gFW3VVXcL!g-k)GJ!M?;PcD?0HBc- z5#WRK{dmp}uFlRjj{U%*%WZ25jX z{P*?XzTzZ-GF^d31o+^>%=Ap99M6&ogks$0k4OBs3;+Bb(;~!4V!2o<6ys46agIcq zjPo+3B8fthDa9qy|77CdEc*jK-!%ZRYCZvbku9iQV*~a}ClFY4z~c7+0P?$U!PF=S z1Au6Q;m>#f??3%Vpd|o+W=WE9003S@Bra6Svp>fO002awfhw>;8}z{#EWidF!3EsG z3;bXU&9EIRU@z1_9W=mEXoiz;4lcq~xDGvV5BgyU zp1~-*fe8db$Osc*A=-!mVv1NJjtCc-h4>-CNCXm#Bp}I%6j35eku^v$Qi@a{RY)E3 zJ#qp$hg?Rwkvqr$GJ^buyhkyVfwECO)C{#lxu`c9ghrwZ&}4KmnvWKso6vH!8a<3Q zq36)6Xb;+tK10Vaz~~qUGsJ8#F2=(`u{bOVlVi)VBCHIn#u~6ztOL7=^<&SmcLWlF zMZgI*1b0FpVIDz9SWH+>*hr`#93(Um+6gxa1B6k+CnA%mOSC4s5&6UzVlpv@SV$}* z))J2sFA#f(L&P^E5{W}HC%KRUNwK6<(h|}}(r!{C=`5+6G)NjFlgZj-YqAG9lq?`C z$c5yc>d>VnA`E_*3F2Qp##d8RZb=H01_mm@+|Cqnc9PsG(F5HIG_C zt)aG3uTh7n6Et<2In9F>NlT@zqLtGcXcuVrX|L#Xx)I%#9!{6gSJKPrN9dR61N3(c z4Tcqi$B1Vr8Jidf7-t!G7_XR2rWwr)$3XQ?}=hpK0&Z&W{| zep&sA23f;Q!%st`QJ}G3cbou<7-yIK2z4nfCCCtN2-XOGSWo##{8Q{ATurxr~;I`ytDs%xbip}RzP zziy}Qn4Z2~fSycmr`~zJ=lUFdFa1>gZThG6M+{g7vkW8#+YHVaJjFF}Z#*3@$J_By zLtVo_L#1JrVVB{Ak-5=4qt!-@Mh}c>#$4kh<88)m#-k<%CLtzEP3leVno>={htGUuD;o7bD)w_sX$S}eAxwzy?UvgBH(S?;#HZiQMoS*2K2 zT3xe7t(~nU*1N5{rxB;QPLocnp4Ml>u<^FZwyC!nu;thW+pe~4wtZn|Vi#w(#jeBd zlf9FDx_yoPJqHbk*$%56S{;6Kv~mM9!g3B(KJ}#RZ#@)!hR|78Dq|Iq-afF%KE1Brn_fm;Im z_u$xr8UFki1L{Ox>G0o)(&RAZ;=|I=wN2l97;cLaHH6leTB-XXa*h%dBOEvi`+x zi?=Txl?TadvyiL>SuF~-LZ;|cS}4~l2eM~nS7yJ>iOM;atDY;(?aZ^v+mJV$@1Ote z62cPUlD4IWOIIx&SmwQ~YB{nzae3Pc;}r!fhE@iwJh+OsDs9zItL;~pu715HdQEGA zUct(O!LkCy1<%NCg+}G`0PgpNm-?d@-hMgNe6^V+j6x$b<6@S<$+<4_1hi}Ti zncS4LsjI}fWY1>OX6feMEuLErma3QLmkw?X+1j)X-&VBk_4Y;EFPF_I+q;9dL%E~B zJh;4Nr^(LEJ3myURP{Rblsw%57T)g973R8o)DE9*xN#~;4_o$q%o z4K@u`jhx2fBXC4{U8Qn{*%*B$Ge=nny$HAYq{=vy|sI0 z_vss+H_qMky?OB#|JK!>IX&II^LlUh#rO5!7TtbwC;iULyV-Xq?ybB}ykGP{?LpZ? z-G|jbTmIbG@7#ZCz;~eY(cDM(28Dyq{*m>M4?_iynUBkc4TkHUI6gT!;y-fz>HMcd z&t%Ugo)`Y2{>!cx7B7DI)$7;J(U{Spm-3gBzioV_{p!H$8L!*M!p0uH$#^p{Ui4P` z?ZJ24cOCDe-w#jZd?0@)|7iKK^;6KN`;!@ylm7$*nDhK&GcDTy000JJOGiWi{{a60 z|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RV3=a=890}AG`~Uy~DM>^@ zR5;7ElQBqJQ5c24`|iE(B`?t;R=e2HLAn_*bhD*{I9gCBWOm3@2^DW!_VqSacfX0!Rx zIrjpf9>;NSVPQee&d#LU?MkoLlO#!GI2=lrWs;_;42MIx*8cv!0Da)8+TPy&Fh4*4 zYG!5zYb{!9j4>Evh@yz2qa(Jqws6kjy(gE;F*Y_v9LF>ojbEzWZa-H_eGYNTK#F9b6o(fH6nudo+ye4!w`UezfZkhr`2k4 z?X%XBBnfGn?ij6gM?}1c=q$?+5k{jC&N-ZOSZmqX*dPo;M1&v+u+~zm)i^jfxNDA& zj|Y>JlX&m3)-o|MK@bFZ@A2N#ZnxRo+(c_l5Cnu_$ocs>CnqQ0fY(YX^~74+5Rpu4 z9ZgM5-CJ8*QFMdeeQ2$@xVT_27_h#+&f($VGO(k7;A*=5Y8Q`ys@D2hp-?Eq zaU2mO8y{z`ef;R^r&002ovPDHLkV1fu4 BI)MNH literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/message_catch.png b/src/main/resources/static/diagram-viewer/images/deployer/message_catch.png new file mode 100644 index 0000000000000000000000000000000000000000..6ac06bb1135f5fcce17c6cc25baed2f050732e61 GIT binary patch literal 410 zcmV;L0cHM)P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-AW1|)RCwC#*})FOAP4|ZG4?Y!`Tw8f$ z$M9~`Fu1`Dt~A1R5o6q@E~b=V{~f;~=Ufo+)CSEt2SkJ_91+iy(xD9=V|+R1j{mJH z0N?;%DXwLx!mq>ED*Scd+99x+Dy#5MXi|><8c#u!U(R3Qspzh%G8^B6?kAe#yX4YQVtoDuIE)Y6b&?c>bjLqi#U8Up-wMLn>~)xf#gU zY{0>mkWn?^?Z5V0d57Yrr5a|ldg<<(?=Jjky4OOjZjQNzTysqr*kuY1Fsdsp+O_w< znf^5qf;-J0zTcr*V!uB2v69p3^M$wnpnDjRDQ8xV*XM0DUqF3XQFz{^;!1q z-6{6)EO+DftYZF$XM^{9^yFxyy_@&Kr1BxN$8FZC9Vhfc)3@m5cW+)()9KdVR`%3e zZ3}DsriEL7NX0HU{&4-D!k5?5ZpRY-crk*U%`WqyzF|KbgND`$3q^)jU;r^Nc)I$z JtaD0e0syk7j{E=s literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/receive.png b/src/main/resources/static/diagram-viewer/images/deployer/receive.png new file mode 100644 index 0000000000000000000000000000000000000000..dd2d1c12074ca922620223b8344e70ae5b9bb543 GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4@SQ(o;!k(e4h3Mb|s-CB!YcxNmmtwkJ8u4@J>8XAyW-_*0VBPiwc>#?sZMB1Y3w` z_FKa9!1r9{n8YWW|1TuB=PG*&xja$* jkt=`a-H`|P>mLjADz05FlbmJ%^dN($tDnm{r-UW|c7le) literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/script.png b/src/main/resources/static/diagram-viewer/images/deployer/script.png new file mode 100644 index 0000000000000000000000000000000000000000..febac1d5be2e28efda105e433870d9e6c2449154 GIT binary patch literal 601 zcmV-f0;c_mP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ign| z4>S(7Eb(&y00G%aL_t(I%bk-ys~SNR#ecfHs0*uNm%>V$6e&cDd;wFWPGgbcRS!}m zUA{o9EmDOPX@#VCAbB4kAecf6!BVgg@gMjH+1+u~y(x4S3FPG^2ZrG?bIv_?=3Y3% z1ik_Cugkm$d;ng}W-~0y0w5NP@jDKO17R347!0UZs{k(mo&&PkY~(ReO6lzHwXigs zO_@w4f3-Ut4yD)Y>DU5@0WuzsNvG4SRx2JtCX*qT%K>}@-bD`X?(XEVxMcr+E&Lh~ z5s`ks|6mEz=~PCek&d6~64Jo7+wD>)6mVVlY)gc5!t;-a2$p4$NF-=98r19c^U=k{ zE$~SbPNx&cGS6pKZG+v{%mQZAQo+U+(0-lVHmPlEEo(1)M_=%t2?7! zuSYx{$M^k+pvgfHpp-%>g<%+Ev)O0{05A;WO{G#{u~?AL=l|FXolb}2@yKK{!8FaC zF5x9`@47CwZR7iX^b`6~gCJnP-=maby2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4E8|gZoC-Yqq|(_J8(v;%|Khu@4%DtsQ19Tk|?=+O=N=`z~$I{oVE8_rJH%yVn_4 zGr#yfPl2P(bbGG1L|ZyTLx+It#ictlrCgpYkY(t5te~XgS!8s*w70{+_p&L&fzLKB zEjH(S!$L)snx0pxZ(w~hUw6m4(*`^lYd7Z3w&?TSk{Wp-Dp-WoOY?FQ-+s5j0Tz0>%9U$c>;aR;OXk;vd$@?2>?^1 Bkg)&& literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/service.png b/src/main/resources/static/diagram-viewer/images/deployer/service.png new file mode 100644 index 0000000000000000000000000000000000000000..2c21f0f3b7e30c82f88c1923ac13029190e0baa0 GIT binary patch literal 1445 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m=!WZB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxKsVXI%s|1+P|wiV z#N6CmN5ROz&_Lh7NZ-&%*U;R`*vQJjKmiJrfVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8EkR}&8R-I5=oVMzl_XZ^<`pZ$OmImpPAEg{v+u2}(t{7puX=A(aKG z`a!A1`K3k4z=%sz23b{L$o& z6x?nx!Kqgt=oo!av?4__ObD2EKuma|1#;lYJ~a=R){B6Ndf9J}{|pRF(w;7kAr-fB zg8Vy#3Pt|yMg?6dg-M}!_6E$k*@dOzwxj!XPC`)-KgTZn#ob%#QhZ^S{B(`qqg4;UVZgw zlHisQt%owbZrx3F`}z0n{@s@v$*}$Q-?^zvH*a3McKL$6_pVQ#%;~WFa-=6$`(dfx zw#QTC7GLE5we?{Eht*ua#?@D~YKzy#=&1{FuD;sU61Mv8&C11>?-p3d_$?PU&dJ{& zvP(#*E6GOAUv0AYN0rGZH|Vf8yv*F}p~7@4Z@V>*v)*wRi`bk7f!SxxW}nqy{ZL`E zW62c1O>OCaf0<78Dy{j$D)FF5-|P6}`3%z1uMZ{^1it)97o8hm%X4_n{L^2n_6BJ9sGVY18R9i@iN@^qqe%yEYdmw!)cND|>fz$! zYLic9m?*ve{4?xYgVqeE_1EPMZU2>cy*_^Ez5iP0S1W4l_~rj3+vy0#SA6?(^e?+V zL(;|@XQQ|G-#RmQ_jilF-~G{n6HY(Pc<;9O;CXYmx!bpBJ#uPbWLWX)z(-THm<@Wt~$(695z5BwPRh literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/signal_catch.png b/src/main/resources/static/diagram-viewer/images/deployer/signal_catch.png new file mode 100644 index 0000000000000000000000000000000000000000..3991897e2437fd742976cd40963a56e1c0ebd524 GIT binary patch literal 953 zcmV;q14jIbP);mRx!qG1zrIK*6HWKArXl?)#Juixx`8|z(Jtd(H4id$ZlYfUt6TSyxiU{AAlW> zbvX>buh6oxGKof`QdCrA<8N&^IB-mX#uynL9TgFg{{DU&{tY;=Vc`7ytUOa-Lqmhu zsjRHD@sBnV{Jg@lv$JJpW@ZI^e0*GdKA(+0m3BA~0NyLAv$InYrMbD;hQ9{3q#J%y zLB++zvb4065FUv{BoGML_={h)HK8>%H8nQ=v6t{x zEe-?%5{X3C1rLYA;`jS){At(WKrS$+rJ+!0U1&{PTbm7k3uL(s@6y6xFetHDEGhW> z{JiAl<=ObFuEBv4U|Gus2M3cvYr4C;ZTKQk=oWlfi>j-uQ$mY~#N%-(EiJY2_Z)`< zwOZi!`z0I>rwkVn85tR|;Q}0W3=U)hZ*+KTYpWw@OT(pV>FDUN;j_T@RN;4ZU`a`dEH5v+0*^+cQczG} z<8LGl2aW*Wb=dImuq$XyUtgaM{|f9|Hykj)6CG4rTk9%XQ&CZ2;~yjgKdS>WGc#ps zYRVJ%*w~mDV{H71HN$~zz&pLUy}jKNw5F-4$%elGGS&*et~ciA=gY#vf~WA=*;&cS z$+7VlRvR-|6=TdEpiPe(8ylINoLqgG>#47=r>Cb!53d?y`b6a8?+X$A5$RC*@)a?SnsFGaF+L0e66G4^jWh3~)t6#`T2b@5jB$=ATzyXA|yqHsN09 bzlHw*a_xEXu*?mB00000NkvXXu0mjfFqWya literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/images/deployer/signal_throw.png b/src/main/resources/static/diagram-viewer/images/deployer/signal_throw.png new file mode 100644 index 0000000000000000000000000000000000000000..29a16376766da595d0a080079fa23146e65d05da GIT binary patch literal 687 zcmV;g0#N;lP)D=qA7 zv=Tuq7s0|tLGXegD59TW8$W;_z{1KxEEKPWg(zC6u!#3{EW&{-#?8se5ZBmD-bsv&qQMZ~gReRj{lBVrEo5pkg>0V$>I#!;ju@6VkPxlfgd zSc&J@)HM7E(ly?8uRqrQ#7Wf*U2Kj^cWb%v{wzp?$TReW>rpVMMIK3#{*8*-Pw9 zDgCILn`5h-(-|~OVz!&mt|}f8Q+SLjcanKbrIg-R$?mq|*HnXsFlJ%%p4Hyb#X<5f-I4=~b>scdte#+H(E zyVVSix1Cj@+8gm%J=HG!4rAR`{0df;n3q!$R-0tV&K~$7QdQ9ogF{N+mlvBMyasiL=fK zKQhY5{(pSAyVsr9>wBNi^Lf9Y_wzgw%uI9{5j+S8f*AGnbS%KD=GlXm8a(5@e5b(+ z%+Eqs3#uLBTLEvVT?}<~pwqLTqPEI(@ChAO&)yG$=-JO6Feo<<2|lFp*Ehz{OfWDr z%kV3_)MJJqB(1*AHLIYBZii5;m38iEK4~vtX5C+WijGb{Rx@5mn4FrOm?W$BI~hH{ zJb*4OwZUXqP`G@zNwBv3;NVbON?cDyQ)bYv>uEK_R^Qa6;ijsA%Q5wEQF>z7`ShIP z7q015UO8@kyrF*ByBoOcUwLKrSxYFsnd0My`s4PQy>Q3aI#yDH5lejAZ@qc*{OqzYWB0ACX_S}R5=&ZbZ{B>2-T$*# zI9l*=@*%y=E4wE$4h>;4OYRXX)B<6fuq@e|k|zQQI(J)IS_<_purbFHoC75@Bb|}p zP5kvzy>g4mdg<%Yl(-TUR+;ac;?pbnCKY%|4$PAh)EjSJJiY=tatIFI|8eQw4_Y*T z=$f3`>CxX)4QMiC_4Nylh^yf{HMe1qNr76hhmX%jLve9&@MkBMR6Y1sP#&pa5W>k( zW6U8<7Lz1Drk)p#Lr6+j2BtVl+3chiN7-LnK}B9XlMnW&vWYtjv5dU8sBvz@tm5)= zD$+-v(@&H|jg83p`FRNU?AbF18fxlW+}zv}3dZb-C0L9(l2u2i8jq+PrOPH#SzD8_ z%JR@#Y5Hm_MBg1Y@C<(Q{@(uvM`AD-b~iUS=30l3>w?f^@KS!z@y^(3APgldOARHb zq_~b&7$>^f`{YzKjgYZ8xgKuU(bgNus*zGv~F5TjM>a{3oyQb)XwFj7E3 z7me)t`4idG)AL;KLf2I|+?4^3ubpc0TWZ%7gnE8niozO0;0ExhYfuL$q6o&>@DdmV zaB8kCEh(W`TwFw5yr?V4f*W1Q)2dp7SyX43F=Nc5*F8uS1T+f+wVb?sWO1<&10$ml ze~PyCcLr*7&-Bj^_r~(aJx-FK=SmZAoV7KU!ek+#b;!)#K4JWwhwG15_JT}bVh0tC zUsTYM8l3GpA%IZpzqur|F+1<&`(;{WU#sD3NLQW-;Q73!OJQH!{B|WipEiI!_jx^zm7;`f_yLc-}QO$NNnPMnUB`S&QqI;Fj z0qgG=u3Kog8}->Cm*z+l6Onm-m9I8FeE4AZ#t9}VDcON!w>e!Kf2SOAqQ=9^`&lIp zkMErGAVsE&o4TxwlrOKWT$9hy@%EOw5H(t@>EJ+;fWjxf)k{xe35=e1?`pZZl?#4BGei@d z2l76L4244B2xOM)DapANUPxYE(3oR41JD2ZT9{H$!0$Y@c!)qC%&e>~ z;BqeA<8*n8OzSH%i|g+;u&Bd4ct{cmiHzEs!w4MTkG>I)UW z3MkEm#zG^dS7hjtyu7fXR#AC*`P{#)`MSg7@C$4SD=@%Yp7-wEgEsF8U(Gado^A~W zTa299;Oa6pF+mImsOE2mw1K`v^7CKU*Qe7eW&zCyc9C%{qjq(9b(JvJog{}wLxo>y zFy^y6A>Hc!8o|+{m8Pz{YvY|C(k8fLVK>KOJm}yQpx{JAL;zTDEkkgPZO!+7y*6gzk}H7qN^LD|45SAe(3LSg>2p0^7YIWn*^AGRWzMphPLP9!z{n?~VR@nk+%h6f*cb1SZya|EgJJHr#u zBda|<*Bc#W-@ku9+r#UlV{dOyP1b3}=B?EdL{0pZm^bO6r#VsANzMu zskEpFXBF!=^fvtXfD0%l+Bi+jMfo`0j7>4Ji+57 zC;dl_wGbms1`gozMRD}Qag9Et02=%Iql%!XMH$YyGE`d`{9B5QjFjlA!6#Zt#^mPm zc;-?=Rd{^AU;&ffiflD2>$R;&(D#5iPL2Y_eqYrA>R^oBr4c4vI5G1@{4#aVLHK1lnk%E85sH9$&l4otADShG78sZEf`m%zqfWMd;6zdh61S zu*=FM8-F2~W#}dU4N?=_*$HV|{{1`irmMH1A@T3j)YRMiBL7kzUbeBci~=>p`h90_ zZ+@iQ(9HVWtvcIy8DB%rLH~fP&ns)sf6Q+cRaWXE(W=T#L!hqSfBZ-Z*}T3H6Qou^ zHqn<{sr$Ob{%LeSfCL zYmv39T8zu-zlTud;Ya7&+S-)E{-GNlOi3oYNpnVdlfFGVZ>qk-0ToqO>my}UTrZG{ zS5+q;DBUN;0+h(8@8(_st)*ObKJFtExISH_>3N z80_3u&>6879p|E4fWoa6@5gD7Vt=uKgV*VWZR zhutbmLEFQ+8_z|Z*nJBl`3)?-%=rz))D;k1DA4>-H2gtOp5FyFx}ObCnKh1BmWJ{vA?X|MX@PbSJ|I#HzaCC)V;{cVLPo8#AG7IvjEKOPtaa}!J zQvgJZ2oz2B7=@Lp>I-~9LUC4|-cp(+SSs*ywhw>7DLh*I_bIK9pl^d%g`~<6< z4A9ppH3!=?xq}<0$*k+klLoV2nv;FZ+PeD*B@KM5#^$w_Aj=DjYgyS9UjGOJC%En; zu6g3cPaJQlg4qmS!a7!W5}UPEhkUR8`66-&fqSWUWIWpS%KlwNMpgV_nTJUwd*IAt zB{6aFt=B$}=>g*h)ANjLKBp;?=V_AaL580m&Ln9KFh~5;2ArMO&2b~kt@!cb?&x z+tk31(XhREd@_FSsnRq{h$%m6?CRFw+be2St-Gv6jhY|E6^ zn!Z06yR+9Ds+LBF9mn3$2}vFAl6)v39v+^}L7#BTF8X@-;)IB8T*B3ibQWmgGCcxu zhewiQD40&YY_*xzQi4z#k?xSBBdk?c&;00;36UnCWvbDCg$?Mp&53(;LM*hifHSzf zcKtgR57g`F$XL6o*ONKIW~fBt2re_&KTpcUKYG&a32;En(HGUjkCgj~L^);UcyLZ0 z%e($Pk}uQwQ)sRPt^*~w6~qVB_LYFOFSAGAFWfiqB9b*DA~YzTKv)0GQYtDb0Zm!* z>61WrcQ;V`CG{8b9c-1CFwq%&eZg(F{Qdol+S+ag;eaL^$We$hFtJsy3Nxmb;y{r9 ze$|Kr1Y=z;Wm~%-Q+%5!Z_G~5DXnR1%axm(+o95%CF8K!FI9JExh+rGcjzVpvXs3- zG$sO6!929H&57YBq0?H1&XkBFS3XsL+T04~spdy0DJk}MG%El55}M4uwCM@Fq2=ycysF)S|1at6gi5Tu*QB)*s@<`J?^6c8yq} zqi_ud!V8x>He$J@9hc%v%K?|dVup_uQL?}!-7dXhbxo=esclgR^nFj zkTutI&krV)Jpyzq0|D1N|GB}N^ycn&NvNZ;Fg(%tVr{@91D@~ioHo3A2!}Um zH!JZm5sMfk^8WHSe^xXm>(W7q)r$hDjPCsN@)(}lZtIbDP+v2rCwp7lqo(wq9?y2b z?oYg@qokzd_C56vjvUbGL6!`AUN_J73)gZ^ZWCctb@KGoi*6~Sc&LLBjMfs$(}=j$ z#WX>sY=pL9G$t?ZAFTnhj?LFWG{ax1E>O&gv95K@V%B~NIX@~sM??!p9n;5a2Ivn-@wf5TOoZE z-*mgePxhB6AViAF61S|rwY82gYu?qzJit9!HcGH-#!B5b%OHN}``Z7ZD|DmH7IMxN zD|ozXzef6K8r}ZBioqo9Gcsy)MaReIqW&dHbba8)G)s(M-N?00GCDRct}-LfP2x6=jh|+TPvc-XWfSNaG9aDamW}qLQr#36PfuFl z5zq`mCvafYX{n=-=g((8IeqQOJ}EPJGz%u9@M$(Z!?35-_6%SdfL&yBb8~VPnv3?f zXl9M$jz>KU;n^B zLWB1!$0oKcw*>e9*iF@h5|tpa-SsJ62*S)wkFIEA!78RhHxd+I9KeBl0LGa^M5gTJ zxZkHH_a~J^#y`FqW8qC!M&=w~Wnhq5+1i%Y)|&j}x3>2Ev!IXo6Lip2`EZC*s6Ifpz|IM$>Mblxe=tZ? zi&RimRTZTy-zXhMNfX&TE^Gi@1Te1pqE&TbISotL-Q9f+Ne`*`Df1~~XCaGftLq=* zazzwj1?oq@4}c51*ndu^bhuTtrsna2{LR2XC150roB1-+B-4l$??z^h5BEIYcTbQ= zrw=CRScmr8IJo6|-aI}G7>@Etb~Ae1J-;RK9V7?9G|I`z3FX$*FW-{!8_1$1pwS*f ze0(Yobp~krx-2~n^Su&1zyJvNJt5j)T)36$6;}rA>&d@fjor(Nij#~*k#araVqz~! zP{5Nuc`@VHDA4aT_(t9q$Ap!6tp|;VQy!K3JFOpp}kbp zl@JoP->kYI2Sne=(UOKM=$@IA-H(-UOL?SKR!Z+Y2y8l0Abyfd)3p==Q{ttPkJwzo z;a;G>|52>x%K)Qi()-nxl|z>l6+NMo++R^C{OXAyaiCBAAZ@5OTsMM*Va;Q2< zhFQ|~a3>g4i$a91zW(^_fB%af85v<128#GBPC{{LVK7u|3DKUx#2A|!zz2h1XQ`>Ffx(RiASPEl9b4@N=|%XT^g`OXQJd4{_Q!|ogWdZz zOol`szcbWOOJSnMDdP=KX#~Pph}joGxWw^W0x!_xBB!#(VdKD$D|sffV}K=e zD0mF4)yDDZzk4ChTGI5R`H*%kNAqSkOZ96`q?dp5AkXc<_{b!S3rL>rcDf8Hv^|)Dk{W&Hpoo#2_<|v z$F;y4Au{$0tGo%;I6M0}3W-D(9ma4}kPiCDWU{7*hsV*qQ199gA2J^W1SF>0fE*Jf z6c7$%Z`1cl0Sc~b`$pdvBPj<52kn~uC2BvNgrw@F>U^z5Ad&Z2!-n^H&0NK4tAu1Dl<>O}cOwe4TVlovw}QW1n-lLiry4 z0jlUD{?0rVKeXR3BM>Zf0_m@>*uU5drihwaGCh~9QSjF|W!dA7Rp_rWkYKe=>Lt6s~9O|WoIvm7Kq`Xpc@Vj=>S}J6FN_CZ#S>GHfUgIXz1IA z0!2ng7)~D2(4#ajy!i6~L8N{o&=Cqf18^1W7v4|H`cLyfT{z0hVKAzhN^svgT=3~# z)bW1yj~_qUAUsTw!j5wGKv8pD@e5M|OwG6|_2dF{M9~oeH42i7KRE@DmO|W;n}vD( WIF_@8q8X;@zuxnEpTJjC<7hcO1rw6shn^Yr7Vm3xI+Qg}gqU1TU2 z3_f(ZL;?Vo#h@EH6h*Ojb~3|jYwHgV>bXKe<0>d=GaU6J#C!#?6 z3-!MN6h%Qa8bx344YXXk2t`q#YdQ!a5S^lHaG+m2(gXRpyxrE?Ui9VbIvfrMy1P0d zNfK&mB8bI?^-w5e9|>St_IcxbIw}YP0)Zd`fgrM36I5cGV=V;WtZDK z(AC)m##lcU=;*@2l9mUQloXMZCqh@9PUra4+lM9U4wvF@Wnp&tp-wX{7fOk;*+}Va<7%)u}rfEXgbr^;LS(c%yDrRS2 z!?LVvZe)VN-0E9L}g_q78gH&QVNda9QhQ&;qcu=BEfPw#^UiA zc)ecu{eF~{l|hzel$MsFyu2La6EER*yR}3jVOCdH#}1|NYG%?mKR+)lEiK1XRlUIT zd=cRYwR1Ldxg2ARDL$WXxvHw7qq(_RZ*9A>cL?yW^$Q!6ALAK3Gw=Wa002ovPDHLk FV1gI@Q62yQ literal 0 HcmV?d00001 diff --git a/src/main/resources/static/diagram-viewer/index.html b/src/main/resources/static/diagram-viewer/index.html new file mode 100644 index 00000000..bddcfc6d --- /dev/null +++ b/src/main/resources/static/diagram-viewer/index.html @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    +
    +
    +
    +
    + + + diff --git a/src/main/resources/static/diagram-viewer/js/ActivitiRest.js b/src/main/resources/static/diagram-viewer/js/ActivitiRest.js new file mode 100644 index 00000000..1afd90e0 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/ActivitiRest.js @@ -0,0 +1,74 @@ +var ActivitiRest = { + options: {}, + getProcessDefinitionByKey: function(processDefinitionKey, callback) { + var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey}); + + $.ajax({ + url: url, + dataType: 'jsonp', + cache: false, + async: true, + success: function(data, textStatus) { + var processDefinition = data; + if (!processDefinition) { + console.error("Process definition '" + processDefinitionKey + "' not found"); + } else { + callback.apply({processDefinitionId: processDefinition.id}); + } + } + }).done(function(data, textStatus) { + console.log("ajax done"); + }).fail(function(jqXHR, textStatus, error){ + console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, 'error: ', error, jqXHR); + }); + }, + + getProcessDefinition: function(processDefinitionId, callback) { + var url = Lang.sub(this.options.processDefinitionUrl, {processDefinitionId: processDefinitionId}); + + $.ajax({ + url: url, + dataType: 'jsonp', + cache: false, + async: true, + success: function(data, textStatus) { + var processDefinitionDiagramLayout = data; + if (!processDefinitionDiagramLayout) { + console.error("Process definition diagram layout '" + processDefinitionId + "' not found"); + return; + } else { + callback.apply({processDefinitionDiagramLayout: processDefinitionDiagramLayout}); + } + } + }).done(function(data, textStatus) { + console.log("ajax done"); + }).fail(function(jqXHR, textStatus, error){ + console.log('Get diagram layout['+processDefinitionId+'] failure: ', textStatus, jqXHR); + }); + }, + + getHighLights: function(processInstanceId, callback) { + var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId}); + + $.ajax({ + url: url, + dataType: 'jsonp', + cache: false, + async: true, + success: function(data, textStatus) { + console.log("ajax returned data"); + var highLights = data; + if (!highLights) { + console.log("highLights not found"); + return; + } else { + callback.apply({highLights: highLights}); + } + } + }).done(function(data, textStatus) { + console.log("ajax done"); + }).fail(function(jqXHR, textStatus, error){ + console.log('Get HighLights['+processInstanceId+'] failure: ', textStatus, jqXHR); + }); + } +}; \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/js/ActivityImpl.js b/src/main/resources/static/diagram-viewer/js/ActivityImpl.js new file mode 100644 index 00000000..f3102116 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/ActivityImpl.js @@ -0,0 +1 @@ +/** * * @author Tom Baeyens * @author (Javascript) Dmitry Farafonov */ var ActivityImpl = function(activityJson){ this.outgoingTransitions = []; this.outgoingTransitions = []; this.incomingTransitions = []; this.activityBehavior = null; this.parent = null; this.isScope = false; this.isAsync = false; this.isExclusive = false; this.x = -1; this.y = -1; this.width = -1; this.height = -1; this.properties = {}; //console.log("activityJson: ", activityJson); if (activityJson != undefined) { this.setId(activityJson.activityId); for (var propertyName in activityJson.properties) { this.setProperty(propertyName, activityJson.properties[propertyName]); } //this.setProperty("name", activityJson.activityName); //this.setProperty("type", activityJson.activityType); this.setX(activityJson.x); this.setY(activityJson.y); this.setWidth(activityJson.width); this.setHeight(activityJson.height); if (activityJson.multiInstance) this.setProperty("multiInstance", activityJson.multiInstance); if (activityJson.collapsed) { this.setProperty("collapsed", activityJson.collapsed); } if (activityJson.isInterrupting != undefined) this.setProperty("isInterrupting", activityJson.isInterrupting); } }; ActivityImpl.prototype = { outgoingTransitions: [], outgoingTransitions: [], incomingTransitions: [], activityBehavior: null, parent: null, isScope: false, isAsync: false, isExclusive: false, id: null, properties: {}, // Graphical information x: -1, y: -1, width: -1, height: -1, setId: function(id){ this.id = id; }, getId: function(){ return this.id; }, setProperty: function(name, value){ this.properties[name] = value; }, getProperty: function(name){ return this.properties[name]; }, createOutgoingTransition: function(transitionId){ }, toString: function(id) { return "Activity("+id+")"; }, getParentActivity: function(){ /* if (parent instanceof ActivityImpl) { 79 return (ActivityImpl) parent; 80 } 81 return null; */ return this.parent; }, // restricted setters /////////////////////////////////////////////////////// setOutgoingTransitions: function(outgoingTransitions){ this.outgoingTransitions = outgoingTransitions; }, setParent: function(parent){ this.parent = parent; }, setIncomingTransitions: function(incomingTransitions){ this.incomingTransitions = incomingTransitions; }, // getters and setters ////////////////////////////////////////////////////// getOutgoingTransitions: function(){ return this.outgoingTransitions; }, getActivityBehavior: function(){ return this.activityBehavior; }, setActivityBehavior: function(activityBehavior){ this.activityBehavior = activityBehavior; }, getParent: function(){ return this.parent; }, getIncomingTransitions: function(){ return this.incomingTransitions; }, isScope: function(){ return this.isScope; }, setScope: function(isScope){ this.isScope = isScope; }, getX: function(){ return this.x; }, setX: function(x){ this.x = x; }, getY: function(){ return this.y; }, setY: function(y){ this.y = y; }, getWidth: function(){ return this.width; }, setWidth: function(width){ this.width = width; }, getHeight: function(){ return this.height; }, setHeight: function(height){ this.height = height; }, isAsync: function() { return this.isAsync; }, setAsync: function(isAsync) { this.isAsync = isAsync; }, isExclusive: function() { return this.isExclusive; }, setExclusive: function(isExclusive) { this.isExclusive = isExclusive; }, vvoid: function(){} }; \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/js/Color.js b/src/main/resources/static/diagram-viewer/js/Color.js new file mode 100644 index 00000000..e57027ef --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/Color.js @@ -0,0 +1,603 @@ +/** + * Web color table + * + * @author Dmitry Farafonov + */ + +var Color = { + /** + * The color white. In the default sRGB space. + */ + white : Raphael.getRGB("rgb(255,255,255)"), + + /** + * The color white. In the default sRGB space. + */ + WHITE : this.white, + + /** + * The color light gray. In the default sRGB space. + */ + lightGray : Raphael.getRGB("rgb(192, 192, 192)"), + + /** + * The color light gray. In the default sRGB space. + */ + LIGHT_GRAY : this.lightGray, + + /** + * The color gray. In the default sRGB space. + */ + gray : Raphael.getRGB("rgb(128, 128, 128)"), + + /** + * The color gray. In the default sRGB space. + */ + GRAY : this.gray, + + /** + * The color dark gray. In the default sRGB space. + */ + darkGray : Raphael.getRGB("rgb(64, 64, 64)"), + + /** + * The color dark gray. In the default sRGB space. + */ + DARK_GRAY : this.darkGray, + + /** + * The color black. In the default sRGB space. + */ + black : Raphael.getRGB("rgb(0, 0, 0)"), + + /** + * The color black. In the default sRGB space. + */ + BLACK : this.black, + + /** + * The color red. In the default sRGB space. + */ + red : Raphael.getRGB("rgb(255, 0, 0)"), + + /** + * The color red. In the default sRGB space. + */ + RED : this.red, + + /** + * The color pink. In the default sRGB space. + */ + pink : Raphael.getRGB("rgb(255, 175, 175)"), + + /** + * The color pink. In the default sRGB space. + */ + PINK : this.pink, + + /** + * The color orange. In the default sRGB space. + */ + orange : Raphael.getRGB("rgb(255, 200, 0)"), + + /** + * The color orange. In the default sRGB space. + */ + ORANGE : this.orange, + + /** + * The color yellow. In the default sRGB space. + */ + yellow : Raphael.getRGB("rgb(255, 255, 0)"), + + /** + * The color yellow. In the default sRGB space. + */ + YELLOW : this.yellow, + + /** + * The color green. In the default sRGB space. + */ + green : Raphael.getRGB("rgb(0, 255, 0)"), + + /** + * The color green. In the default sRGB space. + */ + GREEN : this.green, + + /** + * The color magenta. In the default sRGB space. + */ + magenta : Raphael.getRGB("rgb(255, 0, 255)"), + + /** + * The color magenta. In the default sRGB space. + */ + MAGENTA : this.magenta, + + /** + * The color cyan. In the default sRGB space. + */ + cyan : Raphael.getRGB("rgb(0, 255, 255)"), + + /** + * The color cyan. In the default sRGB space. + */ + CYAN : this.cyan, + + /** + * The color blue. In the default sRGB space. + */ + blue : Raphael.getRGB("rgb(0, 0, 255)"), + + /** + * The color blue. In the default sRGB space. + */ + BLUE : this.blue, + + /************************************************************************/ + + // http://www.stm.dp.ua/web-design/color-html.php + + Snow : Raphael.getRGB("#FFFAFA "), // 255 250 250 + GhostWhite : Raphael.getRGB("#F8F8FF "), // 248 248 255 + WhiteSmoke : Raphael.getRGB("#F5F5F5 "), // 245 245 245 + Gainsboro : Raphael.getRGB("#DCDCDC "), // 220 220 220 + FloralWhite : Raphael.getRGB("#FFFAF0 "), // 255 250 240 + OldLace : Raphael.getRGB("#FDF5E6 "), // 253 245 230 + Linen : Raphael.getRGB("#FAF0E6 "), // 250 240 230 + AntiqueWhite : Raphael.getRGB("#FAEBD7 "), // 250 235 215 + PapayaWhip : Raphael.getRGB("#FFEFD5 "), // 255 239 213 + BlanchedAlmond : Raphael.getRGB("#FFEBCD "), // 255 235 205 + Bisque : Raphael.getRGB("#FFE4C4 "), // 255 228 196 + PeachPuff : Raphael.getRGB("#FFDAB9 "), // 255 218 185 + NavajoWhite : Raphael.getRGB("#FFDEAD "), // 255 222 173 + Moccasin : Raphael.getRGB("#FFE4B5 "), // 255 228 181 + Cornsilk : Raphael.getRGB("#FFF8DC "), // 255 248 220 + Ivory : Raphael.getRGB("#FFFFF0 "), // 255 255 240 + LemonChiffon : Raphael.getRGB("#FFFACD "), // 255 250 205 + Seashell : Raphael.getRGB("#FFF5EE "), // 255 245 238 + Honeydew : Raphael.getRGB("#F0FFF0 "), // 240 255 240 + MintCream : Raphael.getRGB("#F5FFFA "), // 245 255 250 + Azure : Raphael.getRGB("#F0FFFF "), // 240 255 255 + AliceBlue : Raphael.getRGB("#F0F8FF "), // 240 248 255 + lavender : Raphael.getRGB("#E6E6FA "), // 230 230 250 + LavenderBlush : Raphael.getRGB("#FFF0F5 "), // 255 240 245 + MistyRose : Raphael.getRGB("#FFE4E1 "), // 255 228 225 + White : Raphael.getRGB("#FFFFFF "), // 255 255 255 + Black : Raphael.getRGB("#000000 "), // 0 0 0 + DarkSlateGray : Raphael.getRGB("#2F4F4F "), // 47 79 79 + DimGrey : Raphael.getRGB("#696969 "), // 105 105 105 + SlateGrey : Raphael.getRGB("#708090 "), // 112 128 144 + LightSlateGray : Raphael.getRGB("#778899 "), // 119 136 153 + Grey : Raphael.getRGB("#BEBEBE "), // 190 190 190 + LightGray : Raphael.getRGB("#D3D3D3 "), // 211 211 211 + MidnightBlue : Raphael.getRGB("#191970 "), // 25 25 112 + NavyBlue : Raphael.getRGB("#000080 "), // 0 0 128 + CornflowerBlue : Raphael.getRGB("#6495ED "), // 100 149 237 + DarkSlateBlue : Raphael.getRGB("#483D8B "), // 72 61 139 + SlateBlue : Raphael.getRGB("#6A5ACD "), // 106 90 205 + MediumSlateBlue : Raphael.getRGB("#7B68EE "), // 123 104 238 + LightSlateBlue : Raphael.getRGB("#8470FF "), // 132 112 255 + MediumBlue : Raphael.getRGB("#0000CD "), // 0 0 205 + RoyalBlue : Raphael.getRGB("#4169E1 "), // 65 105 225 + Blue : Raphael.getRGB("#0000FF "), // 0 0 255 + DodgerBlue : Raphael.getRGB("#1E90FF "), // 30 144 255 + DeepSkyBlue : Raphael.getRGB("#00BFFF "), // 0 191 255 + SkyBlue : Raphael.getRGB("#87CEEB "), // 135 206 235 + LightSkyBlue : Raphael.getRGB("#87CEFA "), // 135 206 250 + SteelBlue : Raphael.getRGB("#4682B4 "), // 70 130 180 + LightSteelBlue : Raphael.getRGB("#B0C4DE "), // 176 196 222 + LightBlue : Raphael.getRGB("#ADD8E6 "), // 173 216 230 + PowderBlue : Raphael.getRGB("#B0E0E6 "), // 176 224 230 + PaleTurquoise : Raphael.getRGB("#AFEEEE "), // 175 238 238 + DarkTurquoise : Raphael.getRGB("#00CED1 "), // 0 206 209 + MediumTurquoise : Raphael.getRGB("#48D1CC "), // 72 209 204 + Turquoise : Raphael.getRGB("#40E0D0 "), // 64 224 208 + Cyan : Raphael.getRGB("#00FFFF "), // 0 255 255 + LightCyan : Raphael.getRGB("#E0FFFF "), // 224 255 255 + CadetBlue : Raphael.getRGB("#5F9EA0 "), // 95 158 160 + MediumAquamarine: Raphael.getRGB("#66CDAA "), // 102 205 170 + Aquamarine : Raphael.getRGB("#7FFFD4 "), // 127 255 212 + DarkGreen : Raphael.getRGB("#006400 "), // 0 100 0 + DarkOliveGreen : Raphael.getRGB("#556B2F "), // 85 107 47 + DarkSeaGreen : Raphael.getRGB("#8FBC8F "), // 143 188 143 + SeaGreen : Raphael.getRGB("#2E8B57 "), // 46 139 87 + MediumSeaGreen : Raphael.getRGB("#3CB371 "), // 60 179 113 + LightSeaGreen : Raphael.getRGB("#20B2AA "), // 32 178 170 + PaleGreen : Raphael.getRGB("#98FB98 "), // 152 251 152 + SpringGreen : Raphael.getRGB("#00FF7F "), // 0 255 127 + LawnGreen : Raphael.getRGB("#7CFC00 "), // 124 252 0 + Green : Raphael.getRGB("#00FF00 "), // 0 255 0 + Chartreuse : Raphael.getRGB("#7FFF00 "), // 127 255 0 + MedSpringGreen : Raphael.getRGB("#00FA9A "), // 0 250 154 + GreenYellow : Raphael.getRGB("#ADFF2F "), // 173 255 47 + LimeGreen : Raphael.getRGB("#32CD32 "), // 50 205 50 + YellowGreen : Raphael.getRGB("#9ACD32 "), // 154 205 50 + ForestGreen : Raphael.getRGB("#228B22 "), // 34 139 34 + OliveDrab : Raphael.getRGB("#6B8E23 "), // 107 142 35 + DarkKhaki : Raphael.getRGB("#BDB76B "), // 189 183 107 + PaleGoldenrod : Raphael.getRGB("#EEE8AA "), // 238 232 170 + LtGoldenrodYello: Raphael.getRGB("#FAFAD2 "), // 250 250 210 + LightYellow : Raphael.getRGB("#FFFFE0 "), // 255 255 224 + Yellow : Raphael.getRGB("#FFFF00 "), // 255 255 0 + Gold : Raphael.getRGB("#FFD700 "), // 255 215 0 + LightGoldenrod : Raphael.getRGB("#EEDD82 "), // 238 221 130 + goldenrod : Raphael.getRGB("#DAA520 "), // 218 165 32 + DarkGoldenrod : Raphael.getRGB("#B8860B "), // 184 134 11 + RosyBrown : Raphael.getRGB("#BC8F8F "), // 188 143 143 + IndianRed : Raphael.getRGB("#CD5C5C "), // 205 92 92 + SaddleBrown : Raphael.getRGB("#8B4513 "), // 139 69 19 + Sienna : Raphael.getRGB("#A0522D "), // 160 82 45 + Peru : Raphael.getRGB("#CD853F "), // 205 133 63 + Burlywood : Raphael.getRGB("#DEB887 "), // 222 184 135 + Beige : Raphael.getRGB("#F5F5DC "), // 245 245 220 + Wheat : Raphael.getRGB("#F5DEB3 "), // 245 222 179 + SandyBrown : Raphael.getRGB("#F4A460 "), // 244 164 96 + Tan : Raphael.getRGB("#D2B48C "), // 210 180 140 + Chocolate : Raphael.getRGB("#D2691E "), // 210 105 30 + Firebrick : Raphael.getRGB("#B22222 "), // 178 34 34 + Brown : Raphael.getRGB("#A52A2A "), // 165 42 42 + DarkSalmon : Raphael.getRGB("#E9967A "), // 233 150 122 + Salmon : Raphael.getRGB("#FA8072 "), // 250 128 114 + LightSalmon : Raphael.getRGB("#FFA07A "), // 255 160 122 + Orange : Raphael.getRGB("#FFA500 "), // 255 165 0 + DarkOrange : Raphael.getRGB("#FF8C00 "), // 255 140 0 + Coral : Raphael.getRGB("#FF7F50 "), // 255 127 80 + LightCoral : Raphael.getRGB("#F08080 "), // 240 128 128 + Tomato : Raphael.getRGB("#FF6347 "), // 255 99 71 + OrangeRed : Raphael.getRGB("#FF4500 "), // 255 69 0 + Red : Raphael.getRGB("#FF0000 "), // 255 0 0 + HotPink : Raphael.getRGB("#FF69B4 "), // 255 105 180 + DeepPink : Raphael.getRGB("#FF1493 "), // 255 20 147 + Pink : Raphael.getRGB("#FFC0CB "), // 255 192 203 + LightPink : Raphael.getRGB("#FFB6C1 "), // 255 182 193 + PaleVioletRed : Raphael.getRGB("#DB7093 "), // 219 112 147 + Maroon : Raphael.getRGB("#B03060 "), // 176 48 96 + MediumVioletRed : Raphael.getRGB("#C71585 "), // 199 21 133 + VioletRed : Raphael.getRGB("#D02090 "), // 208 32 144 + Magenta : Raphael.getRGB("#FF00FF "), // 255 0 255 + Violet : Raphael.getRGB("#EE82EE "), // 238 130 238 + Plum : Raphael.getRGB("#DDA0DD "), // 221 160 221 + Orchid : Raphael.getRGB("#DA70D6 "), // 218 112 214 + MediumOrchid : Raphael.getRGB("#BA55D3 "), // 186 85 211 + DarkOrchid : Raphael.getRGB("#9932CC "), // 153 50 204 + DarkViolet : Raphael.getRGB("#9400D3 "), // 148 0 211 + BlueViolet : Raphael.getRGB("#8A2BE2 "), // 138 43 226 + Purple : Raphael.getRGB("#A020F0 "), // 160 32 240 + MediumPurple : Raphael.getRGB("#9370DB "), // 147 112 219 + Thistle : Raphael.getRGB("#D8BFD8 "), // 216 191 216 + Snow1 : Raphael.getRGB("#FFFAFA "), // 255 250 250 + Snow2 : Raphael.getRGB("#EEE9E9 "), // 238 233 233 + Snow3 : Raphael.getRGB("#CDC9C9 "), // 205 201 201 + Snow4 : Raphael.getRGB("#8B8989 "), // 139 137 137 + Seashell1 : Raphael.getRGB("#FFF5EE "), // 255 245 238 + Seashell2 : Raphael.getRGB("#EEE5DE "), // 238 229 222 + Seashell3 : Raphael.getRGB("#CDC5BF "), // 205 197 191 + Seashell4 : Raphael.getRGB("#8B8682 "), // 139 134 130 + AntiqueWhite1 : Raphael.getRGB("#FFEFDB "), // 255 239 219 + AntiqueWhite2 : Raphael.getRGB("#EEDFCC "), // 238 223 204 + AntiqueWhite3 : Raphael.getRGB("#CDC0B0 "), // 205 192 176 + AntiqueWhite4 : Raphael.getRGB("#8B8378 "), // 139 131 120 + Bisque1 : Raphael.getRGB("#FFE4C4 "), // 255 228 196 + Bisque2 : Raphael.getRGB("#EED5B7 "), // 238 213 183 + Bisque3 : Raphael.getRGB("#CDB79E "), // 205 183 158 + Bisque4 : Raphael.getRGB("#8B7D6B "), // 139 125 107 + PeachPuff1 : Raphael.getRGB("#FFDAB9 "), // 255 218 185 + PeachPuff2 : Raphael.getRGB("#EECBAD "), // 238 203 173 + PeachPuff3 : Raphael.getRGB("#CDAF95 "), // 205 175 149 + PeachPuff4 : Raphael.getRGB("#8B7765 "), // 139 119 101 + NavajoWhite1 : Raphael.getRGB("#FFDEAD "), // 255 222 173 + NavajoWhite2 : Raphael.getRGB("#EECFA1 "), // 238 207 161 + NavajoWhite3 : Raphael.getRGB("#CDB38B "), // 205 179 139 + NavajoWhite4 : Raphael.getRGB("#8B795E "), // 139 121 94 + LemonChiffon1 : Raphael.getRGB("#FFFACD "), // 255 250 205 + LemonChiffon2 : Raphael.getRGB("#EEE9BF "), // 238 233 191 + LemonChiffon3 : Raphael.getRGB("#CDC9A5 "), // 205 201 165 + LemonChiffon4 : Raphael.getRGB("#8B8970 "), // 139 137 112 + Cornsilk1 : Raphael.getRGB("#FFF8DC "), // 255 248 220 + Cornsilk2 : Raphael.getRGB("#EEE8CD "), // 238 232 205 + Cornsilk3 : Raphael.getRGB("#CDC8B1 "), // 205 200 177 + Cornsilk4 : Raphael.getRGB("#8B8878 "), // 139 136 120 + Ivory1 : Raphael.getRGB("#FFFFF0 "), // 255 255 240 + Ivory2 : Raphael.getRGB("#EEEEE0 "), // 238 238 224 + Ivory3 : Raphael.getRGB("#CDCDC1 "), // 205 205 193 + Ivory4 : Raphael.getRGB("#8B8B83 "), // 139 139 131 + Honeydew1 : Raphael.getRGB("#F0FFF0 "), // 240 255 240 + Honeydew2 : Raphael.getRGB("#E0EEE0 "), // 224 238 224 + Honeydew3 : Raphael.getRGB("#C1CDC1 "), // 193 205 193 + Honeydew4 : Raphael.getRGB("#838B83 "), // 131 139 131 + LavenderBlush1 : Raphael.getRGB("#FFF0F5 "), // 255 240 245 + LavenderBlush2 : Raphael.getRGB("#EEE0E5 "), // 238 224 229 + LavenderBlush3 : Raphael.getRGB("#CDC1C5 "), // 205 193 197 + LavenderBlush4 : Raphael.getRGB("#8B8386 "), // 139 131 134 + MistyRose1 : Raphael.getRGB("#FFE4E1 "), // 255 228 225 + MistyRose2 : Raphael.getRGB("#EED5D2 "), // 238 213 210 + MistyRose3 : Raphael.getRGB("#CDB7B5 "), // 205 183 181 + MistyRose4 : Raphael.getRGB("#8B7D7B "), // 139 125 123 + Azure1 : Raphael.getRGB("#F0FFFF "), // 240 255 255 + Azure2 : Raphael.getRGB("#E0EEEE "), // 224 238 238 + Azure3 : Raphael.getRGB("#C1CDCD "), // 193 205 205 + Azure4 : Raphael.getRGB("#838B8B "), // 131 139 139 + SlateBlue1 : Raphael.getRGB("#836FFF "), // 131 111 255 + SlateBlue2 : Raphael.getRGB("#7A67EE "), // 122 103 238 + SlateBlue3 : Raphael.getRGB("#6959CD "), // 105 89 205 + SlateBlue4 : Raphael.getRGB("#473C8B "), // 71 60 139 + RoyalBlue1 : Raphael.getRGB("#4876FF "), // 72 118 255 + RoyalBlue2 : Raphael.getRGB("#436EEE "), // 67 110 238 + RoyalBlue3 : Raphael.getRGB("#3A5FCD "), // 58 95 205 + RoyalBlue4 : Raphael.getRGB("#27408B "), // 39 64 139 + Blue1 : Raphael.getRGB("#0000FF "), // 0 0 255 + Blue2 : Raphael.getRGB("#0000EE "), // 0 0 238 + Blue3 : Raphael.getRGB("#0000CD "), // 0 0 205 + Blue4 : Raphael.getRGB("#00008B "), // 0 0 139 + DodgerBlue1 : Raphael.getRGB("#1E90FF "), // 30 144 255 + DodgerBlue2 : Raphael.getRGB("#1C86EE "), // 28 134 238 + DodgerBlue3 : Raphael.getRGB("#1874CD "), // 24 116 205 + DodgerBlue4 : Raphael.getRGB("#104E8B "), // 16 78 139 + SteelBlue1 : Raphael.getRGB("#63B8FF "), // 99 184 255 + SteelBlue2 : Raphael.getRGB("#5CACEE "), // 92 172 238 + SteelBlue3 : Raphael.getRGB("#4F94CD "), // 79 148 205 + SteelBlue4 : Raphael.getRGB("#36648B "), // 54 100 139 + DeepSkyBlue1 : Raphael.getRGB("#00BFFF "), // 0 191 255 + DeepSkyBlue2 : Raphael.getRGB("#00B2EE "), // 0 178 238 + DeepSkyBlue3 : Raphael.getRGB("#009ACD "), // 0 154 205 + DeepSkyBlue4 : Raphael.getRGB("#00688B "), // 0 104 139 + SkyBlue1 : Raphael.getRGB("#87CEFF "), // 135 206 255 + SkyBlue2 : Raphael.getRGB("#7EC0EE "), // 126 192 238 + SkyBlue3 : Raphael.getRGB("#6CA6CD "), // 108 166 205 + SkyBlue4 : Raphael.getRGB("#4A708B "), // 74 112 139 + LightSkyBlue1 : Raphael.getRGB("#B0E2FF "), // 176 226 255 + LightSkyBlue2 : Raphael.getRGB("#A4D3EE "), // 164 211 238 + LightSkyBlue3 : Raphael.getRGB("#8DB6CD "), // 141 182 205 + LightSkyBlue4 : Raphael.getRGB("#607B8B "), // 96 123 139 + SlateGray1 : Raphael.getRGB("#C6E2FF "), // 198 226 255 + SlateGray2 : Raphael.getRGB("#B9D3EE "), // 185 211 238 + SlateGray3 : Raphael.getRGB("#9FB6CD "), // 159 182 205 + SlateGray4 : Raphael.getRGB("#6C7B8B "), // 108 123 139 + LightSteelBlue1 : Raphael.getRGB("#CAE1FF "), // 202 225 255 + LightSteelBlue2 : Raphael.getRGB("#BCD2EE "), // 188 210 238 + LightSteelBlue3 : Raphael.getRGB("#A2B5CD "), // 162 181 205 + LightSteelBlue4 : Raphael.getRGB("#6E7B8B "), // 110 123 139 + LightBlue1 : Raphael.getRGB("#BFEFFF "), // 191 239 255 + LightBlue2 : Raphael.getRGB("#B2DFEE "), // 178 223 238 + LightBlue3 : Raphael.getRGB("#9AC0CD "), // 154 192 205 + LightBlue4 : Raphael.getRGB("#68838B "), // 104 131 139 + LightCyan1 : Raphael.getRGB("#E0FFFF "), // 224 255 255 + LightCyan2 : Raphael.getRGB("#D1EEEE "), // 209 238 238 + LightCyan3 : Raphael.getRGB("#B4CDCD "), // 180 205 205 + LightCyan4 : Raphael.getRGB("#7A8B8B "), // 122 139 139 + PaleTurquoise1 : Raphael.getRGB("#BBFFFF "), // 187 255 255 + PaleTurquoise2 : Raphael.getRGB("#AEEEEE "), // 174 238 238 + PaleTurquoise3 : Raphael.getRGB("#96CDCD "), // 150 205 205 + PaleTurquoise4 : Raphael.getRGB("#668B8B "), // 102 139 139 + CadetBlue1 : Raphael.getRGB("#98F5FF "), // 152 245 255 + CadetBlue2 : Raphael.getRGB("#8EE5EE "), // 142 229 238 + CadetBlue3 : Raphael.getRGB("#7AC5CD "), // 122 197 205 + CadetBlue4 : Raphael.getRGB("#53868B "), // 83 134 139 + Turquoise1 : Raphael.getRGB("#00F5FF "), // 0 245 255 + Turquoise2 : Raphael.getRGB("#00E5EE "), // 0 229 238 + Turquoise3 : Raphael.getRGB("#00C5CD "), // 0 197 205 + Turquoise4 : Raphael.getRGB("#00868B "), // 0 134 139 + Cyan1 : Raphael.getRGB("#00FFFF "), // 0 255 255 + Cyan2 : Raphael.getRGB("#00EEEE "), // 0 238 238 + Cyan3 : Raphael.getRGB("#00CDCD "), // 0 205 205 + Cyan4 : Raphael.getRGB("#008B8B "), // 0 139 139 + DarkSlateGray1 : Raphael.getRGB("#97FFFF "), // 151 255 255 + DarkSlateGray2 : Raphael.getRGB("#8DEEEE "), // 141 238 238 + DarkSlateGray3 : Raphael.getRGB("#79CDCD "), // 121 205 205 + DarkSlateGray4 : Raphael.getRGB("#528B8B "), // 82 139 139 + Aquamarine1 : Raphael.getRGB("#7FFFD4 "), // 127 255 212 + Aquamarine2 : Raphael.getRGB("#76EEC6 "), // 118 238 198 + Aquamarine3 : Raphael.getRGB("#66CDAA "), // 102 205 170 + Aquamarine4 : Raphael.getRGB("#458B74 "), // 69 139 116 + DarkSeaGreen1 : Raphael.getRGB("#C1FFC1 "), // 193 255 193 + DarkSeaGreen2 : Raphael.getRGB("#B4EEB4 "), // 180 238 180 + DarkSeaGreen3 : Raphael.getRGB("#9BCD9B "), // 155 205 155 + DarkSeaGreen4 : Raphael.getRGB("#698B69 "), // 105 139 105 + SeaGreen1 : Raphael.getRGB("#54FF9F "), // 84 255 159 + SeaGreen2 : Raphael.getRGB("#4EEE94 "), // 78 238 148 + SeaGreen3 : Raphael.getRGB("#43CD80 "), // 67 205 128 + SeaGreen4 : Raphael.getRGB("#2E8B57 "), // 46 139 87 + PaleGreen1 : Raphael.getRGB("#9AFF9A "), // 154 255 154 + PaleGreen2 : Raphael.getRGB("#90EE90 "), // 144 238 144 + PaleGreen3 : Raphael.getRGB("#7CCD7C "), // 124 205 124 + PaleGreen4 : Raphael.getRGB("#548B54 "), // 84 139 84 + SpringGreen1 : Raphael.getRGB("#00FF7F "), // 0 255 127 + SpringGreen2 : Raphael.getRGB("#00EE76 "), // 0 238 118 + SpringGreen3 : Raphael.getRGB("#00CD66 "), // 0 205 102 + SpringGreen4 : Raphael.getRGB("#008B45 "), // 0 139 69 + Green1 : Raphael.getRGB("#00FF00 "), // 0 255 0 + Green2 : Raphael.getRGB("#00EE00 "), // 0 238 0 + Green3 : Raphael.getRGB("#00CD00 "), // 0 205 0 + Green4 : Raphael.getRGB("#008B00 "), // 0 139 0 + Chartreuse1 : Raphael.getRGB("#7FFF00 "), // 127 255 0 + Chartreuse2 : Raphael.getRGB("#76EE00 "), // 118 238 0 + Chartreuse3 : Raphael.getRGB("#66CD00 "), // 102 205 0 + Chartreuse4 : Raphael.getRGB("#458B00 "), // 69 139 0 + OliveDrab1 : Raphael.getRGB("#C0FF3E "), // 192 255 62 + OliveDrab2 : Raphael.getRGB("#B3EE3A "), // 179 238 58 + OliveDrab3 : Raphael.getRGB("#9ACD32 "), // 154 205 50 + OliveDrab4 : Raphael.getRGB("#698B22 "), // 105 139 34 + DarkOliveGreen1 : Raphael.getRGB("#CAFF70 "), // 202 255 112 + DarkOliveGreen2 : Raphael.getRGB("#BCEE68 "), // 188 238 104 + DarkOliveGreen3 : Raphael.getRGB("#A2CD5A "), // 162 205 90 + DarkOliveGreen4 : Raphael.getRGB("#6E8B3D "), // 110 139 61 + Khaki1 : Raphael.getRGB("#FFF68F "), // 255 246 143 + Khaki2 : Raphael.getRGB("#EEE685 "), // 238 230 133 + Khaki3 : Raphael.getRGB("#CDC673 "), // 205 198 115 + Khaki4 : Raphael.getRGB("#8B864E "), // 139 134 78 + LightGoldenrod1 : Raphael.getRGB("#FFEC8B "), // 255 236 139 + LightGoldenrod2 : Raphael.getRGB("#EEDC82 "), // 238 220 130 + LightGoldenrod3 : Raphael.getRGB("#CDBE70 "), // 205 190 112 + LightGoldenrod4 : Raphael.getRGB("#8B814C "), // 139 129 76 + LightYellow1 : Raphael.getRGB("#FFFFE0 "), // 255 255 224 + LightYellow2 : Raphael.getRGB("#EEEED1 "), // 238 238 209 + LightYellow3 : Raphael.getRGB("#CDCDB4 "), // 205 205 180 + LightYellow4 : Raphael.getRGB("#8B8B7A "), // 139 139 122 + Yellow1 : Raphael.getRGB("#FFFF00 "), // 255 255 0 + Yellow2 : Raphael.getRGB("#EEEE00 "), // 238 238 0 + Yellow3 : Raphael.getRGB("#CDCD00 "), // 205 205 0 + Yellow4 : Raphael.getRGB("#8B8B00 "), // 139 139 0 + Gold1 : Raphael.getRGB("#FFD700 "), // 255 215 0 + Gold2 : Raphael.getRGB("#EEC900 "), // 238 201 0 + Gold3 : Raphael.getRGB("#CDAD00 "), // 205 173 0 + Gold4 : Raphael.getRGB("#8B7500 "), // 139 117 0 + Goldenrod1 : Raphael.getRGB("#FFC125 "), // 255 193 37 + Goldenrod2 : Raphael.getRGB("#EEB422 "), // 238 180 34 + Goldenrod3 : Raphael.getRGB("#CD9B1D "), // 205 155 29 + Goldenrod4 : Raphael.getRGB("#8B6914 "), // 139 105 20 + DarkGoldenrod1 : Raphael.getRGB("#FFB90F "), // 255 185 15 + DarkGoldenrod2 : Raphael.getRGB("#EEAD0E "), // 238 173 14 + DarkGoldenrod3 : Raphael.getRGB("#CD950C "), // 205 149 12 + DarkGoldenrod4 : Raphael.getRGB("#8B658B "), // 139 101 8 + RosyBrown1 : Raphael.getRGB("#FFC1C1 "), // 255 193 193 + RosyBrown2 : Raphael.getRGB("#EEB4B4 "), // 238 180 180 + RosyBrown3 : Raphael.getRGB("#CD9B9B "), // 205 155 155 + RosyBrown4 : Raphael.getRGB("#8B6969 "), // 139 105 105 + IndianRed1 : Raphael.getRGB("#FF6A6A "), // 255 106 106 + IndianRed2 : Raphael.getRGB("#EE6363 "), // 238 99 99 + IndianRed3 : Raphael.getRGB("#CD5555 "), // 205 85 85 + IndianRed4 : Raphael.getRGB("#8B3A3A "), // 139 58 58 + Sienna1 : Raphael.getRGB("#FF8247 "), // 255 130 71 + Sienna2 : Raphael.getRGB("#EE7942 "), // 238 121 66 + Sienna3 : Raphael.getRGB("#CD6839 "), // 205 104 57 + Sienna4 : Raphael.getRGB("#8B4726 "), // 139 71 38 + Burlywood1 : Raphael.getRGB("#FFD39B "), // 255 211 155 + Burlywood2 : Raphael.getRGB("#EEC591 "), // 238 197 145 + Burlywood3 : Raphael.getRGB("#CDAA7D "), // 205 170 125 + Burlywood4 : Raphael.getRGB("#8B7355 "), // 139 115 85 + Wheat1 : Raphael.getRGB("#FFE7BA "), // 255 231 186 + Wheat2 : Raphael.getRGB("#EED8AE "), // 238 216 174 + Wheat3 : Raphael.getRGB("#CDBA96 "), // 205 186 150 + Wheat4 : Raphael.getRGB("#8B7E66 "), // 139 126 102 + Tan1 : Raphael.getRGB("#FFA54F "), // 255 165 79 + Tan2 : Raphael.getRGB("#EE9A49 "), // 238 154 73 + Tan3 : Raphael.getRGB("#CD853F "), // 205 133 63 + Tan4 : Raphael.getRGB("#8B5A2B "), // 139 90 43 + Chocolate1 : Raphael.getRGB("#FF7F24 "), // 255 127 36 + Chocolate2 : Raphael.getRGB("#EE7621 "), // 238 118 33 + Chocolate3 : Raphael.getRGB("#CD661D "), // 205 102 29 + Chocolate4 : Raphael.getRGB("#8B4513 "), // 139 69 19 + Firebrick1 : Raphael.getRGB("#FF3030 "), // 255 48 48 + Firebrick2 : Raphael.getRGB("#EE2C2C "), // 238 44 44 + Firebrick3 : Raphael.getRGB("#CD2626 "), // 205 38 38 + Firebrick4 : Raphael.getRGB("#8B1A1A "), // 139 26 26 + Brown1 : Raphael.getRGB("#FF4040 "), // 255 64 64 + Brown2 : Raphael.getRGB("#EE3B3B "), // 238 59 59 + Brown3 : Raphael.getRGB("#CD3333 "), // 205 51 51 + Brown4 : Raphael.getRGB("#8B2323 "), // 139 35 35 + Salmon1 : Raphael.getRGB("#FF8C69 "), // 255 140 105 + Salmon2 : Raphael.getRGB("#EE8262 "), // 238 130 98 + Salmon3 : Raphael.getRGB("#CD7054 "), // 205 112 84 + Salmon4 : Raphael.getRGB("#8B4C39 "), // 139 76 57 + LightSalmon1 : Raphael.getRGB("#FFA07A "), // 255 160 122 + LightSalmon2 : Raphael.getRGB("#EE9572 "), // 238 149 114 + LightSalmon3 : Raphael.getRGB("#CD8162 "), // 205 129 98 + LightSalmon4 : Raphael.getRGB("#8B5742 "), // 139 87 66 + Orange1 : Raphael.getRGB("#FFA500 "), // 255 165 0 + Orange2 : Raphael.getRGB("#EE9A00 "), // 238 154 0 + Orange3 : Raphael.getRGB("#CD8500 "), // 205 133 0 + Orange4 : Raphael.getRGB("#8B5A00 "), // 139 90 0 + DarkOrange1 : Raphael.getRGB("#FF7F00 "), // 255 127 0 + DarkOrange2 : Raphael.getRGB("#EE7600 "), // 238 118 0 + DarkOrange3 : Raphael.getRGB("#CD6600 "), // 205 102 0 + DarkOrange4 : Raphael.getRGB("#8B4500 "), // 139 69 0 + Coral1 : Raphael.getRGB("#FF7256 "), // 255 114 86 + Coral2 : Raphael.getRGB("#EE6A50 "), // 238 106 80 + Coral3 : Raphael.getRGB("#CD5B45 "), // 205 91 69 + Coral4 : Raphael.getRGB("#8B3E2F "), // 139 62 47 + Tomato1 : Raphael.getRGB("#FF6347 "), // 255 99 71 + Tomato2 : Raphael.getRGB("#EE5C42 "), // 238 92 66 + Tomato3 : Raphael.getRGB("#CD4F39 "), // 205 79 57 + Tomato4 : Raphael.getRGB("#8B3626 "), // 139 54 38 + OrangeRed1 : Raphael.getRGB("#FF4500 "), // 255 69 0 + OrangeRed2 : Raphael.getRGB("#EE4000 "), // 238 64 0 + OrangeRed3 : Raphael.getRGB("#CD3700 "), // 205 55 0 + OrangeRed4 : Raphael.getRGB("#8B2500 "), // 139 37 0 + Red1 : Raphael.getRGB("#FF0000 "), // 255 0 0 + Red2 : Raphael.getRGB("#EE0000 "), // 238 0 0 + Red3 : Raphael.getRGB("#CD0000 "), // 205 0 0 + Red4 : Raphael.getRGB("#8B0000 "), // 139 0 0 + DeepPink1 : Raphael.getRGB("#FF1493 "), // 255 20 147 + DeepPink2 : Raphael.getRGB("#EE1289 "), // 238 18 137 + DeepPink3 : Raphael.getRGB("#CD1076 "), // 205 16 118 + DeepPink4 : Raphael.getRGB("#8B0A50 "), // 139 10 80 + HotPink1 : Raphael.getRGB("#FF6EB4 "), // 255 110 180 + HotPink2 : Raphael.getRGB("#EE6AA7 "), // 238 106 167 + HotPink3 : Raphael.getRGB("#CD6090 "), // 205 96 144 + HotPink4 : Raphael.getRGB("#8B3A62 "), // 139 58 98 + Pink1 : Raphael.getRGB("#FFB5C5 "), // 255 181 197 + Pink2 : Raphael.getRGB("#EEA9B8 "), // 238 169 184 + Pink3 : Raphael.getRGB("#CD919E "), // 205 145 158 + Pink4 : Raphael.getRGB("#8B636C "), // 139 99 108 + LightPink1 : Raphael.getRGB("#FFAEB9 "), // 255 174 185 + LightPink2 : Raphael.getRGB("#EEA2AD "), // 238 162 173 + LightPink3 : Raphael.getRGB("#CD8C95 "), // 205 140 149 + LightPink4 : Raphael.getRGB("#8B5F65 "), // 139 95 101 + PaleVioletRed1 : Raphael.getRGB("#FF82AB "), // 255 130 171 + PaleVioletRed2 : Raphael.getRGB("#EE799F "), // 238 121 159 + PaleVioletRed3 : Raphael.getRGB("#CD6889 "), // 205 104 137 + PaleVioletRed4 : Raphael.getRGB("#8B475D "), // 139 71 93 + Maroon1 : Raphael.getRGB("#FF34B3 "), // 255 52 179 + Maroon2 : Raphael.getRGB("#EE30A7 "), // 238 48 167 + Maroon3 : Raphael.getRGB("#CD2990 "), // 205 41 144 + Maroon4 : Raphael.getRGB("#8B1C62 "), // 139 28 98 + VioletRed1 : Raphael.getRGB("#FF3E96 "), // 255 62 150 + VioletRed2 : Raphael.getRGB("#EE3A8C "), // 238 58 140 + VioletRed3 : Raphael.getRGB("#CD3278 "), // 205 50 120 + VioletRed4 : Raphael.getRGB("#8B2252 "), // 139 34 82 + Magenta1 : Raphael.getRGB("#FF00FF "), // 255 0 255 + Magenta2 : Raphael.getRGB("#EE00EE "), // 238 0 238 + Magenta3 : Raphael.getRGB("#CD00CD "), // 205 0 205 + Magenta4 : Raphael.getRGB("#8B008B "), // 139 0 139 + Orchid1 : Raphael.getRGB("#FF83FA "), // 255 131 250 + Orchid2 : Raphael.getRGB("#EE7AE9 "), // 238 122 233 + Orchid3 : Raphael.getRGB("#CD69C9 "), // 205 105 201 + Orchid4 : Raphael.getRGB("#8B4789 "), // 139 71 137 + Plum1 : Raphael.getRGB("#FFBBFF "), // 255 187 255 + Plum2 : Raphael.getRGB("#EEAEEE "), // 238 174 238 + Plum3 : Raphael.getRGB("#CD96CD "), // 205 150 205 + Plum4 : Raphael.getRGB("#8B668B "), // 139 102 139 + MediumOrchid1 : Raphael.getRGB("#E066FF "), // 224 102 255 + MediumOrchid2 : Raphael.getRGB("#D15FEE "), // 209 95 238 + MediumOrchid3 : Raphael.getRGB("#B452CD "), // 180 82 205 + MediumOrchid4 : Raphael.getRGB("#7A378B "), // 122 55 139 + DarkOrchid1 : Raphael.getRGB("#BF3EFF "), // 191 62 255 + DarkOrchid2 : Raphael.getRGB("#B23AEE "), // 178 58 238 + DarkOrchid3 : Raphael.getRGB("#9A32CD "), // 154 50 205 + DarkOrchid4 : Raphael.getRGB("#68228B "), // 104 34 139 + Purple1 : Raphael.getRGB("#9B30FF "), // 155 48 255 + Purple2 : Raphael.getRGB("#912CEE "), // 145 44 238 + Purple3 : Raphael.getRGB("#7D26CD "), // 125 38 205 + Purple4 : Raphael.getRGB("#551A8B "), // 85 26 139 + MediumPurple1 : Raphael.getRGB("#AB82FF "), // 171 130 255 + MediumPurple2 : Raphael.getRGB("#9F79EE "), // 159 121 238 + MediumPurple3 : Raphael.getRGB("#8968CD "), // 137 104 205 + MediumPurple4 : Raphael.getRGB("#5D478B "), // 93 71 139 + Thistle1 : Raphael.getRGB("#FFE1FF "), // 255 225 255 + Thistle2 : Raphael.getRGB("#EED2EE "), // 238 210 238 + Thistle3 : Raphael.getRGB("#CDB5CD "), // 205 181 205 + Thistle4 : Raphael.getRGB("#8B7B8B "), // 139 123 139 + grey11 : Raphael.getRGB("#1C1C1C "), // 28 28 28 + grey21 : Raphael.getRGB("#363636 "), // 54 54 54 + grey31 : Raphael.getRGB("#4F4F4F "), // 79 79 79 + grey41 : Raphael.getRGB("#696969 "), // 105 105 105 + grey51 : Raphael.getRGB("#828282 "), // 130 130 130 + grey61 : Raphael.getRGB("#9C9C9C "), // 156 156 156 + grey71 : Raphael.getRGB("#B5B5B5 "), // 181 181 181 + gray81 : Raphael.getRGB("#CFCFCF "), // 207 207 207 + gray91 : Raphael.getRGB("#E8E8E8 "), // 232 232 232 + DarkGrey : Raphael.getRGB("#A9A9A9 "), // 169 169 169 + DarkBlue : Raphael.getRGB("#00008B "), // 0 0 139 + DarkCyan : Raphael.getRGB("#008B8B "), // 0 139 139 + DarkMagenta : Raphael.getRGB("#8B008B "), // 139 0 139 + DarkRed : Raphael.getRGB("#8B0000 "), // 139 0 0 + LightGreen : Raphael.getRGB("#90EE90 "), // 144 238 144 + + + + get: function(R, G, B){ + return Raphael.getRGB("rgb(" + R + ", " + G + ", " + B + ")"); + } +}; \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js b/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js new file mode 100644 index 00000000..edba1a03 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/LineBreakMeasurer.js @@ -0,0 +1,270 @@ +/** + * Word wrapping + * + * @author (Javascript) Dmitry Farafonov + */ + + var AttributedStringIterator = function(text){ + //this.text = this.rtrim(this.ltrim(text)); + text = text.replace(/(\s)+/, " "); + this.text = this.rtrim(text); + /* + if (beginIndex < 0 || beginIndex > endIndex || endIndex > length()) { + throw new IllegalArgumentException("Invalid substring range"); + } + */ + this.beginIndex = 0; + this.endIndex = this.text.length; + this.currentIndex = this.beginIndex; + + //console.group("[AttributedStringIterator]"); + var i = 0; + var string = this.text; + var fullPos = 0; + + //console.log("string: \"" + string + "\", length: " + string.length); + this.startWordOffsets = []; + this.startWordOffsets.push(fullPos); + + // TODO: remove i 1000 + while (i<1000) { + var pos = string.search(/[ \t\n\f-\.\,]/); + if (pos == -1) + break; + + // whitespace start + fullPos += pos; + string = string.substr(pos); + ////console.log("fullPos: " + fullPos + ", pos: " + pos + ", string: ", string); + + // remove whitespaces + var pos = string.search(/[^ \t\n\f-\.\,]/); + if (pos == -1) + break; + + // whitespace end + fullPos += pos; + string = string.substr(pos); + + ////console.log("fullPos: " + fullPos); + this.startWordOffsets.push(fullPos); + + i++; + } + //console.log("startWordOffsets: ", this.startWordOffsets); + //console.groupEnd(); + }; + AttributedStringIterator.prototype = { + getEndIndex: function(pos){ + if (typeof(pos) == "undefined") + return this.endIndex; + + var string = this.text.substr(pos, this.endIndex - pos); + + var posEndOfLine = string.search(/[\n]/); + if (posEndOfLine == -1) + return this.endIndex; + else + return pos + posEndOfLine; + }, + getBeginIndex: function(){ + return this.beginIndex; + }, + isWhitespace: function(pos){ + var str = this.text[pos]; + var whitespaceChars = " \t\n\f"; + + return (whitespaceChars.indexOf(str) != -1); + }, + isNewLine: function(pos){ + var str = this.text[pos]; + var whitespaceChars = "\n"; + + return (whitespaceChars.indexOf(str) != -1); + }, + preceding: function(pos){ + //console.group("[AttributedStringIterator.preceding]"); + for(var i in this.startWordOffsets) { + var startWordOffset = this.startWordOffsets[i]; + if (pos < startWordOffset && i>0) { + //console.log("startWordOffset: " + this.startWordOffsets[i-1]); + //console.groupEnd(); + return this.startWordOffsets[i-1]; + } + } + //console.log("pos: " + pos); + //console.groupEnd(); + return this.startWordOffsets[i]; + }, + following: function(pos){ + //console.group("[AttributedStringIterator.following]"); + for(var i in this.startWordOffsets) { + var startWordOffset = this.startWordOffsets[i]; + if (pos < startWordOffset && i>0) { + //console.log("startWordOffset: " + this.startWordOffsets[i]); + //console.groupEnd(); + return this.startWordOffsets[i]; + } + } + //console.log("pos: " + pos); + //console.groupEnd(); + return this.startWordOffsets[i]; + }, + ltrim: function(str){ + var patt2=/^\s+/g; + return str.replace(patt2, ""); + }, + rtrim: function(str){ + var patt2=/\s+$/g; + return str.replace(patt2, ""); + }, + getLayout: function(start, limit){ + return this.text.substr(start, limit - start); + }, + getCharAtPos: function(pos) { + return this.text[pos]; + } + }; + + var LineBreakMeasurer = function(paper, x, y, text, fontAttrs){ + this.paper = paper; + this.text = new AttributedStringIterator(text); + this.fontAttrs = fontAttrs; + + if (this.text.getEndIndex() - this.text.getBeginIndex() < 1) { + throw {message: "Text must contain at least one character.", code: "IllegalArgumentException"}; + } + + //this.measurer = new TextMeasurer(paper, this.text, this.fontAttrs); + this.limit = this.text.getEndIndex(); + this.pos = this.start = this.text.getBeginIndex(); + + this.rafaelTextObject = this.paper.text(x, y, this.text.text).attr(fontAttrs).attr("text-anchor", "start"); + this.svgTextObject = this.rafaelTextObject[0]; + }; + LineBreakMeasurer.prototype = { + nextOffset: function(wrappingWidth, offsetLimit, requireNextWord) { + //console.group("[nextOffset]"); + var nextOffset = this.pos; + if (this.pos < this.limit) { + if (offsetLimit <= this.pos) { + throw {message: "offsetLimit must be after current position", code: "IllegalArgumentException"}; + } + + var charAtMaxAdvance = this.getLineBreakIndex(this.pos, wrappingWidth); + //charAtMaxAdvance --; + //console.log("charAtMaxAdvance:", charAtMaxAdvance, ", [" + this.text.getCharAtPos(charAtMaxAdvance) + "]"); + + if (charAtMaxAdvance == this.limit) { + nextOffset = this.limit; + //console.log("charAtMaxAdvance == this.limit"); + } else if (this.text.isNewLine(charAtMaxAdvance)) { + //console.log("isNewLine"); + nextOffset = charAtMaxAdvance+1; + } else if (this.text.isWhitespace(charAtMaxAdvance)) { + // TODO: find next noSpaceChar + //return nextOffset; + nextOffset = this.text.following(charAtMaxAdvance); + } else { + // Break is in a word; back up to previous break. + /* + var testPos = charAtMaxAdvance + 1; + if (testPos == this.limit) { + console.error("hbz..."); + } else { + nextOffset = this.text.preceding(charAtMaxAdvance); + } + */ + nextOffset = this.text.preceding(charAtMaxAdvance); + + if (nextOffset <= this.pos) { + nextOffset = Math.max(this.pos+1, charAtMaxAdvance); + } + } + } + if (nextOffset > offsetLimit) { + nextOffset = offsetLimit; + } + //console.log("nextOffset: " + nextOffset); + //console.groupEnd(); + return nextOffset; + }, + nextLayout: function(wrappingWidth) { + //console.groupCollapsed("[nextLayout]"); + if (this.pos < this.limit) { + var requireNextWord = false; + var layoutLimit = this.nextOffset(wrappingWidth, this.limit, requireNextWord); + //console.log("layoutLimit:", layoutLimit); + if (layoutLimit == this.pos) { + //console.groupEnd(); + return null; + } + var result = this.text.getLayout(this.pos, layoutLimit); + //console.log("layout: \"" + result + "\""); + + // remove end of line + + //var posEndOfLine = this.text.getEndIndex(this.pos); + //if (posEndOfLine < result.length) + // result = result.substr(0, posEndOfLine); + + this.pos = layoutLimit; + + //console.groupEnd(); + return result; + } else { + //console.groupEnd(); + return null; + } + }, + getLineBreakIndex: function(pos, wrappingWidth) { + //console.group("[getLineBreakIndex]"); + //console.log("pos:"+pos + ", text: \""+ this.text.text.replace(/\n/g, "_").substr(pos, 1) + "\""); + + var bb = this.rafaelTextObject.getBBox(); + + var charNum = -1; + try { + var svgPoint = this.svgTextObject.getStartPositionOfChar(pos); + //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.blue}); + svgPoint.x = svgPoint.x + wrappingWidth; + //svgPoint.y = bb.y; + //console.log("svgPoint:", svgPoint); + + //var dot = this.paper.ellipse(svgPoint.x, svgPoint.y, 1, 1).attr({"stroke-width": 0, fill: Color.red}); + + charNum = this.svgTextObject.getCharNumAtPosition(svgPoint); + } catch (e){ + console.warn("getStartPositionOfChar error, pos:" + pos); + /* + var testPos = pos + 1; + if (testPos < this.limit) { + return testPos + } + */ + } + //console.log("charNum:", charNum); + if (charNum == -1) { + //console.groupEnd(); + return this.text.getEndIndex(pos); + } else { + // When case there is new line between pos and charnum then use this new line + var newLineIndex = this.text.getEndIndex(pos); + if (newLineIndex < charNum ) { + console.log("newLineIndex <= charNum, newLineIndex:"+newLineIndex+", charNum:"+charNum, "\"" + this.text.text.substr(newLineIndex+1).replace(/\n/g, "?") + "\""); + //console.groupEnd(); + + return newLineIndex; + } + + //var charAtMaxAdvance = this.text.text.substring(charNum, charNum + 1); + var charAtMaxAdvance = this.text.getCharAtPos(charNum); + //console.log("!!charAtMaxAdvance: " + charAtMaxAdvance); + //console.groupEnd(); + return charNum; + } + }, + getPosition: function() { + return this.pos; + } + }; \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/js/Polyline.js b/src/main/resources/static/diagram-viewer/js/Polyline.js new file mode 100644 index 00000000..e7e4c301 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/Polyline.js @@ -0,0 +1,387 @@ +/** + * Class to generate polyline + * + * @author Dmitry Farafonov + */ + +var ANCHOR_TYPE= { + main: "main", + middle: "middle", + first: "first", + last: "last" +}; + +function Anchor(uuid, type, x, y) { + this.uuid = uuid; + this.x = x + this.y = y + this.type = (type == ANCHOR_TYPE.middle) ? ANCHOR_TYPE.middle : ANCHOR_TYPE.main; +}; +Anchor.prototype = { + uuid: null, + x: 0, + y: 0, + type: ANCHOR_TYPE.main, + isFirst: false, + isLast: false, + ndex: 0, + typeIndex: 0 +}; + +function Polyline(uuid, points, strokeWidth) { + /* Array on coordinates: + * points: [{x: 410, y: 110}, 1 + * {x: 570, y: 110}, 1 2 + * {x: 620, y: 240}, 2 3 + * {x: 750, y: 270}, 3 4 + * {x: 650, y: 370}]; 4 + */ + this.points = points; + + /* + * path for graph + * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] + */ + this.path = []; + + this.anchors = []; + + if (strokeWidth) this.strokeWidth = strokeWidth; + + this.closePath = false; + + this.init(); +}; + +Polyline.prototype = { + id: null, + points: [], + path: [], + anchors: [], + strokeWidth: 1, + radius: 15, + showDetails: false, + element: null, + isDefaultConditionAvailable: false, + closePath: false, + + init: function(points){ + var linesCount = this.getLinesCount(); + if (linesCount < 1) + return; + + this.normalizeCoordinates(); + + // create anchors + + this.pushAnchor(ANCHOR_TYPE.first, this.getLine(0).x1, this.getLine(0).y1); + + for(var i = 1; i < linesCount; i++){ + var line1 = this.getLine(i-1), + line2 = this.getLine(i); + + //this.pushAnchor(ANCHOR_TYPE.middle, line1.x1 + line1.x2-line1.x1, line1.y1 + line1.y2-line1.y1); + this.pushAnchor(ANCHOR_TYPE.main, line1.x2, line1.y2); + //this.pushAnchor(ANCHOR_TYPE.middle, line2.x1 + line2.x2-line2.x1, line2.y1 + line2.y2-line2.y1); + } + + this.pushAnchor(ANCHOR_TYPE.last, this.getLine(linesCount-1).x2, this.getLine(linesCount-1).y2); + + this.rebuildPath(); + }, + + normalizeCoordinates: function(){ + for(var i=0; i < this.points.length; i++){ + this.points[i].x = parseFloat(this.points[i].x); + this.points[i].y = parseFloat(this.points[i].y); + } + }, + + getLinesCount: function(){ + return this.points.length-1; + }, + _getLine: function(i){ + return {x1: this.points[i].x, y1: this.points[i].y, x2: this.points[i+1].x, y2: this.points[i+1].y}; + }, + getLine: function(i){ + var line = this._getLine(i); + line.angle = this.getLineAngle(i) ; + return line; + }, + getLineAngle: function(i){ + var line = this._getLine(i); + return Math.atan2(line.y2 - line.y1, line.x2 - line.x1); + }, + getLineLengthX: function(i){ + var line = this.getLine(i); + return (line.x2 - line.x1); + }, + getLineLengthY: function(i){ + var line = this.getLine(i); + return (line.y2 - line.y1); + }, + getLineLength: function(i){ + var line = this.getLine(i); + return Math.sqrt(Math.pow(this.getLineLengthX(i), 2) + Math.pow(this.getLineLengthY(i), 2)); + }, + + getAnchors: function(){ + // + // ???? + return this.anchors; + }, + getAnchorsCount: function(type){ + if (!type) + return this.anchors.length; + else { + var count = 0; + for(var i=0; i < this.getAnchorsCount(); i++){ + var anchor = this.anchors[i]; + if (anchor.getType() == type) { + count++; + } + } + return count; + } + }, + + pushAnchor: function(type, x, y, index){ + if (type == ANCHOR_TYPE.first) { + index = 0; + typeIndex = 0; + } else if (type == ANCHOR_TYPE.last) { + index = this.getAnchorsCount(); + typeIndex = 0; + } else if (!index) { + index = this.anchors.length; + } else { + // anchors, , index + //var anchor = this.getAnchor() + for(var i=0; i < this.getAnchorsCount(); i++){ + var anchor = this.anchors[i]; + if (anchor.index > index) { + anchor.index++; + anchor.typeIndex++; + } + } + } + + var anchor = new Anchor(this.id, ANCHOR_TYPE.main, x, y, index, typeIndex); + + this.anchors.push(anchor); + }, + + getAnchor: function(position){ + return this.anchors[position]; + }, + + getAnchorByType: function(type, position){ + if (type == ANCHOR_TYPE.first) + return this.anchors[0]; + if (type == ANCHOR_TYPE.last) + return this.anchors[this.getAnchorsCount()-1]; + + for(var i=0; i < this.getAnchorsCount(); i++){ + var anchor = this.anchors[i]; + if (anchor.type == type) { + if( position == anchor.position) + return anchor; + } + } + return null; + }, + + addNewPoint: function(position, x, y){ + // + for(var i = 0; i < this.getLinesCount(); i++){ + var line = this.getLine(i); + if (x > line.x1 && x < line.x2 && y > line.y1 && y < line.y2) { + this.points.splice(i+1,0,{x: x, y: y}); + break; + } + } + + this.rebuildPath(); + }, + + rebuildPath: function(){ + var path = []; + + for(var i = 0; i < this.getAnchorsCount(); i++){ + var anchor = this.getAnchor(i); + + var pathType = "" + if (i==0) + pathType = "M"; + else + pathType = "L"; + +// TODO: save previous points and calculate new path just if points are updated, and then save currents values as previous + + var targetX = anchor.x, targetY = anchor.y; + if (i>0 && i < this.getAnchorsCount()-1) { + // get new x,y + var cx = anchor.x, cy = anchor.y; + + // pivot point of prev line + var AO = this.getLineLength(i-1); + if (AO < this.radius) { + AO = this.radius; + } + + this.isDefaultConditionAvailable = (this.isDefaultConditionAvailable || (i == 1 && AO > 10)); + //console.log("isDefaultConditionAvailable", this.isDefaultConditionAvailable); + + var ED = this.getLineLengthY(i-1) * this.radius / AO; + var OD = this.getLineLengthX(i-1) * this.radius / AO; + targetX = anchor.x - OD; + targetY = anchor.y - ED; + + if (AO < 2*this.radius && i>1) { + targetX = anchor.x - this.getLineLengthX(i-1)/2; + targetY = anchor.y - this.getLineLengthY(i-1)/2;; + } + + // pivot point of next line + var AO = this.getLineLength(i); + if (AO < this.radius) { + AO = this.radius; + } + var ED = this.getLineLengthY(i) * this.radius / AO; + var OD = this.getLineLengthX(i) * this.radius / AO; + var nextSrcX = anchor.x + OD; + var nextSrcY = anchor.y + ED; + + if (AO < 2*this.radius && i 10)); + //console.log("-- isDefaultConditionAvailable", this.isDefaultConditionAvailable); + } + + // anti smoothing + if (this.strokeWidth%2 == 1) { + targetX += 0.5; + targetY += 0.5; + } + + path.push([pathType, targetX, targetY]); + + if (i>0 && i < this.getAnchorsCount()-1) { + path.push(["C", ax, ay, bx, by, zx, zy]); + } + } + + if (this.closePath) { + console.log("closePath:", this.closePath); + path.push(["Z"]); + } + + this.path = path; + }, + + transform: function(transformation){ + this.element.transform(transformation); + }, + attr: function(attrs){ + //console.log("attrs: " +attrs, "", this.element); + // TODO: foreach and set each + this.element.attr(attrs); + } +}; + +function Polygone(points, strokeWidth) { + /* Array on coordinates: + * points: [{x: 410, y: 110}, 1 + * {x: 570, y: 110}, 1 2 + * {x: 620, y: 240}, 2 3 + * {x: 750, y: 270}, 3 4 + * {x: 650, y: 370}]; 4 + */ + this.points = points; + + /* + * path for graph + * [["M", x1, y1], ["L", x2, y2], ["C", ax, ay, bx, by, x3, y3], ["L", x3, y3]] + */ + this.path = []; + + this.anchors = []; + + if (strokeWidth) this.strokeWidth = strokeWidth; + + this.closePath = true; + this.init(); +}; + + +/* + * Poligone is inherited from Poliline: draws closedPath of polyline + */ + +var Foo = function () { }; +Foo.prototype = Polyline.prototype; + +Polygone.prototype = new Foo(); + +Polygone.prototype.rebuildPath = function(){ + var path = []; + //console.log("Polygone rebuildPath"); + for(var i = 0; i < this.getAnchorsCount(); i++){ + var anchor = this.getAnchor(i); + + var pathType = "" + if (i==0) + pathType = "M"; + else + pathType = "L"; + + var targetX = anchor.x, targetY = anchor.y; + + // anti smoothing + if (this.strokeWidth%2 == 1) { + targetX += 0.5; + targetY += 0.5; + } + + path.push([pathType, targetX, targetY]); + } + if (this.closePath) + path.push(["Z"]); + + this.path = path; +}; +/* +Polygone.prototype.transform = function(transformation){ + this.element.transform(transformation); +}; +*/ \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js b/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js new file mode 100644 index 00000000..eadbe9c3 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/ProcessDiagramCanvas.js @@ -0,0 +1,2172 @@ +/** + * Represents a canvas on which BPMN 2.0 constructs can be drawn. + * + * Some of the icons used are licenced under a Creative Commons Attribution 2.5 + * License, see http://www.famfamfam.com/lab/icons/silk/ + * + * @see ProcessDiagramGenerator + * @author (Java) Joram Barrez + * @author (Javascript) Dmitry Farafonov + */ + +//Color.Cornsilk + +var ARROW_HEAD_SIMPLE = "simple"; +var ARROW_HEAD_EMPTY = "empty"; +var ARROW_HEAD_FILL = "FILL"; +var MULTILINE_VERTICAL_ALIGN_TOP = "top"; +var MULTILINE_VERTICAL_ALIGN_MIDDLE = "middle"; +var MULTILINE_VERTICAL_ALIGN_BOTTOM = "bottom"; +var MULTILINE_HORIZONTAL_ALIGN_LEFT = "start"; +var MULTILINE_HORIZONTAL_ALIGN_MIDDLE = "middle"; +var MULTILINE_HORIZONTAL_ALIGN_RIGHT = "end"; + +// Predefined sized +var TEXT_PADDING = 3; +var ARROW_WIDTH = 4; +var CONDITIONAL_INDICATOR_WIDTH = 16; +var MARKER_WIDTH = 12; +var ANNOTATION_TEXT_PADDING = 7; + +// Colors +var TASK_COLOR = Color.OldLace; // original: Color.get(255, 255, 204); +var TASK_STROKE_COLOR = Color.black; /*Color.SlateGrey; */ +//var EXPANDED_SUBPROCESS_ATTRS = Color.black; /*Color.SlateGrey; */ +var BOUNDARY_EVENT_COLOR = Color.white; +var CONDITIONAL_INDICATOR_COLOR = Color.get(255, 255, 255); +var HIGHLIGHT_COLOR = Color.Firebrick1; +//var SEQUENCEFLOW_COLOR = Color.DimGrey; +var SEQUENCEFLOW_COLOR = Color.black; + +var CATCHING_EVENT_COLOR = Color.black; /* Color.SlateGrey; */ +var START_EVENT_COLOR = Color.get(251,251,251); +var START_EVENT_STROKE_COLOR = Color.black; /* Color.SlateGrey; */ +var END_EVENT_COLOR = Color.get(251,251,251); +//var END_EVENT_STROKE_COLOR = Color.black; +var NONE_END_EVENT_COLOR = Color.Firebrick4; +var NONE_END_EVENT_STROKE_COLOR = Color.Firebrick4; +var ERROR_END_EVENT_COLOR = Color.Firebrick; +var ERROR_END_EVENT_STROKE_COLOR = Color.Firebrick; +//var LABEL_COLOR = Color.get(112, 146, 190); +var LABEL_COLOR = Color.get(72, 106, 150); + +// Fonts +var NORMAL_FONT = {font: "10px Arial", opacity: 1, fill: Color.black}; +var LABEL_FONT = {font: "11px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR}; +var LABEL_FONT_SMOOTH = {font: "10px Arial", "font-style":"italic", opacity: 1, "fill": LABEL_COLOR, stroke: LABEL_COLOR, "stroke-width":.4}; +var TASK_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; +var TASK_FONT_SMOOTH = {font: "11px Arial", opacity: 1, fill: Color.black, stroke: LABEL_COLOR, "stroke-width":.4}; +var POOL_LANE_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; +var EXPANDED_SUBPROCESS_FONT = {font: "11px Arial", opacity: 1, fill: Color.black}; + +// Strokes +var NORMAL_STROKE = 1; +var SEQUENCEFLOW_STROKE = 1.5; +var SEQUENCEFLOW_HIGHLIGHT_STROKE = 2; +var THICK_TASK_BORDER_STROKE = 2.5; +var GATEWAY_TYPE_STROKE = 3.2; +var END_EVENT_STROKE = NORMAL_STROKE+2; +var MULTI_INSTANCE_STROKE = 1.3; +var EVENT_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "stroke-dasharray": ". "}; +//var EXPANDED_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "fill": Color.FloralWhite}; +var EXPANDED_SUBPROCESS_ATTRS = {"stroke": Color.black, "stroke-width": NORMAL_STROKE, "fill": Color.WhiteSmoke}; +var NON_INTERRUPTING_EVENT_STROKE = "- "; + +var TASK_CORNER_ROUND = 10; +var EXPANDED_SUBPROCESS_CORNER_ROUND = 10; + +// icons +var ICON_SIZE = 16; +var ICON_PADDING = 4; +var USERTASK_IMAGE = "images/deployer/user.png"; +var SCRIPTTASK_IMAGE = "images/deployer/script.png"; +var SERVICETASK_IMAGE = "images/deployer/service.png"; +var RECEIVETASK_IMAGE = "images/deployer/receive.png"; +var SENDTASK_IMAGE = "images/deployer/send.png"; +var MANUALTASK_IMAGE = "images/deployer/manual.png"; +var BUSINESS_RULE_TASK_IMAGE = "images/deployer/business_rule.png"; +var TIMER_IMAGE = "images/deployer/timer.png"; +var MESSAGE_CATCH_IMAGE = "images/deployer/message_catch.png"; +var MESSAGE_THROW_IMAGE = "images/deployer/message_throw.png"; +var ERROR_THROW_IMAGE = "images/deployer/error_throw.png"; +var ERROR_CATCH_IMAGE = "images/deployer/error_catch.png"; +var SIGNAL_CATCH_IMAGE = "images/deployer/signal_catch.png"; +var SIGNAL_THROW_IMAGE = "images/deployer/signal_throw.png"; +var MULTIPLE_CATCH_IMAGE = "images/deployer/multiple_catch.png"; + + +var ObjectType = { + ELLIPSE: "ellipse", + FLOW: "flow", + RECT: "rect", + RHOMBUS: "rhombus" +}; + +function OBJ(type){ + this.c = null; + this.type = type; + this.nestedElements = []; +}; +OBJ.prototype = { + +}; + +var CONNECTION_TYPE = { + SEQUENCE_FLOW: "sequence_flow", + MESSAGE_FLOW: "message_flow", + ASSOCIATION: "association" +}; + +var ProcessDiagramCanvas = function(){ +}; +ProcessDiagramCanvas.prototype = { +// var DefaultProcessDiagramCanvas = { + canvasHolder: "holder", + canvasWidth: 0, + canvasHeight: 0, + paint: Color.black, + strokeWidth: 0, + font: null, + fontSmoothing: null, + + g: null, + ninjaPaper: null, + + objects: [], + + processDefinitionId: null, + activity: null, + + frame: null, + + + debug: false, + + /** + * Creates an empty canvas with given width and height. + */ + init: function(width, height, processDefinitionId){ + this.canvasWidth = width; + this.canvasHeight = height; + + // TODO: name it as 'canvasName' + if (!processDefinitionId) + processDefinitionId = "holder"; + + this.processDefinitionId = processDefinitionId; + this.canvasHolder = this.processDefinitionId; + + var h = document.getElementById(this.canvasHolder); + if (!h) return; + + h.style.width = this.canvasWidth; + h.style.height = this.canvasHeight; + + this.g = Raphael(this.canvasHolder); + this.g.clear(); + + //this.setPaint(Color.DimGrey); + this.setPaint(Color.black); + //this.setPaint(Color.white); + this.setStroke(NORMAL_STROKE); + + //this.setFont("Arial", 11); + this.setFont(NORMAL_FONT); + //this.font = this.g.getFont("Arial"); + + this.fontSmoothing = true; + + // ninja! + var RaphaelOriginal = Raphael; + this.ninjaPaper =(function (local_raphael) { + var paper = local_raphael(1, 1, 1, 1, processDefinitionId); + return paper; + })(Raphael.ninja()); + Raphael = RaphaelOriginal; + }, + setPaint: function(color){ + this.paint = color; + }, + getPaint: function(){ + return this.paint; + }, + setStroke: function(strokeWidth){ + this.strokeWidth = strokeWidth; + }, + getStroke: function(){ + return this.strokeWidth; + }, + /* + setFont: function(family, weight, style, stretch){ + this.font = this.g.getFont(family, weight); + }, + */ + setFont: function(font){ + this.font = font; + }, + getFont: function(){ + return this.font; + }, + drawShaddow: function(object){ + var border = object.clone(); + border.attr({"stroke-width": this.strokeWidth + 6, + "stroke": Color.white, + "fill": Color.white, + "opacity": 1, + "stroke-dasharray":null}); + //border.toBack(); + object.toFront(); + + return border; + }, + + setConextObject: function(obj){ + this.contextObject = obj; + }, + getConextObject: function(){ + return this.contextObject; + }, + setContextToElement: function(object){ + var contextObject = this.getConextObject(); + object.id = contextObject.id; + object.data("contextObject", contextObject); + }, + onClick: function(event, instance, element){ + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + //console.log("["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.click) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.click.apply(event, args); + } + }, + onRightClick: function(event, instance, element){ + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + //console.log("[%s], activityId: %s (RIGHTCLICK)", contextObject.getProperty("type"), contextObject.getId()); + + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.rightClick) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.rightClick.apply(event, args); + } + }, + onHoverIn: function(event, instance, element){ + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + + var border = instance.g.getById(contextObject.id + "_border"); + border.attr("opacity", 0.3); + + // provide callback + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.over) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.over.apply(event, args); + } + }, + onHoverOut: function(event, instance, element){ + var overlay = element; + var set = overlay.data("set"); + var contextObject = overlay.data("contextObject"); + + var border = instance.g.getById(contextObject.id + "_border"); + border.attr("opacity", 0.0); + // provide callback + if (ProcessDiagramGenerator.options && ProcessDiagramGenerator.options.on && ProcessDiagramGenerator.options.on.out) { + var args = [instance, element, contextObject]; + ProcessDiagramGenerator.options.on.out.apply(event, args); + } + }, + addHandlers: function(set, x, y, width, height, type){ + var contextObject = this.getConextObject(); + + var cx = x+width/2, cy = y+height/2; + if (type == "event") { + var border = this.g.ellipse(cx, cy, width/2+4, height/2+4); + var overlay = this.g.ellipse(cx, cy, width/2, height/2); + } else if (type == "gateway") { + // rhombus + var border = this.g.path( "M" + (x - 4) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y + height + 4) + + "L" + (x + width + 4) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y - 4) + + "z" ); + var overlay = this.g.path( "M" + x + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y + height) + + "L" + (x + width) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + y + + "z" ); + } else if (type == "task") { + var border = this.g.rect(x - 4, y - 4, width+9, height+9, TASK_CORNER_ROUND+4); + var overlay = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); + } + + border.attr({stroke: Color.get(132,112,255)/*Color.Tan1*/,"stroke-width": 4, opacity: 0.0}); + border.id = contextObject.id + "_border"; + + set.push(border); + + overlay.attr({stroke: Color.Orange,"stroke-width": 3, fill: Color.get(0,0,0), opacity: 0.0, cursor: "hand"}); + overlay.data("set",set); + overlay.id = contextObject.id; + overlay.data("contextObject",contextObject); + + var instance = this; + overlay.mousedown(function(event){if (event.button == 2) instance.onRightClick(event, instance, this);}); + overlay.click(function(event){instance.onClick(event, instance, this);}); + overlay.hover(function(event){instance.onHoverIn(event, instance, this);}, function(event){instance.onHoverOut(event, instance, this);}); + }, + + /* + * Start Events: + * + * drawNoneStartEvent + * drawTimerStartEvent + * drawMessageStartEvent + * drawErrorStartEvent + * drawSignalStartEvent + * _drawStartEventImage + * _drawStartEvent + */ + + drawNoneStartEvent: function(x, y, width, height) { + this.g.setStart(); + + var isInterrupting = undefined; + this._drawStartEvent(x, y, width, height, isInterrupting, null); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawTimerStartEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + + this._drawStartEvent(x, y, width, height, isInterrupting, null); + + var cx = x + width/2 - this.getStroke()/4; + var cy = y + height/2 - this.getStroke()/4; + + var w = width*.9;// - this.getStroke()*2; + var h = height*.9;// - this.getStroke()*2; + + this._drawClock(cx, cy, w, h); + + if (this.gebug) + var center = this.g.ellipse(cx, cy, 3, 3).attr({stroke:"none", fill: Color.green}); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawMessageStartEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + + this._drawStartEvent(x, y, width, height, isInterrupting, null); + + this._drawStartEventImage(x, y, width, height, MESSAGE_CATCH_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawErrorStartEvent: function(x, y, width, height, name) { + this.g.setStart(); + var isInterrupting = undefined; + this._drawStartEvent(x, y, width, height, isInterrupting); + + this._drawStartEventImage(x, y, width, height, ERROR_CATCH_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawSignalStartEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawStartEvent(x, y, width, height, isInterrupting, null); + + this._drawStartEventImage(x, y, width, height, SIGNAL_CATCH_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawMultipleStartEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + + this._drawStartEvent(x, y, width, height, isInterrupting, null); + + var cx = x + width/2 - this.getStroke()/4; + var cy = y + height/2 - this.getStroke()/4; + + var w = width*1; + var h = height*1; + + this._drawPentagon(cx, cy, w, h); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + _drawStartEventImage: function(x, y, width, height, image){ + var cx = x + width/2 - this.getStroke()/2; + var cy = y + height/2 - this.getStroke()/2; + + var w = width*.65;// - this.getStroke()*2; + var h = height*.65;// - this.getStroke()*2; + + var img = this.g.image(image, cx-w/2, cy-h/2, w, h); + }, + _drawStartEvent: function(x, y, width, height, isInterrupting){ + var originalPaint = this.getPaint(); + if (typeof(START_EVENT_STROKE_COLOR) != "undefined") + this.setPaint(START_EVENT_STROKE_COLOR); + + + width -= this.strokeWidth / 2; + height -= this.strokeWidth / 2; + + x = x + width/2; + y = y + height/2; + + var circle = this.g.ellipse(x, y, width/2, height/2); + + circle.attr({"stroke-width": this.strokeWidth, + "stroke": this.paint, + //"stroke": START_EVENT_STROKE_COLOR, + "fill": START_EVENT_COLOR}); + + // white shaddow + this.drawShaddow(circle); + + if (isInterrupting!=null && isInterrupting!=undefined && !isInterrupting) + circle.attr({"stroke-dasharray": NON_INTERRUPTING_EVENT_STROKE}); + + this.setContextToElement(circle); + + + this.setPaint(originalPaint); + }, + + /* + * End Events: + * + * drawNoneEndEvent + * drawErrorEndEvent + * drawMessageEndEvent + * drawSignalEndEvent + * drawMultipleEndEvent + * _drawEndEventImage + * _drawNoneEndEvent + */ + + drawNoneEndEvent: function(x, y, width, height) { + this.g.setStart(); + + this._drawNoneEndEvent(x, y, width, height, null, "noneEndEvent"); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawErrorEndEvent: function(x, y, width, height) { + this.g.setStart(); + var type = "errorEndEvent"; + this._drawNoneEndEvent(x, y, width, height, null, type); + + this._drawEndEventImage(x, y, width, height, ERROR_THROW_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawMessageEndEvent: function(x, y, width, height, name) { + this.g.setStart(); + var type = "errorEndEvent"; + this._drawNoneEndEvent(x, y, width, height, null, type); + + this._drawEndEventImage(x, y, width, height, MESSAGE_THROW_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawSignalEndEvent: function(x, y, width, height, name) { + this.g.setStart(); + var type = "errorEndEvent"; + this._drawNoneEndEvent(x, y, width, height, null, type); + + this._drawEndEventImage(x, y, width, height, SIGNAL_THROW_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawMultipleEndEvent: function(x, y, width, height, name) { + this.g.setStart(); + var type = "errorEndEvent"; + this._drawNoneEndEvent(x, y, width, height, null, type); + + var cx = x + width/2;// - this.getStroke(); + var cy = y + height/2;// - this.getStroke(); + + var w = width*1; + var h = height*1; + + var filled = true; + this._drawPentagon(cx, cy, w, h, filled); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawTerminateEndEvent: function(x, y, width, height) { + this.g.setStart(); + var type = "errorEndEvent"; + this._drawNoneEndEvent(x, y, width, height, null, type); + + var cx = x + width/2;// - this.getStroke()/2; + var cy = y + height/2;// - this.getStroke()/2; + + var w = width/2*.6; + var h = height/2*.6; + + var circle = this.g.ellipse(cx, cy, w, h).attr({fill: Color.black}); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + _drawEndEventImage: function(x, y, width, height, image){ + var cx = x + width/2 - this.getStroke()/2; + var cy = y + height/2 - this.getStroke()/2; + + var w = width*.65; + var h = height*.65; + + var img = this.g.image(image, cx-w/2, cy-h/2, w, h); + }, + + _drawNoneEndEvent: function(x, y, width, height, image, type) { + var originalPaint = this.getPaint(); + if (typeof(CATCHING_EVENT_COLOR) != "undefined") + this.setPaint(CATCHING_EVENT_COLOR); + + var strokeColor = this.getPaint(); + var fillColor = this.getPaint(); + + if (type == "errorEndEvent") { + strokeColor = ERROR_END_EVENT_STROKE_COLOR; + fillColor = ERROR_END_EVENT_COLOR; + } else if (type == "noneEndEvent") { + strokeColor = NONE_END_EVENT_STROKE_COLOR; + fillColor = NONE_END_EVENT_COLOR; + } else + + // event circles + width -= this.strokeWidth / 2; + height -= this.strokeWidth / 2; + + x = x + width/2;// + this.strokeWidth/2; + y = y + width/2;// + this.strokeWidth/2; + + // outerCircle + var outerCircle = this.g.ellipse(x, y, width/2, height/2); + + // white shaddow + var shaddow = this.drawShaddow(outerCircle); + + outerCircle.attr({"stroke-width": this.strokeWidth, + "stroke": strokeColor, + "fill": fillColor}); + + var innerCircleX = x; + var innerCircleY = y; + var innerCircleWidth = width/2 - 2; + var innerCircleHeight = height/2 - 2; + var innerCircle = this.g.ellipse(innerCircleX, innerCircleY, innerCircleWidth, innerCircleHeight); + innerCircle.attr({"stroke-width": this.strokeWidth, + "stroke": strokeColor, + "fill": Color.white}); + + // TODO: implement it + //var originalPaint = this.getPaint(); + //this.g.setPaint(BOUNDARY_EVENT_COLOR); + + this.setPaint(originalPaint); + }, + + /* + * Catching Events: + * + * drawCatchingTimerEvent + * drawCatchingErrorEvent + * drawCatchingSignalEvent + * drawCatchingMessageEvent + * drawCatchingMultipleEvent + * _drawCatchingEventImage + * _drawCatchingEvent + */ + + + drawCatchingTimerEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, isInterrupting, null); + + var innerCircleWidth = width - 4; + var innerCircleHeight = height - 4; + + var cx = x + width/2 - this.getStroke()/4; + var cy = y + height/2 - this.getStroke()/4; + + var w = innerCircleWidth*.9;// - this.getStroke()*2; + var h = innerCircleHeight*.9;// - this.getStroke()*2; + + this._drawClock(cx, cy, w, h); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawCatchingErrorEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, isInterrupting, null); + + this._drawCatchingEventImage(x, y, width, height, ERROR_CATCH_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawCatchingSignalEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, isInterrupting, null); + + this._drawCatchingEventImage(x, y, width, height, SIGNAL_CATCH_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawCatchingMessageEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, isInterrupting, null); + + this._drawCatchingEventImage(x, y, width, height, MESSAGE_CATCH_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawCatchingMultipleEvent: function(x, y, width, height, isInterrupting, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, isInterrupting, null); + + var cx = x + width/2 - this.getStroke(); + var cy = y + height/2 - this.getStroke(); + + var w = width*.9; + var h = height*.9; + + this._drawPentagon(cx, cy, w, h); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + _drawCatchingEventImage: function(x, y, width, height, image){ + var innerCircleWidth = width - 4; + var innerCircleHeight = height - 4; + + var cx = x + width/2 - this.getStroke()/2; + var cy = y + height/2 - this.getStroke()/2; + + var w = innerCircleWidth*.6;// - this.getStroke()*2; + var h = innerCircleHeight*.6;// - this.getStroke()*2; + + var img = this.g.image(image, cx-w/2, cy-h/2, w, h); + }, + + _drawCatchingEvent: function(x, y, width, height, isInterrupting, image) { + var originalPaint = this.getPaint(); + if (typeof(CATCHING_EVENT_COLOR) != "undefined") + this.setPaint(CATCHING_EVENT_COLOR); + + // event circles + width -= this.strokeWidth / 2; + height -= this.strokeWidth / 2; + + x = x + width/2;// + this.strokeWidth/2; + y = y + width/2;// + this.strokeWidth/2; + + // outerCircle + var outerCircle = this.g.ellipse(x, y, width/2, height/2); + + // white shaddow + var shaddow = this.drawShaddow(outerCircle); + + //console.log("isInterrupting: " + isInterrupting, "x:" , x, "y:",y); + if (isInterrupting!=null && isInterrupting!=undefined && !isInterrupting) + outerCircle.attr({"stroke-dasharray": NON_INTERRUPTING_EVENT_STROKE}); + + outerCircle.attr({"stroke-width": this.strokeWidth, + "stroke": this.getPaint(), + "fill": BOUNDARY_EVENT_COLOR}); + + var innerCircleX = x; + var innerCircleY = y; + var innerCircleRadiusX = width/2 - 4; + var innerCircleRadiusY = height/2 - 4; + var innerCircle = this.g.ellipse(innerCircleX, innerCircleY, innerCircleRadiusX, innerCircleRadiusY); + innerCircle.attr({"stroke-width": this.strokeWidth, + "stroke": this.getPaint()}); + + if (image) { + var imageWidth = imageHeight = innerCircleRadiusX*1.2 + this.getStroke()*2; + var imageX = innerCircleX-imageWidth/2 - this.strokeWidth/2; + var imageY = innerCircleY-imageWidth/2 - this.strokeWidth/2; + var img = this.g.image(image, imageX, imageY, imageWidth, imageHeight); + } + + this.setPaint(originalPaint); + + var set = this.g.set(); + set.push(outerCircle, innerCircle, shaddow); + this.setContextToElement(outerCircle); + + // TODO: add shapes to set + + /* + var st = this.g.set(); + st.push( + this.g.ellipse(innerCircleX, innerCircleY, 2, 2), + this.g.ellipse(imageX, imageY, 2, 2) + ); + st.attr({fill: "red", "stroke-width":0}); + */ + }, + + /* + * Catching Events: + * + * drawThrowingNoneEvent + * drawThrowingSignalEvent + * drawThrowingMessageEvent + * drawThrowingMultipleEvent + */ + + drawThrowingNoneEvent: function(x, y, width, height, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, null, null); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawThrowingSignalEvent: function(x, y, width, height, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, null, null); + + this._drawCatchingEventImage(x, y, width, height, SIGNAL_THROW_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawThrowingMessageEvent: function(x, y, width, height, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, null, null); + + this._drawCatchingEventImage(x, y, width, height, MESSAGE_THROW_IMAGE); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + drawThrowingMultipleEvent: function(x, y, width, height, name) { + this.g.setStart(); + this._drawCatchingEvent(x, y, width, height, null, null); + + var cx = x + width/2 - this.getStroke(); + var cy = y + height/2 - this.getStroke(); + + var w = width*.9; + var h = height*.9; + + var filled = true; + this._drawPentagon(cx, cy, w, h, filled); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "event"); + }, + + /* + * Draw flows: + * + * _connectFlowToActivity + * _drawFlow + * _drawDefaultSequenceFlowIndicator + * drawSequenceflow + * drawMessageflow + * drawAssociation + * _drawCircleTail + * _drawArrowHead + * _drawConditionalSequenceFlowIndicator + * drawSequenceflowWithoutArrow + */ + + _connectFlowToActivity: function(sourceActivityId, destinationActivityId, waypoints){ + var sourceActivity = this.g.getById(sourceActivityId); + var destinationActivity = this.g.getById(destinationActivityId); + if (sourceActivity == null || destinationActivity == null) { + if (sourceActivity == null) + console.error("source activity["+sourceActivityId+"] not found"); + else + console.error("destination activity["+destinationActivityId+"] not found"); + return null; + } + var bbSourceActivity = sourceActivity.getBBox() + var bbDestinationActivity = destinationActivity.getBBox() + + var path = []; + var newWaypoints = []; + for(var i = 0; i < waypoints.length; i++){ + var pathType = "" + if (i==0) + pathType = "M"; + else + pathType = "L"; + + path.push([pathType, waypoints[i].x, waypoints[i].y]); + newWaypoints.push({x:waypoints[i].x, y:waypoints[i].y}); + } + + var ninjaPathSourceActivity = this.ninjaPaper.path(sourceActivity.realPath); + var ninjaPathDestinationActivity = this.ninjaPaper.path(destinationActivity.realPath); + var ninjaBBSourceActivity = ninjaPathSourceActivity.getBBox(); + var ninjaBBDestinationActivity = ninjaPathDestinationActivity.getBBox(); + + // set target of the flow to the center of the taskObject + var newPath = path; + var originalSource = {x: newPath[0][1], y: newPath[0][2]}; + var originalTarget = {x: newPath[newPath.length-1][1], y: newPath[newPath.length-1][2]}; + newPath[0][1] = ninjaBBSourceActivity.x + (ninjaBBSourceActivity.x2 - ninjaBBSourceActivity.x ) / 2; + newPath[0][2] = ninjaBBSourceActivity.y + (ninjaBBSourceActivity.y2 - ninjaBBSourceActivity.y ) / 2; + newPath[newPath.length-1][1] = ninjaBBDestinationActivity.x + (ninjaBBDestinationActivity.x2 - ninjaBBDestinationActivity.x ) / 2; + newPath[newPath.length-1][2] = ninjaBBDestinationActivity.y + (ninjaBBDestinationActivity.y2 - ninjaBBDestinationActivity.y ) / 2; + + var ninjaPathFlowObject = this.ninjaPaper.path(newPath); + var ninjaBBFlowObject = ninjaPathFlowObject.getBBox(); + + var intersectionsSource = Raphael.pathIntersection(ninjaPathSourceActivity.realPath, ninjaPathFlowObject.realPath); + var intersectionsDestination = Raphael.pathIntersection(ninjaPathDestinationActivity.realPath, ninjaPathFlowObject.realPath); + var intersectionSource = intersectionsSource.pop(); + var intersectionDestination = intersectionsDestination.pop(); + + if (intersectionSource != undefined) { + if (this.gebug) { + var diameter = 5; + var dotOriginal = this.g.ellipse(originalSource.x, originalSource.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Pink}); + var dot = this.g.ellipse(intersectionSource.x, intersectionSource.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Green}); + } + + newWaypoints[0].x = intersectionSource.x; + newWaypoints[0].y = intersectionSource.y; + } + if (intersectionDestination != undefined) { + if (this.gebug) { + var diameter = 5; + var dotOriginal = this.g.ellipse(originalTarget.x, originalTarget.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Red}); + var dot = this.g.ellipse(intersectionDestination.x, intersectionDestination.y, diameter, diameter).attr({"fill": Color.white, "stroke": Color.Blue}); + } + + newWaypoints[newWaypoints.length-1].x = intersectionDestination.x; + newWaypoints[newWaypoints.length-1].y = intersectionDestination.y; + } + + this.ninjaPaper.clear(); + return newWaypoints; + }, + + _drawFlow: function(waypoints, conditional, isDefault, highLighted, withArrowHead, connectionType){ + var originalPaint = this.getPaint(); + var originalStroke = this.getStroke(); + + this.setPaint(SEQUENCEFLOW_COLOR); + this.setStroke(SEQUENCEFLOW_STROKE); + + if (highLighted) { + this.setPaint(HIGHLIGHT_COLOR); + this.setStroke(SEQUENCEFLOW_HIGHLIGHT_STROKE); + } + +// TODO: generate polylineId or do something!! + var uuid = Raphael.createUUID(); + + var contextObject = this.getConextObject(); + var newWaypoints = waypoints; + if (contextObject) { + var newWaypoints = this._connectFlowToActivity(contextObject.sourceActivityId, contextObject.destinationActivityId, waypoints); + + if (!newWaypoints) { + console.error("Error draw flow from '"+contextObject.sourceActivityId+"' to '"+contextObject.destinationActivityId+"' "); + return; + } + } + var polyline = new Polyline(uuid, newWaypoints, this.getStroke()); + //var polyline = new Polyline(waypoints, 3); + + polyline.element = this.g.path(polyline.path); + polyline.element.attr("stroke-width", this.getStroke()); + polyline.element.attr("stroke", this.getPaint()); + + if (contextObject) { + polyline.element.id = contextObject.id; + polyline.element.data("contextObject", contextObject); + } else { + polyline.element.id = uuid; + } + + + /* + polyline.element.mouseover(function(){ + this.attr({"stroke-width": NORMAL_STROKE + 2}); + }).mouseout(function(){ + this.attr({"stroke-width": NORMAL_STROKE}); + }); + */ + + var last = polyline.getAnchorsCount()-1; + var x = polyline.getAnchor(last).x; + var y = polyline.getAnchor(last).y; + //var c = this.g.ellipse(x, y, 5, 5); + + var lastLineIndex = polyline.getLinesCount()-1; + var line = polyline.getLine(lastLineIndex); + var firstLine = polyline.getLine(0); + + var arrowHead = null, + circleTail = null, + defaultSequenceFlowIndicator = null, + conditionalSequenceFlowIndicator = null; + + if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) { + circleTail = this._drawCircleTail(firstLine, connectionType); + } + if(withArrowHead) + arrowHead = this._drawArrowHead(line, connectionType); + + //console.log("isDefault: ", isDefault, ", isDefaultConditionAvailable: ", polyline.isDefaultConditionAvailable); + if (isDefault && polyline.isDefaultConditionAvailable) { + //var angle = polyline.getLineAngle(0); + //console.log("firstLine", firstLine); + defaultSequenceFlowIndicator = this._drawDefaultSequenceFlowIndicator(firstLine); + } + + if (conditional) { + conditionalSequenceFlowIndicator = this._drawConditionalSequenceFlowIndicator(firstLine); + } + + // draw flow name + var flowName = contextObject.name; + if (flowName) { + var xPointArray = contextObject.xPointArray; + var yPointArray = contextObject.yPointArray; + var textX = xPointArray[0] < xPointArray[1] ? xPointArray[0] : xPointArray[1]; + var textY = yPointArray[0] < yPointArray[1] ? yPointArray[1] : yPointArray[0]; + // fix xy + textX += 20; + textY -= 10; + this.g.text(textX, textY, flowName).attr(LABEL_FONT); + } + + var st = this.g.set(); + st.push(polyline.element, arrowHead, circleTail, conditionalSequenceFlowIndicator); + polyline.element.data("set", st); + polyline.element.data("withArrowHead", withArrowHead); + + var polyCloneAttrNormal = {"stroke-width": this.getStroke() + 5, stroke: Color.get(132,112,255), opacity: 0.0, cursor: "hand"}; + var polyClone = st.clone().attr(polyCloneAttrNormal).hover(function () { + //if (polyLine.data("isSelected")) return; + polyClone.attr({opacity: 0.2}); + }, function () { + //if (polyLine.data("isSelected")) return; + polyClone.attr({opacity: 0.0}); + }); + polyClone.data("objectId", polyline.element.id); + polyClone.click(function(){ + var instance = this; + var objectId = instance.data("objectId"); + var object = this.paper.getById(objectId); + var contextObject = object.data("contextObject"); + if (contextObject) { + console.log("[flow], objectId: " + object.id +", flow: " + contextObject.flow); + ProcessDiagramGenerator.showFlowInfo(contextObject); + } + }).dblclick(function(){ + console.log("!!! DOUBLE CLICK !!!"); + }).hover(function (mouseEvent) { + var instance = this; + var objectId = instance.data("objectId"); + var object = this.paper.getById(objectId); + var contextObject = object.data("contextObject"); + if (contextObject) + ProcessDiagramGenerator.showFlowInfo(contextObject); + }); + polyClone.data("parentId", uuid); + + if (!connectionType || connectionType == CONNECTION_TYPE.SEQUENCE_FLOW) + polyline.element.attr("stroke-width", this.getStroke()); + else if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) + polyline.element.attr({"stroke-dasharray": "--"}); + else if (connectionType == CONNECTION_TYPE.ASSOCIATION) + polyline.element.attr({"stroke-dasharray": ". "}); + + this.setPaint(originalPaint); + this.setStroke(originalStroke); + }, + + _drawDefaultSequenceFlowIndicator: function(line) { + //console.log("line: ", line); + + var len = 10; c = len/2, f = 8; + var defaultIndicator = this.g.path("M" + (-c) + " " + 0 + "L" + (c) + " " + 0); + defaultIndicator.attr("stroke-width", this.getStroke()+0); + defaultIndicator.attr("stroke", this.getPaint()); + + + var cosAngle = Math.cos((line.angle)); + var sinAngle = Math.sin((line.angle)); + + var dx = f * cosAngle; + var dy = f * sinAngle; + + var x1 = line.x1 + dx + 0*c*cosAngle; + var y1 = line.y1 + dy + 0*c*sinAngle; + + defaultIndicator.transform("t" + (x1) + "," + (y1) + ""); + defaultIndicator.transform("...r" + Raphael.deg(line.angle - 3*Math.PI / 4) + " " + 0 + " " + 0); + /* + var c0 = this.g.ellipse(0, 0, 1, 1).attr({stroke: Color.Blue}); + c0.transform("t" + (line.x1) + "," + (line.y1) + ""); + var center = this.g.ellipse(0, 0, 1, 1).attr({stroke: Color.Red}); + center.transform("t" + (line.x1+dx) + "," + (line.y1+dy) + ""); + */ + + return defaultIndicator; + }, + + drawSequenceflow: function(waypoints, conditional, isDefault, highLighted) { + var withArrowHead = true; + this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.SEQUENCE_FLOW); + }, + + drawMessageflow: function(waypoints, highLighted) { + var withArrowHead = true; + var conditional=isDefault=false; + this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.MESSAGE_FLOW); + }, + + drawAssociation: function(waypoints, withArrowHead, highLighted) { + var withArrowHead = withArrowHead; + var conditional=isDefault=false; + this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.ASSOCIATION); + }, + + _drawCircleTail: function(line, connectionType){ + var diameter = ARROW_WIDTH/2*1.5; + + // anti smoothing + if (this.strokeWidth%2 == 1) + line.x1 += .5, line.y1 += .5; + + var circleTail = this.g.ellipse(line.x1, line.y1, diameter, diameter); + circleTail.attr("fill", Color.white); + circleTail.attr("stroke", this.getPaint()); + + return circleTail; + }, + + _drawArrowHead: function(line, connectionType){ + var doubleArrowWidth = 2 * ARROW_WIDTH; + + if (connectionType == CONNECTION_TYPE.ASSOCIATION) + var arrowHead = this.g.path("M-" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "L 0 0 L" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth); + else + var arrowHead = this.g.path("M0 0L-" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "L" + (ARROW_WIDTH/2+.5) + " -" + doubleArrowWidth + "z"); + + //arrowHead.transform("t" + 0 + ",-" + this.getStroke() + ""); + + // anti smoothing + if (this.strokeWidth%2 == 1) + line.x2 += .5, line.y2 += .5; + + arrowHead.transform("t" + line.x2 + "," + line.y2 + ""); + arrowHead.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); + + if (!connectionType || connectionType == CONNECTION_TYPE.SEQUENCE_FLOW) + arrowHead.attr("fill", this.getPaint()); + else if (connectionType == CONNECTION_TYPE.MESSAGE_FLOW) + arrowHead.attr("fill", Color.white); + + arrowHead.attr("stroke-width", this.getStroke()); + arrowHead.attr("stroke", this.getPaint()); + + return arrowHead; + }, + + /* + drawArrowHead2: function(srcX, srcY, targetX, targetY) { + var doubleArrowWidth = 2 * ARROW_WIDTH; + + //var arrowHead = this.g.path("M-" + ARROW_WIDTH/2 + " -" + doubleArrowWidth + "L0 0" + "L" + ARROW_WIDTH/2 + " -" + doubleArrowWidth + "z"); + + var arrowHead = this.g.path("M0 0L-" + ARROW_WIDTH/1.5 + " -" + doubleArrowWidth + "L" + ARROW_WIDTH/1.5 + " -" + doubleArrowWidth + "z"); + //var c = DefaultProcessDiagramCanvas.g.ellipse(0, 0, 3, 3); + //c.transform("t"+targetX+","+targetY+""); + + var angle = Math.atan2(targetY - srcY, targetX - srcX); + + arrowHead.transform("t"+targetX+","+targetY+""); + arrowHead.transform("...r" + Raphael.deg(angle - Math.PI / 2) + " "+0+" "+0); + + //console.log(arrowHead.transform()); + //console.log("--> " + Raphael.deg(angle - Math.PI / 2)); + + arrowHead.attr("fill", this.getPaint()); + arrowHead.attr("stroke", this.getPaint()); + + / * + // shaddow + var c0 = arrowHead.clone(); + c0.transform("...t-1 1"); + c0.attr("stroke-width", this.strokeWidth); + c0.attr("stroke", Color.black); + c0.attr("opacity", 0.15); + c0.toBack(); + * / + }, + */ + + _drawConditionalSequenceFlowIndicator: function(line){ + var horizontal = (CONDITIONAL_INDICATOR_WIDTH * 0.7); + var halfOfHorizontal = horizontal / 2; + var halfOfVertical = CONDITIONAL_INDICATOR_WIDTH / 2; + + var uuid = null; + var waypoints = [{x: 0, y: 0}, + {x: -halfOfHorizontal, y: halfOfVertical}, + {x: 0, y: CONDITIONAL_INDICATOR_WIDTH}, + {x: halfOfHorizontal, y: halfOfVertical}]; + /* + var polyline = new Polyline(uuid, waypoints, this.getStroke()); + polyline.element = this.g.path(polyline.path); + polyline.element.attr("stroke-width", this.getStroke()); + polyline.element.attr("stroke", this.getPaint()); + polyline.element.id = uuid; + */ + var polygone = new Polygone(waypoints, this.getStroke()); + polygone.element = this.g.path(polygone.path); + polygone.element.attr("fill", Color.white); + + polygone.transform("t" + line.x1 + "," + line.y1 + ""); + polygone.transform("...r" + Raphael.deg(line.angle - Math.PI / 2) + " " + 0 + " " + 0); + + + var cosAngle = Math.cos((line.angle)); + var sinAngle = Math.sin((line.angle)); + + //polygone.element.attr("stroke-width", this.getStroke()); + //polygone.element.attr("stroke", this.getPaint()); + + polygone.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); + + return polygone.element; + }, + + drawSequenceflowWithoutArrow: function(waypoints, conditional, isDefault, highLighted) { + var withArrowHead = false; + this._drawFlow(waypoints, conditional, isDefault, highLighted, withArrowHead, CONNECTION_TYPE.SEQUENCE_FLOW); + }, + + /* + * Draw artifacts + */ + + drawPoolOrLane: function(x, y, width, height, name){ + // anti smoothing + if (this.strokeWidth%2 == 1) + x = Math.round(x) + .5, y = Math.round(y) + .5; + + // shape + var rect = this.g.rect(x, y, width, height); + var attr = {"stroke-width": NORMAL_STROKE, stroke: TASK_STROKE_COLOR}; + rect.attr(attr); + + // Add the name as text, vertical + if(name != null && name.length > 0) { + var attr = POOL_LANE_FONT; + + // Include some padding + var availableTextSpace = height - 6; + + // Create rotation for derived font + var truncated = this.fitTextToWidth(name, availableTextSpace); + var realWidth = this.getStringWidth(truncated, attr); + var realHeight = this.getStringHeight(truncated, attr); + + //console.log("truncated:", truncated, ", height:", height, ", realHeight:", realHeight, ", availableTextSpace:", availableTextSpace, ", realWidth:", realWidth); + var newX = x + 2 + realHeight*1 - realHeight/2; + var newY = 3 + y + availableTextSpace - (availableTextSpace - realWidth) / 2 - realWidth/2; + var textElement = this.g.text(newX, newY, truncated).attr(attr); + //console.log(".getBBox(): ", t.getBBox()); + textElement.transform("r" + Raphael.deg(270 * Math.PI/180) + " " + newX + " " + newY); + } + + // TODO: add to set + }, + + _drawTask: function(name, x, y, width, height, thickBorder) { + var originalPaint = this.getPaint(); + this.setPaint(TASK_COLOR); + + // anti smoothing + if (this.strokeWidth%2 == 1) + x = Math.round(x) + .5, y = Math.round(y) + .5; + + // shape + var shape = this.g.rect(x, y, width, height, TASK_CORNER_ROUND); + var attr = {"stroke-width": this.strokeWidth, stroke: TASK_STROKE_COLOR, fill: this.getPaint()}; + shape.attr(attr); + //shape.attr({fill: "90-"+this.getPaint()+"-" + Color.get(250, 250, 244)}); + + var contextObject = this.getConextObject(); + if (contextObject) { + shape.id = contextObject.id; + shape.data("contextObject", contextObject); + } + + //var activity = this.getConextObject(); + //console.log("activity: " + activity.getId(), activity); + //Object.clone(activity); + + /* + c.mouseover(function(){ + this.attr({"stroke-width": NORMAL_STROKE + 2}); + }).mouseout(function(){ + this.attr({"stroke-width": NORMAL_STROKE}); + }); + */ + + this.setPaint(originalPaint); + + // white shaddow + this.drawShaddow(shape); + + + if (thickBorder) { + shape.attr({"stroke-width": THICK_TASK_BORDER_STROKE}); + } else { + //g.draw(rect); + } + + // text + if (name) { + var fontAttr = TASK_FONT; + + // Include some padding + var paddingX = 5; + var paddingY = 5; + var availableTextSpace = width - paddingX*2; + + // TODO: this.setFont + // var originalFont = this.getFont(); + // this.setFont(TASK_FONT) + /* + var truncated = this.fitTextToWidth(name, availableTextSpace); + var realWidth = this.getStringWidth(truncated, fontAttr); + var realHeight = this.getStringHeight(truncated, fontAttr); + + //var t = this.g.text(x + width/2 + realWidth*0/2 + paddingX*0, y + height/2, truncated).attr(fontAttr); + */ + //console.log("draw task name: " + name); + var boxWidth = width - (2 * TEXT_PADDING); + var boxHeight = height - ICON_SIZE - ICON_PADDING - ICON_PADDING - MARKER_WIDTH - 2 - 2; + var boxX = x + width/2 - boxWidth/2; + var boxY = y + height/2 - boxHeight/2 + ICON_PADDING + ICON_PADDING - 2 - 2; + /* + var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); + var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); + var boxX = x + width/2 - boxWidth/2; + var boxY = y + height/2 - boxHeight/2; + */ + + this.drawTaskLabel(name, boxX, boxY, boxWidth, boxHeight); + } + }, + + drawTaskLabel: function(text, x, y, boxWidth, boxHeight){ + var originalFont = this.getFont(); + this.setFont(TASK_FONT); + + this._drawMultilineText(text, x, y, boxWidth, boxHeight, MULTILINE_VERTICAL_ALIGN_MIDDLE, MULTILINE_HORIZONTAL_ALIGN_MIDDLE); + + this.setFont(originalFont); + }, + + drawAnnotationText: function(text, x, y, width, height){ + //this._drawMultilineText(text, x, y, width, height, "start"); + + var originalPaint = this.getPaint(); + var originalFont = this.getFont(); + + this.setPaint(Color.black); + this.setFont(TASK_FONT); + + this._drawMultilineText(text, x, y, width, height, MULTILINE_VERTICAL_ALIGN_TOP, MULTILINE_HORIZONTAL_ALIGN_LEFT); + + this.setPaint(originalPaint); + this.setFont(originalFont); + }, + + drawLabel: function(text, x, y, width, height){ + //this._drawMultilineText(text, x, y, width, height, "start"); + + var originalPaint = this.getPaint(); + var originalFont = this.getFont(); + + this.setPaint(LABEL_COLOR); + //this.setFont(LABEL_FONT); + this.setFont(LABEL_FONT_SMOOTH); + + // predefined box width for labels + // TODO: use label width as is, but not height (for stretching) + if (!width || !height) { + width = 100; + height = 0; + } + + // TODO: remove it. It is debug + x = x - width/2; + + this._drawMultilineText(text, x, y, width, height, MULTILINE_VERTICAL_ALIGN_TOP, MULTILINE_HORIZONTAL_ALIGN_MIDDLE); + + this.setPaint(originalPaint); + this.setFont(originalFont); + }, + + /* + drawMultilineLabel: function(text, x, y){ + var originalFont = this.getFont(); + this.setFont(LABEL_FONT_SMOOTH); + + var boxWidth = 80; + x = x - boxWidth/2 + + this._drawMultilineText(text, x, y, boxWidth, null, "middle"); + this.setFont(originalFont); + }, + */ + + getStringWidth: function(text, fontAttrs){ + var textElement = this.g.text(0, 0, text).attr(fontAttrs).hide(); + var bb = textElement.getBBox(); + + //console.log("string width: ", t.getBBox().width); + return textElement.getBBox().width; + }, + getStringHeight: function(text, fontAttrs){ + var textElement = this.g.text(0, 0, text).attr(fontAttrs).hide(); + var bb = textElement.getBBox(); + + //console.log("string height: ", t.getBBox().height); + return textElement.getBBox().height; + }, + fitTextToWidth: function(original, width) { + var text = original; + + // TODO: move attr on parameters + var attr = {font: "11px Arial", opacity: 0}; + + // remove length for "..." + var dots = this.g.text(0, 0, "...").attr(attr).hide(); + var dotsBB = dots.getBBox(); + + var maxWidth = width - dotsBB.width; + + var textElement = this.g.text(0, 0, text).attr(attr).hide(); + var bb = textElement.getBBox(); + + // it's a little bit incorrect with "..." + while (bb.width > maxWidth && text.length > 0) { + text = text.substring(0, text.length - 1); + textElement.attr({"text": text}); + bb = textElement.getBBox(); + } + + // remove element from paper + textElement.remove(); + + if (text != original) { + text = text + "..."; + } + + return text; + }, + wrapTextToWidth: function(original, width){ + + //return original; + + var text = original; + var wrappedText = "\n"; + + // TODO: move attr on parameters + var attr = {font: "11px Arial", opacity: 0}; + + var textElement = this.g.text(0, 0, wrappedText).attr(attr).hide(); + var bb = textElement.getBBox(); + + var resultText = ""; + var i = 0, j = 0; + while (text.length > 0) { + while (bb.width < width && text.length>0) { + // remove "\n" + wrappedText = wrappedText.substring(0,wrappedText.length-1); + // add new char, add "\n" + wrappedText = wrappedText + text.substring(0,1) + "\n"; + text = text.substring(1); + + textElement.attr({"text": wrappedText}); + bb = textElement.getBBox(); + i++; + if (i>200) break; + } + // remove "\n" + wrappedText = wrappedText.substring(0, wrappedText.length - 1); + + if (text.length == 0) { + resultText += wrappedText; + break; + } + + // return last char to text + text = wrappedText.substring(wrappedText.length-1) + text; + // remove last char from wrappedText + wrappedText = wrappedText.substring(0, wrappedText.length-1) + "\n"; + + textElement.attr({"text": wrappedText}); + bb = textElement.getBBox(); + + //console.log(">> ", wrappedText, ", ", text); + resultText += wrappedText; + wrappedText = "\n"; + + j++; + if (j>20) break; + } + // remove element from paper + textElement.remove(); + + return resultText; + }, + + wrapTextToWidth2: function(original, width){ + var text = original; + var wrappedText = "\n"; + + // TODO: move attr on parameters + var attr = {font: "11px Arial", opacity: 0}; + + var textElement = this.g.text(0, 0, wrappedText).attr(attr).hide(); + var bb = textElement.getBBox(); + + var resultText = ""; + var i = 0, j = 0; + while (text.length > 0) { + while (bb.width < width && text.length>0) { + // remove "\n" + wrappedText = wrappedText.substring(0,wrappedText.length-1); + // add new char, add "\n" + wrappedText = wrappedText + text.substring(0,1) + "\n"; + text = text.substring(1); + + textElement.attr({"text": wrappedText}); + bb = textElement.getBBox(); + i++; + if (i>200) break; + } + // remove "\n" + wrappedText = wrappedText.substring(0, wrappedText.length - 1); + + if (text.length == 0) { + resultText += wrappedText; + break; + } + + // return last char to text + text = wrappedText.substring(wrappedText.length-1) + text; + // remove last char from wrappedText + wrappedText = wrappedText.substring(0, wrappedText.length-1) + "\n"; + + textElement.attr({"text": wrappedText}); + bb = textElement.getBBox(); + + //console.log(">> ", wrappedText, ", ", text); + resultText += wrappedText; + wrappedText = "\n"; + + j++; + if (j>20) break; + } + // remove element from paper + textElement.remove(); + + return resultText; + }, + + drawUserTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(USERTASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawScriptTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(SCRIPTTASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawServiceTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(SERVICETASK_IMAGE, x + ICON_PADDING, y + ICON_PADDING, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawReceiveTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(RECEIVETASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawSendTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(SENDTASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawManualTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(MANUALTASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawBusinessRuleTask: function(name, x, y, width, height) { + this.g.setStart(); + this._drawTask(name, x, y, width, height); + var img = this.g.image(BUSINESS_RULE_TASK_IMAGE, x + 7, y + 7, ICON_SIZE, ICON_SIZE); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawExpandedSubProcess: function(name, x, y, width, height, isTriggeredByEvent){ + this.g.setStart(); + // anti smoothing + if (this.strokeWidth%2 == 1) + x = Math.round(x) + .5, y = Math.round(y) + .5; + + // shape + var rect = this.g.rect(x, y, width, height, EXPANDED_SUBPROCESS_CORNER_ROUND); + + // Use different stroke (dashed) + if(isTriggeredByEvent) { + rect.attr(EVENT_SUBPROCESS_ATTRS); + } else { + rect.attr(EXPANDED_SUBPROCESS_ATTRS); + } + + this.setContextToElement(rect); + + var fontAttr = EXPANDED_SUBPROCESS_FONT; + + // Include some padding + var paddingX = 10; + var paddingY = 5; + var availableTextSpace = width - paddingX*2; + + var truncated = this.fitTextToWidth(name, availableTextSpace); + var realWidth = this.getStringWidth(truncated, fontAttr); + var realHeight = this.getStringHeight(truncated, fontAttr); + + var textElement = this.g.text(x + width/2 - realWidth*0/2 + 0*paddingX, y + realHeight/2 + paddingY, truncated).attr(fontAttr); + + var set = this.g.setFinish(); + // TODO: Expanded Sub Process may has specific handlers + //this.addHandlers(set, x, y, width, height, "task"); + }, + + drawCollapsedSubProcess: function(name, x, y, width, height, isTriggeredByEvent) { + this.g.setStart(); + this._drawCollapsedTask(name, x, y, width, height, false); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + drawCollapsedCallActivity: function(name, x, y, width, height) { + this.g.setStart(); + this._drawCollapsedTask(name, x, y, width, height, true); + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "task"); + }, + + _drawCollapsedTask: function(name, x, y, width, height, thickBorder) { + // The collapsed marker is now visualized separately + this._drawTask(name, x, y, width, height, thickBorder); + }, + + drawCollapsedMarker: function(x, y, width, height){ + // rectangle + var rectangleWidth = MARKER_WIDTH; + var rectangleHeight = MARKER_WIDTH; + + // anti smoothing + if (this.strokeWidth%2 == 1) + y += .5; + + var rect = this.g.rect(x + (width - rectangleWidth) / 2, y + height - rectangleHeight - 3, rectangleWidth, rectangleHeight); + + // plus inside rectangle + var cx = rect.attr("x") + rect.attr("width")/2; + var cy = rect.attr("y") + rect.attr("height")/2; + + var line = this.g.path( + "M" + cx + " " + (cy+2) + "L" + cx + " " + (cy-2) + + "M" + (cx-2) + " " + cy + "L" + (cx+2) + " " + cy + ).attr({"stroke-width": this.strokeWidth}); + + }, + + drawActivityMarkers: function(x, y, width, height, multiInstanceSequential, multiInstanceParallel, collapsed){ + if (collapsed) { + if (!multiInstanceSequential && !multiInstanceParallel) { + this.drawCollapsedMarker(x, y, width, height); + } else { + this.drawCollapsedMarker(x - MARKER_WIDTH / 2 - 2, y, width, height); + if (multiInstanceSequential) { + console.log("is collapsed and multiInstanceSequential"); + this.drawMultiInstanceMarker(true, x + MARKER_WIDTH / 2 + 2, y, width, height); + } else if (multiInstanceParallel) { + console.log("is collapsed and multiInstanceParallel"); + this.drawMultiInstanceMarker(false, x + MARKER_WIDTH / 2 + 2, y, width, height); + } + } + } else { + if (multiInstanceSequential) { + console.log("is multiInstanceSequential"); + this.drawMultiInstanceMarker(true, x, y, width, height); + } else if (multiInstanceParallel) { + console.log("is multiInstanceParallel"); + this.drawMultiInstanceMarker(false, x, y, width, height); + } + } + }, + + drawGateway: function(x, y, width, height) { + + var rhombus = this.g.path( "M" + x + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + (y + height) + + "L" + (x + width) + " " + (y + (height / 2)) + + "L" + (x + (width / 2)) + " " + y + + "z" + ); + + // white shaddow + this.drawShaddow(rhombus); + + rhombus.attr("stroke-width", this.strokeWidth); + rhombus.attr("stroke", Color.SlateGrey); + rhombus.attr({fill: Color.white}); + + this.setContextToElement(rhombus); + + return rhombus; + }, + + drawParallelGateway: function(x, y, width, height) { + this.g.setStart(); + + // rhombus + this.drawGateway(x, y, width, height); + + // plus inside rhombus + var originalStroke = this.getStroke(); + this.setStroke(GATEWAY_TYPE_STROKE); + + var plus = this.g.path( + "M" + (x + 10) + " " + (y + height / 2) + "L" + (x + width - 10) + " " + (y + height / 2) + // horizontal + "M" + (x + width / 2) + " " + (y + height - 10) + "L" + (x + width / 2) + " " + (y + 10) // vertical + ); + plus.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); + + this.setStroke(originalStroke); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "gateway"); + }, + + drawExclusiveGateway: function(x, y, width, height) { + this.g.setStart(); + + // rhombus + var rhombus = this.drawGateway(x, y, width, height); + + var quarterWidth = width / 4; + var quarterHeight = height / 4; + + // X inside rhombus + var originalStroke = this.getStroke(); + this.setStroke(GATEWAY_TYPE_STROKE); + + var iks = this.g.path( + "M" + (x + quarterWidth + 3) + " " + (y + quarterHeight + 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + 3 * quarterHeight - 3) + + "M" + (x + quarterWidth + 3) + " " + (y + 3 * quarterHeight - 3) + "L" + (x + 3 * quarterWidth - 3) + " " + (y + quarterHeight + 3) + ); + iks.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); + + this.setStroke(originalStroke); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "gateway"); + }, + + drawInclusiveGateway: function(x, y, width, height){ + this.g.setStart(); + + // rhombus + this.drawGateway(x, y, width, height); + + var diameter = width / 4; + + // circle inside rhombus + var originalStroke = this.getStroke(); + this.setStroke(GATEWAY_TYPE_STROKE); + var circle = this.g.ellipse(width/2 + x, height/2 + y, diameter, diameter); + circle.attr({"stroke-width": this.getStroke(), "stroke": this.getPaint()}); + + this.setStroke(originalStroke); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "gateway"); + }, + + drawEventBasedGateway: function(x, y, width, height){ + this.g.setStart(); + + // rhombus + this.drawGateway(x, y, width, height); + + var diameter = width / 2; + + // rombus inside rhombus + var originalStroke = this.getStroke(); + this.setStroke(GATEWAY_TYPE_STROKE); + + + // draw GeneralPath (polygon) + var n=5; + var angle = 2*Math.PI/n; + var x1Points = []; + var y1Points = []; + + for ( var index = 0; index < n; index++ ) { + var v = index*angle - Math.PI/2; + x1Points[index] = x + parseInt(Math.round(width/2)) + parseInt(Math.round((width/4)*Math.cos(v))); + y1Points[index] = y + parseInt(Math.round(height/2)) + parseInt(Math.round((height/4)*Math.sin(v))); + } + //g.drawPolygon(x1Points, y1Points, n); + + var path = ""; + for ( var index = 0; index < n; index++ ) { + if (index == 0) + path += "M"; + else + path += "L"; + path += x1Points[index] + "," + y1Points[index]; + } + path += "z"; + var polygone = this.g.path(path); + polygone.attr("stroke-width", this.strokeWidth); + polygone.attr("stroke", this.getPaint()); + + this.setStroke(originalStroke); + + var set = this.g.setFinish(); + this.addHandlers(set, x, y, width, height, "gateway"); + }, + + /* + * drawMultiInstanceMarker + * drawHighLight + * highLightFlow + */ + + drawMultiInstanceMarker: function(sequential, x, y, width, height) { + var rectangleWidth = MARKER_WIDTH; + var rectangleHeight = MARKER_WIDTH; + + // anti smoothing + if (this.strokeWidth%2 == 1) + x += .5;//, y += .5; + + var lineX = x + (width - rectangleWidth) / 2; + var lineY = y + height - rectangleHeight - 3; + + var originalStroke = this.getStroke(); + this.setStroke(MULTI_INSTANCE_STROKE); + + if (sequential) { + var line = this.g.path( + "M" + lineX + " " + lineY + "L" + (lineX + rectangleWidth) + " " + lineY + + "M" + lineX + " " + (lineY + rectangleHeight / 2) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight / 2) + + "M" + lineX + " " + (lineY + rectangleHeight) + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) + ).attr({"stroke-width": this.strokeWidth}); + } else { + var line = this.g.path( + "M" + lineX + " " + lineY + "L" + lineX + " " + (lineY + rectangleHeight) + + "M" + (lineX + rectangleWidth / 2) + " " + lineY + "L" + (lineX + rectangleWidth / 2) + " " + (lineY + rectangleHeight) + + "M" + (lineX + rectangleWidth) + " " + lineY + "L" + (lineX + rectangleWidth) + " " + (lineY + rectangleHeight) + ).attr({"stroke-width": this.strokeWidth}); + } + + this.setStroke(originalStroke); + }, + + drawHighLight: function(x, y, width, height){ + var originalPaint = this.getPaint(); + var originalStroke = this.getStroke(); + + this.setPaint(HIGHLIGHT_COLOR); + this.setStroke(THICK_TASK_BORDER_STROKE); + + //var c = this.g.rect(x - width/2 - THICK_TASK_BORDER_STROKE, y - height/2 - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE*2, height + THICK_TASK_BORDER_STROKE*2, 5); + var rect = this.g.rect(x - THICK_TASK_BORDER_STROKE, y - THICK_TASK_BORDER_STROKE, width + THICK_TASK_BORDER_STROKE*2, height + THICK_TASK_BORDER_STROKE*2, TASK_CORNER_ROUND); + rect.attr("stroke-width", this.strokeWidth); + rect.attr("stroke", this.getPaint()); + + this.setPaint(originalPaint); + this.setStroke(originalStroke); + }, + + highLightActivity: function(activityId){ + var shape = this.g.getById(activityId); + if (!shape) { + console.error("Activity " + activityId + " not found"); + return; + } + + var contextObject = shape.data("contextObject"); + if (contextObject) + console.log("--> highLightActivity: ["+contextObject.getProperty("type")+"], activityId: " + contextObject.getId()); + else + console.log("--> highLightActivity: ", shape, shape.data("contextObject")); + + shape.attr("stroke-width", THICK_TASK_BORDER_STROKE); + shape.attr("stroke", HIGHLIGHT_COLOR); + }, + + highLightFlow: function(flowId){ + var shapeFlow = this.g.getById(flowId); + if (!shapeFlow) { + console.error("Flow " + flowId + " not found"); + return; + } + + var contextObject = shapeFlow.data("contextObject"); + if (contextObject) + console.log("--> highLightFlow: ["+contextObject.id+"] " + contextObject.flow); + //console.log("--> highLightFlow: ", flow.flow, flow.data("set")); + + var st = shapeFlow.data("set"); + + st.attr("stroke-width", SEQUENCEFLOW_HIGHLIGHT_STROKE); + st.attr("stroke", HIGHLIGHT_COLOR); + var withArrowHead = shapeFlow.data("withArrowHead"); + if (withArrowHead) + st[1].attr("fill", HIGHLIGHT_COLOR); + + st.forEach(function(el){ + //console.log("---->", el); + //el.attr("") + }); + }, + + + _drawClock: function(cx, cy, width, height){ + + var circle = this.g.ellipse(cx, cy, 1, 1).attr({stroke:"none", fill: Color.get(232, 239, 241)}); + //var c = this.g.ellipse(cx, cy, width, height).attr({stroke:"none", fill: Color.red}); + //x = cx - width/2; + //y = cy - height/2; + + var clock = this.g.path( + /* outer circle */ "M15.5,2.374 C8.251,2.375,2.376,8.251,2.374,15.5 C2.376,22.748,8.251,28.623,15.5,28.627c7.249-0.004,13.124-5.879,13.125-13.127C28.624,8.251,22.749,2.375,15.5,2.374z" + + /* inner circle */ "M15.5,26.623 C8.909,26.615,4.385,22.09,4.375,15.5 C4.385,8.909,8.909,4.384,15.5,4.374c4.59,0.01,11.115,3.535,11.124,11.125C26.615,22.09,22.091,26.615,15.5,26.623z" + + /* 9 */ "M8.625,15.5c-0.001-0.552-0.448-0.999-1.001-1c-0.553,0-1,0.448-1,1c0,0.553,0.449,1,1,1C8.176,16.5,8.624,16.053,8.625,15.5z" + + /* 8 */ "M8.179,18.572c-0.478,0.277-0.642,0.889-0.365,1.367c0.275,0.479,0.889,0.641,1.365,0.365c0.479-0.275,0.643-0.887,0.367-1.367C9.27,18.461,8.658,18.297,8.179,18.572z" + + /* 10 */ "M9.18,10.696c-0.479-0.276-1.09-0.112-1.366,0.366s-0.111,1.09,0.365,1.366c0.479,0.276,1.09,0.113,1.367-0.366C9.821,11.584,9.657,10.973,9.18,10.696z" + + /* 2 */ "M22.822,12.428c0.478-0.275,0.643-0.888,0.366-1.366c-0.275-0.478-0.89-0.642-1.366-0.366c-0.479,0.278-0.642,0.89-0.366,1.367C21.732,12.54,22.344,12.705,22.822,12.428z" + + /* 7 */ "M12.062,21.455c-0.478-0.275-1.089-0.111-1.366,0.367c-0.275,0.479-0.111,1.09,0.366,1.365c0.478,0.277,1.091,0.111,1.365-0.365C12.704,22.344,12.54,21.732,12.062,21.455z" + + /* 11 */ "M12.062,9.545c0.479-0.276,0.642-0.888,0.366-1.366c-0.276-0.478-0.888-0.642-1.366-0.366s-0.642,0.888-0.366,1.366C10.973,9.658,11.584,9.822,12.062,9.545z" + + /* 4 */ "M22.823,18.572c-0.48-0.275-1.092-0.111-1.367,0.365c-0.275,0.479-0.112,1.092,0.367,1.367c0.477,0.275,1.089,0.113,1.365-0.365C23.464,19.461,23.3,18.848,22.823,18.572z" + + /* 2 */ "M19.938,7.813c-0.477-0.276-1.091-0.111-1.365,0.366c-0.275,0.48-0.111,1.091,0.366,1.367s1.089,0.112,1.366-0.366C20.581,8.702,20.418,8.089,19.938,7.813z" + + /* 3 */ "M23.378,14.5c-0.554,0.002-1.001,0.45-1.001,1c0.001,0.552,0.448,1,1.001,1c0.551,0,1-0.447,1-1C24.378,14.949,23.929,14.5,23.378,14.5z" + + /* arrows */ "M15.501,6.624c-0.552,0-1,0.448-1,1l-0.466,7.343l-3.004,1.96c-0.478,0.277-0.642,0.889-0.365,1.365c0.275,0.479,0.889,0.643,1.365,0.367l3.305-1.676C15.39,16.99,15.444,17,15.501,17c0.828,0,1.5-0.671,1.5-1.5l-0.5-7.876C16.501,7.072,16.053,6.624,15.501,6.624z" + + /* 9 */ "M15.501,22.377c-0.552,0-1,0.447-1,1s0.448,1,1,1s1-0.447,1-1S16.053,22.377,15.501,22.377z" + + /* 8 */ "M18.939,21.455c-0.479,0.277-0.643,0.889-0.366,1.367c0.275,0.477,0.888,0.643,1.366,0.365c0.478-0.275,0.642-0.889,0.366-1.365C20.028,21.344,19.417,21.18,18.939,21.455z" + + ""); + clock.attr({fill: Color.black, stroke: "none"}); + //clock.transform("t " + (cx-29.75/2) + " " + (cy-29.75/2)); + //clock.transform("...s 0.85"); + + //clock.transform("...s " + .85 + " " + .85); + clock.transform("t " + (-2.374) + " " + (-2.374) ); + clock.transform("...t -" + (15.5-2.374) + " -" + (15.5-2.374) ); + clock.transform("...s " + 1*(width/35) + " " + 1*(height/35)); + clock.transform("...T " + cx + " " + cy); + //clock.transform("t " + (cx-width/2) + " " + (cy-height/2)); + + //console.log(".getBBox(): ", clock.getBBox()); + //console.log(".attr(): ", c.attrs); + circle.attr("rx", clock.getBBox().width/2); + circle.attr("ry", clock.getBBox().height/2); + + //return circle + }, + + _drawPentagon: function(cx, cy, width, height, filled){ + // draw GeneralPath (polygon) + var n=5; + var angle = 2*Math.PI/n; + var waypoints = []; + + for ( var index = 0; index < n; index++ ) { + var v = index*angle - Math.PI/2; + var point = {}; + point.x = -width*1.2/2 + parseInt(Math.round(width*1.2/2)) + parseInt(Math.round((width*1.2/4)*Math.cos(v))); + point.y = -height*1.2/2 + parseInt(Math.round(height*1.2/2)) + parseInt(Math.round((height*1.2/4)*Math.sin(v))); + waypoints[index] = point; + } + + var polygone = new Polygone(waypoints, this.getStroke()); + polygone.element = this.g.path(polygone.path); + if (filled) + polygone.element.attr("fill", Color.black); + else + polygone.element.attr("fill", Color.white); + + polygone.element.transform("s " + 1*(width/35) + " " + 1*(height/35)); + polygone.element.transform("...T " + cx + " " + cy); + }, + + //_drawMultilineText: function(text, x, y, boxWidth, boxHeight, textAnchor) { + _drawMultilineText: function(text, x, y, boxWidth, boxHeight, verticalAlign, horizontalAlign) { + if (!text || text == "") + return; + + // Autostretch boxHeight if boxHeight is 0 + if (boxHeight == 0) + verticalAlign = MULTILINE_VERTICAL_ALIGN_TOP; + + //var TEXT_PADDING = 3; + var width = boxWidth; + if (boxHeight) + var height = boxHeight; + + var layouts = []; + + //var font = {font: "11px Arial", opacity: 1, "fill": LABEL_COLOR}; + var font = this.getFont(); + var measurer = new LineBreakMeasurer(this.g, x, y, text, font); + var lineHeight = measurer.rafaelTextObject.getBBox().height; + //console.log("text: ", text.replace(/\n/g, "?")); + + if (height) { + var availableLinesCount = parseInt(height/lineHeight); + //console.log("availableLinesCount: " + availableLinesCount); + } + + var i = 1; + while (measurer.getPosition() < measurer.text.getEndIndex()) { + var layout = measurer.nextLayout(width); + //console.log("LAYOUT: " + layout + ", getPosition: " + measurer.getPosition()); + + if (layout != null) { + // TODO: and check if measurer has next layout. If no then don't draw dots + if (!availableLinesCount || i < availableLinesCount) { + layouts.push(layout); + } else { + layouts.push(this.fitTextToWidth(layout + "...", boxWidth)); + break; + } + } + i++; + }; + //console.log(layouts); + + measurer.rafaelTextObject.attr({"text": layouts.join("\n")}); + + if (horizontalAlign) + measurer.rafaelTextObject.attr({"text-anchor": horizontalAlign}); // end, middle, start + + var bb = measurer.rafaelTextObject.getBBox(); + // TODO: there is somethin wrong with wertical align. May be: measurer.rafaelTextObject.attr({"y": y + height/2 - bb.height/2}) + measurer.rafaelTextObject.attr({"y": y + bb.height/2}); + //var bb = measurer.rafaelTextObject.getBBox(); + + if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_MIDDLE ) + measurer.rafaelTextObject.attr("x", x + boxWidth/2); + else if (measurer.rafaelTextObject.attr("text-anchor") == MULTILINE_HORIZONTAL_ALIGN_RIGHT ) + measurer.rafaelTextObject.attr("x", x + boxWidth); + + var boxStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "}; + //var box = this.g.rect(x+.5, y + .5, width, height).attr(boxStyle); + var textAreaCX = x + boxWidth/2; + var height = boxHeight; + if (!height) height = bb.height; + var textAreaCY = y + height/2; + var dotLeftTop = this.g.ellipse(x, y, 3, 3).attr({"stroke-width": 0, fill: Color.LightSteelBlue, stroke: "none"}).hide(); + var dotCenter = this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"}).hide(); + + /* + // real bbox + var bb = measurer.rafaelTextObject.getBBox(); + var rect = paper.rect(bb.x+.5, bb.y + .5, bb.width, bb.height).attr({"stroke-width": 1}); + */ + var rect = this.g.rect(x, y, boxWidth, height).attr({"stroke-width": 1}).attr(boxStyle).hide(); + var debugSet = this.g.set(); + debugSet.push(dotLeftTop, dotCenter, rect); + //debugSet.show(); + }, + + drawTextAnnotation: function(text, x, y, width, height){ + var lineLength = 18; + var path = []; + path.push(["M", x + lineLength, y]); + path.push(["L", x, y]); + path.push(["L", x, y + height]); + path.push(["L", x + lineLength, y + height]); + + path.push(["L", x + lineLength, y + height -1]); + path.push(["L", x + 1, y + height -1]); + path.push(["L", x + 1, y + 1]); + path.push(["L", x + lineLength, y + 1]); + path.push(["z"]); + + var textAreaLines = this.g.path(path); + + var boxWidth = width - (2 * ANNOTATION_TEXT_PADDING); + var boxHeight = height - (2 * ANNOTATION_TEXT_PADDING); + var boxX = x + width/2 - boxWidth/2; + var boxY = y + height/2 - boxHeight/2; + + // for debug + var rectStyle = {stroke: Color(112, 146, 190), "stroke-width": 1.0, "stroke-dasharray": "- "}; + var r = this.g.rect(boxX, boxY, boxWidth, boxHeight).attr(rectStyle); + // + + this.drawAnnotationText(text, boxX, boxY, boxWidth, boxHeight); + }, + + drawLabel111111111: function(text, x, y, width, height, labelAttrs){ + var debug = false; + + // text + if (text != null && text != undefined && text != "") { + var attr = LABEL_FONT; + + //console.log("x", x, "y", y, "width", width, "height", height ); + + wrappedText = text; + if (labelAttrs && labelAttrs.wrapWidth) { + wrappedText = this.wrapTextToWidth(wrappedText, labelAttrs.wrapWidth); + } + var realWidth = this.getStringWidth(wrappedText, attr); + var realHeight = this.getStringHeight(wrappedText, attr); + + var textAreaCX = x + width/2; + var textAreaCY = y + 3 + height + this.getStringHeight(wrappedText, attr)/2; + + var textX = textAreaCX; + var textY = textAreaCY; + + var textAttrs = {}; + if (labelAttrs && labelAttrs.align) { + switch (labelAttrs.align) { + case "left": + textAttrs["text-anchor"] = "start"; + textX = textX - realWidth/2; + break; + case "center": + textAttrs["text-anchor"] = "middle"; + break; + case "right": + textAttrs["text-anchor"] = "end"; + textX = textX + realWidth/2; + break; + } + } + if (labelAttrs && labelAttrs.wrapWidth) { + if (true) { + // Draw frameborder + var textAreaStyle = {stroke: Color.LightSteelBlue2, "stroke-width": 1.0, "stroke-dasharray": "- "}; + var textAreaX = textAreaCX - realWidth/2; + var textAreaY = textAreaCY+.5 - realHeight/2; + var textArea = this.g.rect(textAreaX, textAreaY, realWidth, realHeight).attr(textAreaStyle); + + var textAreaLines = this.g.path("M" + textAreaX + " " + textAreaY + "L" + (textAreaX+realWidth) + " " + (textAreaY+realHeight) + "M" + + (textAreaX+realWidth) + " " + textAreaY + "L" + textAreaX + " " + (textAreaY+realHeight)); + textAreaLines.attr(textAreaStyle); + + this.g.ellipse(textAreaCX, textAreaCY, 3, 3).attr({fill: Color.LightSteelBlue2, stroke: "none"}); + } + } + + var label = this.g.text(textX, textY, wrappedText).attr(attr).attr(textAttrs); + //label.id = Raphael.createUUID(); + //console.log("label ", label.id, ", ", wrappedText); + + if (this.fontSmoothing) { + label.attr({stroke: LABEL_COLOR, "stroke-width":.4}); + } + + // debug + if (debug) { + var imageAreaStyle = {stroke: Color.grey61, "stroke-width": 1.0, "stroke-dasharray": "- "}; + var imageArea = this.g.rect(x+.5, y+.5, width, height).attr(imageAreaStyle); + var imageAreaLines = this.g.path("M" + x + " " + y + "L" + (x+width) + " " + (y+height) + "M" + + (x+width) + " " + y + "L" + x + " " + (y+height)); + imageAreaLines.attr(imageAreaStyle); + var dotStyle = {fill: Color.Coral, stroke: "none"}; + this.g.ellipse(x, y, 3, 3).attr(dotStyle); + this.g.ellipse(x+width, y, 2, 2).attr(dotStyle); + this.g.ellipse(x+width, y+height, 2, 2).attr(dotStyle); + this.g.ellipse(x, y+height, 2, 2).attr(dotStyle); + } + + return label; + } + }, + + vvoid: function(){} +}; diff --git a/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js b/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js new file mode 100644 index 00000000..9fb3fef4 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/ProcessDiagramGenerator.js @@ -0,0 +1,1087 @@ + /** + * Class to generate an image based the diagram interchange information in a + * BPMN 2.0 process. + * + * @author (Javascript) Dmitry Farafonov + */ + +var ProcessDiagramGenerator = { + options: {}, + + processDiagramCanvas: [], + + activityDrawInstructions:{}, + + processDiagrams: {}, + + diagramBreadCrumbs: null, + + init: function(){ + // start event + this.activityDrawInstructions["startEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawNoneStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // start timer event + this.activityDrawInstructions["startTimerEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawTimerStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); + }; + + // start event + this.activityDrawInstructions["messageStartEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawMessageStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); + }; + + // start signal event + this.activityDrawInstructions["startSignalEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawSignalStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); + }; + + // start multiple event + this.activityDrawInstructions["startMultipleEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawMultipleStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); + }; + + // signal catch + this.activityDrawInstructions["intermediateSignalCatch"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // message catch + this.activityDrawInstructions["intermediateMessageCatch"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // multiple catch + this.activityDrawInstructions["intermediateMultipleCatch"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingMultipleEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + + + // signal throw + this.activityDrawInstructions["intermediateSignalThrow"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawThrowingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // message throw + this.activityDrawInstructions["intermediateMessageThrow"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawThrowingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // multiple throw + this.activityDrawInstructions["intermediateMultipleThrow"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawThrowingMultipleEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // none throw + this.activityDrawInstructions["intermediateThrowEvent"] = function() { + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawThrowingNoneEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // end event + this.activityDrawInstructions["endEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawNoneEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // error end event + this.activityDrawInstructions["errorEndEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawErrorEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // message end event + this.activityDrawInstructions["messageEndEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawMessageEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // signal end event + this.activityDrawInstructions["signalEndEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawSignalEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // multiple end event + this.activityDrawInstructions["multipleEndEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawMultipleEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // terminate end event + this.activityDrawInstructions["terminateEndEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawTerminateEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // error start event + this.activityDrawInstructions["errorStartEvent"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawErrorStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), activityImpl.getProperty("name")); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // task + this.activityDrawInstructions["task"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + // TODO: + //console.error("task is not implemented yet"); + /* + var activityImpl = this; + processDiagramCanvas.drawTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), thickBorder); + */ + }; + + + // user task + this.activityDrawInstructions["userTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawUserTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // script task + this.activityDrawInstructions["scriptTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawScriptTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // service task + this.activityDrawInstructions["serviceTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawServiceTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // receive task + this.activityDrawInstructions["receiveTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawReceiveTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // send task + this.activityDrawInstructions["sendTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawSendTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // manual task + this.activityDrawInstructions["manualTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawManualTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // businessRuleTask task + this.activityDrawInstructions["businessRuleTask"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawBusinessRuleTask(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // exclusive gateway + this.activityDrawInstructions["exclusiveGateway"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawExclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // inclusive gateway + this.activityDrawInstructions["inclusiveGateway"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawInclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // parallel gateway + this.activityDrawInstructions["parallelGateway"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawParallelGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // eventBasedGateway + this.activityDrawInstructions["eventBasedGateway"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + processDiagramCanvas.drawEventBasedGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + // Boundary timer + this.activityDrawInstructions["boundaryTimer"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // Boundary catch error + this.activityDrawInstructions["boundaryError"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingErrorEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // Boundary signal event + this.activityDrawInstructions["boundarySignal"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // Boundary message event + this.activityDrawInstructions["boundaryMessage"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = activityImpl.getProperty("isInterrupting"); + processDiagramCanvas.drawCatchingMessageEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, null); + + var label = ProcessDiagramGenerator.getActivitiLabel(activityImpl); + if (label) + processDiagramCanvas.drawLabel(label.text, label.x, label.y, label.width, label.height); + }; + + // timer catch event + this.activityDrawInstructions["intermediateTimer"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + + var isInterrupting = null; + processDiagramCanvas.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isInterrupting, activityImpl.getProperty("name")); + }; + + // subprocess + this.activityDrawInstructions["subProcess"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + // TODO: + + processDiagramCanvas.setConextObject(activityImpl); + + var isExpanded = activityImpl.getProperty("isExpanded"); + var isTriggeredByEvent = activityImpl.getProperty("triggeredByEvent"); + if(isTriggeredByEvent == undefined) { + isTriggeredByEvent = true; + } + // TODO: check why isTriggeredByEvent = true when undefined + isTriggeredByEvent = false; + + if (isExpanded != undefined && isExpanded == false) { + processDiagramCanvas.drawCollapsedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), + activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); + } else { + processDiagramCanvas.drawExpandedSubProcess(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), + activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent); + } + + //console.error("subProcess is not implemented yet"); + }; + + // call activity + this.activityDrawInstructions["callActivity"] = function(){ + var activityImpl = this.activity; + var processDiagramCanvas = this.processDiagramCanvas; + processDiagramCanvas.setConextObject(activityImpl); + processDiagramCanvas.drawCollapsedCallActivity(activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight()); + }; + + $(document).ready(function(){ + // Protect right click on SVG elements (and on canvas too) + document.body.oncontextmenu = function(event) { + if (window.event.srcElement.tagName == "shape" || window.event.srcElement.tagName == "DIV" && window.event.srcElement.parentElement.className == "diagram") { + + // IE DIAGRAM CANVAS OR SHAPE DETECTED! + return false; + } + return (!Object.isSVGElement(window.event.srcElement)); + }; + }); + }, + + getActivitiLabel:function(activityImpl){ + /* + TODO: Label object should be in activityImpl and looks like: + { + x: 250, + y: 250, + width: 80, + height: 30 + } + And then: + if (!activityImpl.label) + return null; + var label = activityImpl.label; + label.text = activityImpl.name; + return label; + */ + + // But now default label for all events is: + return { + text: activityImpl.getProperty("name"), + x: activityImpl.getX() + .5 + activityImpl.getWidth()/2, + y: activityImpl.getY() + .5 + activityImpl.getHeight() + ICON_PADDING, + width: 100, + height: 0 + }; + }, + + generateDiagram: function(processDefinitionDiagramLayout){ + // Init canvas + var processDefinitionId = processDefinitionDiagramLayout.processDefinition.id; + //console.log("Init canvas ", processDefinitionId); + + if (this.getProcessDiagram(processDefinitionId) != undefined) { + // TODO: may be reset canvas if exists.. Or just show + //console.log("ProcessDiagram '" + processDefinitionId + "' is already generated. Just show it."); + return; + } + var processDiagram = this.initProcessDiagramCanvas(processDefinitionDiagramLayout); + var processDiagramCanvas = processDiagram.diagramCanvas; + + // Draw pool shape, if process is participant in collaboration + + if(processDefinitionDiagramLayout.participantProcess != undefined) { + //console.log("Draw pool shape"); + var pProc = processDefinitionDiagramLayout.participantProcess; + processDiagramCanvas.drawPoolOrLane(pProc.x, pProc.y, pProc.width, pProc.height, pProc.name); + } + + var laneSets = processDefinitionDiagramLayout.laneSets; + var activities = processDefinitionDiagramLayout.activities; + var sequenceFlows = processDefinitionDiagramLayout.sequenceFlows; + + + pb1.set('value', 0); + var cnt = 0; + if (laneSets) + for(var i in laneSets) { + cnt += laneSets[i].lanes.length; + } + if (activities) + cnt += activities.length; + if (sequenceFlows) + cnt += sequenceFlows.length; + var step = (cnt>0)? 100/cnt : 0; + var progress = 0; + //console.log("progress bar step: ", step); + + var task1 = new $.AsyncQueue(); + + // Draw lanes + + task1.add(function (task1) { + if (!laneSets) laneSets = []; + //console.log("> draw lane sets, count:", laneSets.length) + }); + + for(var i in laneSets) { + var laneSet = laneSets[i]; + //laneSet.id, laneSet.name + + task1.add(laneSet.lanes,function (task1, lane) { + progress += step; + pb1.set('value', parseInt(progress)); + + //console.log("--> laneId: " + lane.name + ", name: " + lane.name); + + processDiagramCanvas.drawPoolOrLane(lane.x, lane.y, lane.width, lane.height, lane.name); + }); + } + + // Draw activities + + task1.add(function (task1) { + if (!activities) activities = []; + //console.log("> draw activities, count:", activities.length) + }); + + var activitiesLength = activities.length; + task1.add(activities,function (task1, activityJson) { + var activity = new ActivityImpl(activityJson); + activitiesLength --; + progress += step; + pb1.set('value', parseInt(progress)); + //console.log(activitiesLength, "--> activityId: " + activity.getId() + ", name: " + activity.getProperty("name")); + ProcessDiagramGenerator.drawActivity(processDiagramCanvas, activity); + }); + + // Draw sequence-flows + + task1.add(function (task1) { + if (!sequenceFlows) sequenceFlows = []; + //console.log("> draw sequence flows, count:", sequenceFlows.length) + }); + + var flowsLength = sequenceFlows.length; + task1.add(sequenceFlows,function (task1, flow) { + var waypoints = []; + for(var j in flow.xPointArray) { + waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; + } + var isDefault = flow.isDefault; + var isConditional = flow.isConditional; + var isHighLighted = flow.isHighLighted; + + // TODO: add source and destination for sequence flows in REST + // parse for test + var f = flow.flow; + var matches = f.match(/\((.*)\)--.*-->\((.*)\)/); + var sourceActivityId, destinationActivityId; + if (matches != null) { + sourceActivityId = matches[1]; + destinationActivityId = matches[2]; + } + flow.sourceActivityId = sourceActivityId; + flow.destinationActivityId = destinationActivityId; + // + flowsLength--; + progress += step; + pb1.set('value', parseInt(progress)); + + //console.log(flowsLength, "--> flow: " + flow.flow); + + processDiagramCanvas.setConextObject(flow); + processDiagramCanvas.drawSequenceflow(waypoints, isConditional, isDefault, isHighLighted); + }); + + task1.onComplete(function(){ + if (progress<100) + pb1.set('value', 100); + //console.log("COMPLETE!!!"); + + //console.timeEnd('generateDiagram'); + }); + + task1.run(); + }, + + getProcessDiagram: function (processDefinitionId) { + return this.processDiagrams[processDefinitionId]; + }, + + initProcessDiagramCanvas: function (processDefinitionDiagramLayout) { + var minX = 0; + var maxX = 0; + var minY = 0; + var maxY = 0; + + if(processDefinitionDiagramLayout.participantProcess != undefined) { + var pProc = processDefinitionDiagramLayout.participantProcess; + + minX = pProc.x; + maxX = pProc.x + pProc.width; + minY = pProc.y; + maxY = pProc.y + pProc.height; + } + + var activities = processDefinitionDiagramLayout.activities; + for(var i in activities) { + var activityJson = activities[i]; + var activity = new ActivityImpl(activityJson); + + // width + if (activity.getX() + activity.getWidth() > maxX) { + maxX = activity.getX() + activity.getWidth(); + } + if (activity.getX() < minX) { + minX = activity.getX(); + } + // height + if (activity.getY() + activity.getHeight() > maxY) { + maxY = activity.getY() + activity.getHeight(); + } + if (activity.getY() < minY) { + minY = activity.getY(); + } + } + + var sequenceFlows = processDefinitionDiagramLayout.sequenceFlows; + for(var i in sequenceFlows) { + var flow = sequenceFlows[i]; + var waypoints = []; + for(var j in flow.xPointArray) { + waypoints[j] = {x: flow.xPointArray[j], y: flow.yPointArray[j]}; + + // width + if (waypoints[j].x > maxX) { + maxX = waypoints[j].x; + } + if (waypoints[j].x < minX) { + minX = waypoints[j].x; + } + // height + if (waypoints[j].y > maxY) { + maxY = waypoints[j].y; + } + if (waypoints[j].y < minY) { + minY = waypoints[j].y; + } + } + } + + var laneSets = processDefinitionDiagramLayout.laneSets; + for(var i in laneSets) { + var laneSet = laneSets[i]; + //laneSet.id, laneSet.name + + for(var j in laneSet.lanes) { + var lane = laneSet.lanes[j]; + // width + if (lane.x + lane.width > maxX) { + maxX = lane.x + lane.width; + } + if (lane.x < minX) { + minX = lane.x; + } + // height + if (lane.y + lane.height > maxY) { + maxY = lane.y + lane.height; + } + if (lane.y < minY) { + minY = lane.y; + } + } + } + + var diagramCanvas = new ProcessDiagramCanvas(); + if (diagramCanvas) { + + // create div in diagramHolder + var diagramHolder = document.getElementById(this.options.diagramHolderId); + if (!diagramHolder) + throw {msg: "Diagram holder not found", error: "diagramHolderNotFound"}; + var div = document.createElement("DIV"); + div.id = processDefinitionDiagramLayout.processDefinition.id; + div.className = "diagram"; + diagramHolder.appendChild(div); + + diagramCanvas.init(maxX + 20, maxY + 20, processDefinitionDiagramLayout.processDefinition.id); + this.processDiagrams[processDefinitionDiagramLayout.processDefinition.id] = { + processDefinitionDiagramLayout: processDefinitionDiagramLayout, + diagramCanvas: diagramCanvas + }; + } + return this.getProcessDiagram(processDefinitionDiagramLayout.processDefinition.id); + //return new DefaultProcessDiagramCanvas(maxX + 10, maxY + 10, minX, minY); + }, + + drawActivity: function(processDiagramCanvas, activity, highLightedActivities) { + var type = activity.getProperty("type"); + var drawInstruction = this.activityDrawInstructions[type]; + if (drawInstruction != null) { + drawInstruction.apply({processDiagramCanvas:processDiagramCanvas, activity:activity}); + } else { + //console.error("no drawInstruction for " + type + ": ", activity); + } + + // Actually draw the markers + if (activity.getProperty("multiInstance") != undefined || activity.getProperty("collapsed") != undefined) { + //console.log(activity.getProperty("name"), activity.properties); + var multiInstanceSequential = (activity.getProperty("multiInstance") == "sequential"); + var multiInstanceParallel = (activity.getProperty("multiInstance") == "parrallel"); + var collapsed = activity.getProperty("collapsed"); + processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), + multiInstanceSequential, multiInstanceParallel, collapsed); + } + /* + processDiagramCanvas.drawActivityMarkers(activity.getX(), activity.getY(), activity.getWidth(), activity.getHeight(), multiInstanceSequential, + multiInstanceParallel, collapsed); + */ + + // TODO: Draw highlighted activities if they are present + + }, + + setHighLights: function(highLights){ + if (highLights.processDefinitionId == undefined) { + //console.error("Process instance " + highLights.processInstanceId + " doesn't exist"); + return; + } + + var processDiagram = this.getProcessDiagram(highLights.processDefinitionId); + if (processDiagram == undefined) { + //console.error("Process diagram " + highLights.processDefinitionId + " not found"); + return; + } + + var processDiagramCanvas = processDiagram.diagramCanvas; + + // TODO: remove highLightes from all activities before set new highLight + for (var i in highLights.activities) { + var activityId = highLights.activities[i]; + processDiagramCanvas.highLightActivity(activityId); + } + + // TODO: remove highLightes from all flows before set new highLight + for (var i in highLights.flows) { + var flowId = highLights.flows[i]; + var object = processDiagramCanvas.g.getById(flowId); + var flow = object.data("contextObject"); + flow.isHighLighted = true; + processDiagramCanvas.highLightFlow(flowId); + } + }, + + drawHighLights: function(processInstanceId) { + // Load highLights for the processInstanceId + /* + var url = Lang.sub(this.options.processInstanceHighLightsUrl, {processInstanceId: processInstanceId}); + $.ajax({ + url: url, + type: 'GET', + dataType: 'json', + cache: false, + async: true, + }).done(function(data) { + var highLights = data; + if (!highLights) { + console.log("highLights not found"); + return; + } + + console.log("highLights[" + highLights.processDefinitionId + "][" + processInstanceId + "]: ", highLights); + + ProcessDiagramGenerator.setHighLights(highLights); + }).fail(function(jqXHR, textStatus){ + console.log('Get HighLights['+processDefinitionId+'] failure: ', textStatus, jqXHR); + }); + */ + ActivitiRest.getHighLights(processInstanceId, this._drawHighLights); + }, + _drawHighLights: function() { + var highLights = this.highLights; + ProcessDiagramGenerator.setHighLights(highLights); + }, + + // Load processDefinition + + drawDiagram: function(processDefinitionId) { + // Hide all diagrams + var diagrams = $("#" + this.options.diagramHolderId + " div.diagram"); + diagrams.addClass("hidden"); + + + // If processDefinitionId doesn't contain ":" then it's a "processDefinitionKey", not an id. + // Get process definition by key + if (processDefinitionId.indexOf(":") < 0) { + ActivitiRest.getProcessDefinitionByKey(processDefinitionId, this._drawDiagram); + } else { + this._drawDiagram.apply({processDefinitionId: processDefinitionId}); + } + }, + _drawDiagram: function() { + var processDefinitionId = this.processDefinitionId; + + ProcessDiagramGenerator.addBreadCrumbsItem(processDefinitionId); + + + // Check if processDefinition is already loaded and rendered + + + var processDiagram = ProcessDiagramGenerator.getProcessDiagram(processDefinitionId); + + if (processDiagram != undefined && processDiagram != null) { + //console.log("Process diagram " + processDefinitionId + " is already loaded"); + //return; + + var diagram = document.getElementById(processDefinitionId); + $(diagram).removeClass("hidden"); + + // Regenerate image + var processDefinitionDiagramLayout = processDiagram.processDefinitionDiagramLayout; + ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); + + return; + } + + //console.time('loadDiagram'); + + // Load processDefinition + + ActivitiRest.getProcessDefinition(processDefinitionId, ProcessDiagramGenerator._generateDiagram); + }, + _generateDiagram: function() { + var processDefinitionDiagramLayout = this.processDefinitionDiagramLayout; + + //console.log("process-definition-diagram-layout["+processDefinitionDiagramLayout.processDefinition.id+"]: ", processDefinitionDiagramLayout); + + //console.timeEnd('loadDiagram'); + //console.time('generateDiagram'); + + pb1.set('value', 0); + ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); + }, + + getProcessDefinitionByKey: function(processDefinitionKey) { + var url = Lang.sub(this.options.processDefinitionByKeyUrl, {processDefinitionKey: processDefinitionKey}); + + var processDefinition; + $.ajax({ + url: url, + type: 'POST', + dataType: 'json', + cache: false, + async: false + }).done(function(data) { + //console.log("ajax returned data"); + //console.log("ajax returned data:", data); + processDefinition = data; + if (!processDefinition) { + //console.error("Process definition '" + processDefinitionKey + "' not found"); + } + }).fail(function(jqXHR, textStatus){ + //console.error('Get diagram layout['+processDefinitionKey+'] failure: ', textStatus, jqXHR); + }); + + if (processDefinition) { + //console.log("Get process definition by key '" + processDefinitionKey + "': ", processDefinition.id); + return processDefinition; + } else { + return null; + } + }, + + addBreadCrumbsItem: function(processDefinitionId){ + var TPL_UL_CONTAINER = '
      ', + TPL_LI_CONTAINER = '
    • {name}
    • '; + + if (!this.diagramBreadCrumbs) + this.diagramBreadCrumbs = $("#" + this.options.diagramBreadCrumbsId); + if (!this.diagramBreadCrumbs) return; + + + var ul = this.diagramBreadCrumbs.find("ul"); + //console.log("ul: ", ul); + if (ul.size() == 0) { + ul = $(TPL_UL_CONTAINER); + this.diagramBreadCrumbs.append(ul); + + } + var liListOld = ul.find("li"); + //console.warn("liListOld", liListOld); + + // TODO: if there is any items after current then remove that before adding new item (m.b. it is a duplicate) + var currentBreadCrumbsItemId = this.currentBreadCrumbsItemId; + found = false; + liListOld.each( + function(index, item) { + //console.warn("item:", $(this)); + if (!found && currentBreadCrumbsItemId == $(this).attr("id")) { + found = true; + return; + } + if (found) { + //console.warn("remove ", $(this).attr("id")); + $(this).remove(); + } + } + ); + + var liListNew = ul.find("li"); + + //console.log("liListNew size: ", liListNew.size()); + var values = { + id: 'breadCrumbsItem_' + liListNew.size(), + processDefinitionId: processDefinitionId, + name: processDefinitionId + }; + + + var tpl = Lang.sub(TPL_LI_CONTAINER, values); + //console.log("tpl: ", tpl); + ul.append(tpl); + + var li = ul.find("#" + values.id); + //console.warn("li:", li); + $('#' + values.id).on('click', this._breadCrumbsItemClick); + + ul.find("li").removeClass("selected"); + li.attr("num", liListNew.size()); + li.addClass("selected"); + this.currentBreadCrumbsItemId = li.attr("id"); + }, + _breadCrumbsItemClick: function(){ + var li = $(this), + id = li.attr("id"), + processDefinitionId = li.attr("processDefinitionId"); + //console.warn("_breadCrumbsItemClick: ", id, ", processDefinitionId: ", processDefinitionId); + + var ul = ProcessDiagramGenerator.diagramBreadCrumbs.one("ul"); + ul.find("li").removeClass("selected"); + li.addClass("selected"); + ProcessDiagramGenerator.currentBreadCrumbsItemId = li.attr("id"); + + // Hide all diagrams + var diagrams = $("#"+ProcessDiagramGenerator.options.diagramHolderId+" div.diagram"); + diagrams.addClass("hidden"); + + var processDiagram = ProcessDiagramGenerator.getProcessDiagram(processDefinitionId); + + var diagram = document.getElementById(processDefinitionId); + if (!diagram) return; + $(diagram).removeClass("hidden"); + + // Regenerate image + var processDefinitionDiagramLayout = processDiagram.processDefinitionDiagramLayout; + ProcessDiagramGenerator.generateDiagram(processDefinitionDiagramLayout); + }, + + showFlowInfo: function(flow){ + var diagramInfo = $("#" + this.options.diagramInfoId); + if (!diagramInfo) return; + + var values = { + flow: flow.flow, + isDefault: (flow.isDefault)? "true":"", + isConditional: (flow.isConditional)? "true":"", + isHighLighted: (flow.isHighLighted)? "true":"", + sourceActivityId: flow.sourceActivityId, + destinationActivityId: flow.destinationActivityId + }; + var TPL_FLOW_INFO = '
      {flow}
      ' + + '
      sourceActivityId: {sourceActivityId}
      ' + + '
      destinationActivityId: {destinationActivityId}
      ' + + '
      isDefault: {isDefault}
      ' + + '
      isConditional: {isConditional}
      ' + + '
      isHighLighted: {isHighLighted}
      '; + var tpl = Lang.sub(TPL_FLOW_INFO, values); + //console.log("info: ", tpl); + diagramInfo.html(tpl); + }, + + showActivityInfo: function(activity){ + var diagramInfo = $("#" + this.options.diagramInfoId); + if (!diagramInfo) return; + + var values = { + activityId: activity.getId(), + name: activity.getProperty("name"), + type: activity.getProperty("type") + }; + var TPL_ACTIVITY_INFO = '' + + '
      activityId: {activityId}
      ' + + '
      name: {name}
      ' + + '
      type: {type}
      '; + var TPL_CALLACTIVITY_INFO = '' + + '
      collapsed: {collapsed}
      ' + + '
      processDefinitonKey: {processDefinitonKey}
      '; + + var template = TPL_ACTIVITY_INFO; + if (activity.getProperty("type") == "callActivity") { + values.collapsed = activity.getProperty("collapsed"); + values.processDefinitonKey = activity.getProperty("processDefinitonKey"); + template += TPL_CALLACTIVITY_INFO; + } else if (activity.getProperty("type") == "callActivity") { + + } + + var tpl = Lang.sub(template, values); + //console.log("info: ", tpl); + diagramInfo.html(tpl); + }, + + hideInfo: function(){ + var diagramInfo = $("#" + this.options.diagramInfoId); + if (!diagramInfo) return; + diagramInfo.html(""); + }, + + vvoid: function(){} +}; + +var Lang = { + SUBREGEX: /\{\s*([^\|\}]+?)\s*(?:\|([^\}]*))?\s*\}/g, + UNDEFINED: 'undefined', + isUndefined: function(o) { + return typeof o === Lang.UNDEFINED; + }, + sub: function(s, o) { + return ((s.replace) ? s.replace(Lang.SUBREGEX, function(match, key) { + return (!Lang.isUndefined(o[key])) ? o[key] : match; + }) : s); + } +}; + +if (Lang.isUndefined(console)) { + console = { log: function() {}, warn: function() {}, error: function() {}}; +} +ProcessDiagramGenerator.init(); \ No newline at end of file diff --git a/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js b/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js new file mode 100644 index 00000000..7f9d4d00 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/jquery/jquery.asyncqueue.js @@ -0,0 +1,125 @@ +/* +* This file is part of the jquery plugin "asyncQueue". +* +* (c) Sebastien Roch +* @author (parallel) Dmitry Farafonov +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ +(function($){ + $.AsyncQueue = function() { + var that = this, + queue = [], + completeFunc, + failureFunc, + paused = false, + lastCallbackData, + _run, + _complete, + inQueue = 0, + defaultTimeOut = 10; + + _run = function() { + var f = queue.shift(); + + if (f) { + inQueue++; + setTimeout(function(){ + f.fn.apply(that, [that]); + + if (!f.isParallel) + if (paused === false) { + _run(); + } + inQueue --; + if (inQueue == 0 && queue.length == 0) + _complete(); + }, f.timeOut); + + if (f.isParallel) + if (paused === false) { + _run(); + } + } + }; + + _complete = function(){ + if (completeFunc) + completeFunc.apply(that, [that]); + }; + + this.onComplete = function(func) { + completeFunc = func; + }; + + this.onFailure = function(func) { + failureFunc = func; + }; + + this.add = function(func) { + // TODO: add callback for queue[i] complete + + var obj = arguments[0]; + if (obj && Object.prototype.toString.call(obj) === "[object Array]") { + var fn = arguments[1]; + var timeOut = (typeof(arguments[2]) != "undefined")? arguments[2] : defaultTimeOut; + if (typeof(fn) == "function") { + for(var i = 0; i < obj.length; i++) { + var f = function(objx){ + queue.push({isParallel: true, fn: function(){fn.apply(that, [that, objx]);}, timeOut: timeOut}); + }(obj[i]) + } + } + } else { + var fn = arguments[0]; + var timeOut = (typeof(arguments[1]) != "undefined")? arguments[2] : defaultTimeOut; + queue.push({isParallel: false, fn: func, timeOut: timeOut}); + } + return this; + }; + + this.addParallel = function(func, timeOut) { + // TODO: add callback for queue[i] complete + + queue.push({isParallel: true, fn: func, timeOut: timeOut}); + return this; + }; + + this.storeData = function(dataObject) { + lastCallbackData = dataObject; + return this; + }; + + this.lastCallbackData = function () { + return lastCallbackData; + }; + + this.run = function() { + paused = false; + _run(); + }; + + this.pause = function () { + paused = true; + return this; + }; + + this.failure = function() { + paused = true; + if (failureFunc) { + var args = [that]; + for(i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + failureFunc.apply(that, args); + } + }; + + this.size = function(){ + return queue.length; + }; + + return this; + } +})(jQuery); diff --git a/src/main/resources/static/diagram-viewer/js/jquery/jquery.js b/src/main/resources/static/diagram-viewer/js/jquery/jquery.js new file mode 100644 index 00000000..8ccd0ea7 --- /dev/null +++ b/src/main/resources/static/diagram-viewer/js/jquery/jquery.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
      a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
      " + + "" + + "
      "; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
      t
      "; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
      "; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

      "; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
      "; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
      ", "
      " ], + thead: [ 1, "", "
      " ], + tr: [ 2, "", "
      " ], + td: [ 3, "", "
      " ], + col: [ 2, "", "
      " ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and +
      + Snippet: + + + + + + + + + + + + + + + + + + + + + + + + + +
      DirectiveHowSourceRendered
      ng-bind-htmlAutomatically uses $sanitize
      <div ng-bind-html="snippet">
      </div>
      ng-bind-htmlBypass $sanitize by explicitly trusting the dangerous value +
      <div ng-bind-html="deliberatelyTrustDangerousSnippet()">
      +</div>
      +
      ng-bindAutomatically escapes
      <div ng-bind="snippet">
      </div>
      +
      + + + it('should sanitize the html snippet by default', function() { + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('

      an html\nclick here\nsnippet

      '); + }); + + it('should inline raw snippet if bound to a trusted value', function() { + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()). + toBe("

      an html\n" + + "click here\n" + + "snippet

      "); + }); + + it('should escape snippet without any filter', function() { + expect(element(by.css('#bind-default div')).getInnerHtml()). + toBe("<p style=\"color:blue\">an html\n" + + "<em onmouseover=\"this.textContent='PWN3D!'\">click here</em>\n" + + "snippet</p>"); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new text'); + expect(element(by.css('#bind-html-with-sanitize div')).getInnerHtml()). + toBe('new text'); + expect(element(by.css('#bind-html-with-trust div')).getInnerHtml()).toBe( + 'new text'); + expect(element(by.css('#bind-default div')).getInnerHtml()).toBe( + "new <b onclick=\"alert(1)\">text</b>"); + }); +
      + + */ +function $SanitizeProvider() { + this.$get = ['$$sanitizeUri', function($$sanitizeUri) { + return function(html) { + var buf = []; + htmlParser(html, htmlSanitizeWriter(buf, function(uri, isImage) { + return !/^unsafe/.test($$sanitizeUri(uri, isImage)); + })); + return buf.join(''); + }; + }]; +} + +function sanitizeText(chars) { + var buf = []; + var writer = htmlSanitizeWriter(buf, angular.noop); + writer.chars(chars); + return buf.join(''); +} + + +// Regular Expressions for parsing tags and attributes +var START_TAG_REGEXP = + /^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/, + END_TAG_REGEXP = /^<\s*\/\s*([\w:-]+)[^>]*>/, + ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g, + BEGIN_TAG_REGEXP = /^/g, + DOCTYPE_REGEXP = /]*?)>/i, + CDATA_REGEXP = //g, + // Match everything outside of normal chars and " (quote character) + NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g; + + +// Good source of info about elements and attributes +// http://dev.w3.org/html5/spec/Overview.html#semantics +// http://simon.html5.org/html-elements + +// Safe Void Elements - HTML5 +// http://dev.w3.org/html5/spec/Overview.html#void-elements +var voidElements = makeMap("area,br,col,hr,img,wbr"); + +// Elements that you can, intentionally, leave open (and which close themselves) +// http://dev.w3.org/html5/spec/Overview.html#optional-tags +var optionalEndTagBlockElements = makeMap("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr"), + optionalEndTagInlineElements = makeMap("rp,rt"), + optionalEndTagElements = angular.extend({}, + optionalEndTagInlineElements, + optionalEndTagBlockElements); + +// Safe Block Elements - HTML5 +var blockElements = angular.extend({}, optionalEndTagBlockElements, makeMap("address,article," + + "aside,blockquote,caption,center,del,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5," + + "h6,header,hgroup,hr,ins,map,menu,nav,ol,pre,script,section,table,ul")); + +// Inline Elements - HTML5 +var inlineElements = angular.extend({}, optionalEndTagInlineElements, makeMap("a,abbr,acronym,b," + + "bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,q,ruby,rp,rt,s," + + "samp,small,span,strike,strong,sub,sup,time,tt,u,var")); + + +// Special Elements (can contain anything) +var specialElements = makeMap("script,style"); + +var validElements = angular.extend({}, + voidElements, + blockElements, + inlineElements, + optionalEndTagElements); + +//Attributes that have href and hence need to be sanitized +var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap"); +var validAttrs = angular.extend({}, uriAttrs, makeMap( + 'abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,'+ + 'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,'+ + 'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,'+ + 'scope,scrolling,shape,size,span,start,summary,target,title,type,'+ + 'valign,value,vspace,width')); + +function makeMap(str) { + var obj = {}, items = str.split(','), i; + for (i = 0; i < items.length; i++) obj[items[i]] = true; + return obj; +} + + +/** + * @example + * htmlParser(htmlString, { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * }); + * + * @param {string} html string + * @param {object} handler + */ +function htmlParser( html, handler ) { + var index, chars, match, stack = [], last = html; + stack.last = function() { return stack[ stack.length - 1 ]; }; + + while ( html ) { + chars = true; + + // Make sure we're not in a script or style element + if ( !stack.last() || !specialElements[ stack.last() ] ) { + + // Comment + if ( html.indexOf("", index) === index) { + if (handler.comment) handler.comment( html.substring( 4, index ) ); + html = html.substring( index + 3 ); + chars = false; + } + // DOCTYPE + } else if ( DOCTYPE_REGEXP.test(html) ) { + match = html.match( DOCTYPE_REGEXP ); + + if ( match ) { + html = html.replace( match[0] , ''); + chars = false; + } + // end tag + } else if ( BEGING_END_TAGE_REGEXP.test(html) ) { + match = html.match( END_TAG_REGEXP ); + + if ( match ) { + html = html.substring( match[0].length ); + match[0].replace( END_TAG_REGEXP, parseEndTag ); + chars = false; + } + + // start tag + } else if ( BEGIN_TAG_REGEXP.test(html) ) { + match = html.match( START_TAG_REGEXP ); + + if ( match ) { + html = html.substring( match[0].length ); + match[0].replace( START_TAG_REGEXP, parseStartTag ); + chars = false; + } + } + + if ( chars ) { + index = html.indexOf("<"); + + var text = index < 0 ? html : html.substring( 0, index ); + html = index < 0 ? "" : html.substring( index ); + + if (handler.chars) handler.chars( decodeEntities(text) ); + } + + } else { + html = html.replace(new RegExp("(.*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'), + function(all, text){ + text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1"); + + if (handler.chars) handler.chars( decodeEntities(text) ); + + return ""; + }); + + parseEndTag( "", stack.last() ); + } + + if ( html == last ) { + throw $sanitizeMinErr('badparse', "The sanitizer was unable to parse the following block " + + "of html: {0}", html); + } + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag( tag, tagName, rest, unary ) { + tagName = angular.lowercase(tagName); + if ( blockElements[ tagName ] ) { + while ( stack.last() && inlineElements[ stack.last() ] ) { + parseEndTag( "", stack.last() ); + } + } + + if ( optionalEndTagElements[ tagName ] && stack.last() == tagName ) { + parseEndTag( "", tagName ); + } + + unary = voidElements[ tagName ] || !!unary; + + if ( !unary ) + stack.push( tagName ); + + var attrs = {}; + + rest.replace(ATTR_REGEXP, + function(match, name, doubleQuotedValue, singleQuotedValue, unquotedValue) { + var value = doubleQuotedValue + || singleQuotedValue + || unquotedValue + || ''; + + attrs[name] = decodeEntities(value); + }); + if (handler.start) handler.start( tagName, attrs, unary ); + } + + function parseEndTag( tag, tagName ) { + var pos = 0, i; + tagName = angular.lowercase(tagName); + if ( tagName ) + // Find the closest opened tag of the same type + for ( pos = stack.length - 1; pos >= 0; pos-- ) + if ( stack[ pos ] == tagName ) + break; + + if ( pos >= 0 ) { + // Close all the open elements, up the stack + for ( i = stack.length - 1; i >= pos; i-- ) + if (handler.end) handler.end( stack[ i ] ); + + // Remove the open elements from the stack + stack.length = pos; + } + } +} + +var hiddenPre=document.createElement("pre"); +var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/; +/** + * decodes all entities into regular string + * @param value + * @returns {string} A string with decoded entities. + */ +function decodeEntities(value) { + if (!value) { return ''; } + + // Note: IE8 does not preserve spaces at the start/end of innerHTML + // so we must capture them and reattach them afterward + var parts = spaceRe.exec(value); + var spaceBefore = parts[1]; + var spaceAfter = parts[3]; + var content = parts[2]; + if (content) { + hiddenPre.innerHTML=content.replace(//g, '>'); +} + +/** + * create an HTML/XML writer which writes to buffer + * @param {Array} buf use buf.jain('') to get out sanitized html string + * @returns {object} in the form of { + * start: function(tag, attrs, unary) {}, + * end: function(tag) {}, + * chars: function(text) {}, + * comment: function(text) {} + * } + */ +function htmlSanitizeWriter(buf, uriValidator){ + var ignore = false; + var out = angular.bind(buf, buf.push); + return { + start: function(tag, attrs, unary){ + tag = angular.lowercase(tag); + if (!ignore && specialElements[tag]) { + ignore = tag; + } + if (!ignore && validElements[tag] === true) { + out('<'); + out(tag); + angular.forEach(attrs, function(value, key){ + var lkey=angular.lowercase(key); + var isImage = (tag === 'img' && lkey === 'src') || (lkey === 'background'); + if (validAttrs[lkey] === true && + (uriAttrs[lkey] !== true || uriValidator(value, isImage))) { + out(' '); + out(key); + out('="'); + out(encodeEntities(value)); + out('"'); + } + }); + out(unary ? '/>' : '>'); + } + }, + end: function(tag){ + tag = angular.lowercase(tag); + if (!ignore && validElements[tag] === true) { + out(''); + } + if (tag == ignore) { + ignore = false; + } + }, + chars: function(chars){ + if (!ignore) { + out(encodeEntities(chars)); + } + } + }; +} + + +// define ngSanitize module and register $sanitize service +angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider); + +/* global sanitizeText: false */ + +/** + * @ngdoc filter + * @name ngSanitize.filter:linky + * @function + * + * @description + * Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and + * plain email address links. + * + * Requires the {@link ngSanitize `ngSanitize`} module to be installed. + * + * @param {string} text Input text. + * @param {string} target Window (_blank|_self|_parent|_top) or named frame to open links in. + * @returns {string} Html-linkified text. + * + * @usage + + * + * @example + + + +
      + Snippet: + + + + + + + + + + + + + + + + + + + + + +
      FilterSourceRendered
      linky filter +
      <div ng-bind-html="snippet | linky">
      </div>
      +
      +
      +
      linky target +
      <div ng-bind-html="snippetWithTarget | linky:'_blank'">
      </div>
      +
      +
      +
      no filter
      <div ng-bind="snippet">
      </div>
      + + + it('should linkify the snippet with urls', function() { + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(4); + }); + + it('should not linkify snippet without the linky filter', function() { + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()). + toBe('Pretty text with some links: http://angularjs.org/, mailto:us@somewhere.org, ' + + 'another@somewhere.org, and one more: ftp://127.0.0.1/.'); + expect(element.all(by.css('#escaped-html a')).count()).toEqual(0); + }); + + it('should update', function() { + element(by.model('snippet')).clear(); + element(by.model('snippet')).sendKeys('new http://link.'); + expect(element(by.id('linky-filter')).element(by.binding('snippet | linky')).getText()). + toBe('new http://link.'); + expect(element.all(by.css('#linky-filter a')).count()).toEqual(1); + expect(element(by.id('escaped-html')).element(by.binding('snippet')).getText()) + .toBe('new http://link.'); + }); + + it('should work with the target property', function() { + expect(element(by.id('linky-target')). + element(by.binding("snippetWithTarget | linky:'_blank'")).getText()). + toBe('http://angularjs.org/'); + expect(element(by.css('#linky-target a')).getAttribute('target')).toEqual('_blank'); + }); + + + */ +angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) { + var LINKY_URL_REGEXP = + /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>]/, + MAILTO_REGEXP = /^mailto:/; + + return function(text, target) { + if (!text) return text; + var match; + var raw = text; + var html = []; + var url; + var i; + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/mailto then assume mailto + if (match[2] == match[3]) url = 'mailto:' + url; + i = match.index; + addText(raw.substr(0, i)); + addLink(url, match[0].replace(MAILTO_REGEXP, '')); + raw = raw.substring(i + match[0].length); + } + addText(raw); + return $sanitize(html.join('')); + + function addText(text) { + if (!text) { + return; + } + html.push(sanitizeText(text)); + } + + function addLink(url, text) { + html.push(''); + addText(text); + html.push(''); + } + }; +}]); + + +})(window, window.angular); diff --git a/src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js b/src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js new file mode 100644 index 00000000..5bff6ba0 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js @@ -0,0 +1,14 @@ +/* + AngularJS v1.2.13 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(p,h,q){'use strict';function E(a){var e=[];s(e,h.noop).chars(a);return e.join("")}function k(a){var e={};a=a.split(",");var d;for(d=0;d=c;d--)e.end&&e.end(f[d]);f.length=c}}var b,g,f=[],l=a;for(f.last=function(){return f[f.length-1]};a;){g=!0;if(f.last()&&x[f.last()])a=a.replace(RegExp("(.*)<\\s*\\/\\s*"+f.last()+"[^>]*>","i"),function(b,a){a=a.replace(H,"$1").replace(I,"$1");e.chars&&e.chars(r(a));return""}),c("",f.last());else{if(0===a.indexOf("\x3c!--"))b=a.indexOf("--",4),0<=b&&a.lastIndexOf("--\x3e",b)===b&&(e.comment&&e.comment(a.substring(4,b)),a=a.substring(b+3),g=!1);else if(y.test(a)){if(b=a.match(y))a= +a.replace(b[0],""),g=!1}else if(J.test(a)){if(b=a.match(z))a=a.substring(b[0].length),b[0].replace(z,c),g=!1}else K.test(a)&&(b=a.match(A))&&(a=a.substring(b[0].length),b[0].replace(A,d),g=!1);g&&(b=a.indexOf("<"),g=0>b?a:a.substring(0,b),a=0>b?"":a.substring(b),e.chars&&e.chars(r(g)))}if(a==l)throw L("badparse",a);l=a}c()}function r(a){if(!a)return"";var e=M.exec(a);a=e[1];var d=e[3];if(e=e[2])n.innerHTML=e.replace(//g,">")}function s(a,e){var d=!1,c=h.bind(a,a.push);return{start:function(a,g,f){a=h.lowercase(a);!d&&x[a]&&(d=a);d||!0!==C[a]||(c("<"),c(a),h.forEach(g,function(d,f){var g=h.lowercase(f),k="img"===a&&"src"===g||"background"===g;!0!==O[g]||!0===D[g]&&!e(d,k)||(c(" "),c(f),c('="'),c(B(d)),c('"'))}),c(f?"/>":">"))},end:function(a){a=h.lowercase(a);d||!0!==C[a]||(c(""));a==d&&(d=!1)},chars:function(a){d|| +c(B(a))}}}var L=h.$$minErr("$sanitize"),A=/^<\s*([\w:-]+)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*>/,z=/^<\s*\/\s*([\w:-]+)[^>]*>/,G=/([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,K=/^]*?)>/i,I=/]/,d=/^mailto:/;return function(c,b){function g(a){a&&m.push(E(a))}function f(a,c){m.push("');g(c);m.push("")}if(!c)return c;for(var l,k=c,m=[],n,p;l=k.match(e);)n=l[0],l[2]==l[3]&&(n="mailto:"+n),p=l.index,g(k.substr(0,p)),f(n,l[0].replace(d,"")),k=k.substring(p+l[0].length);g(k);return a(m.join(""))}}])})(window,window.angular); +//# sourceMappingURL=angular-sanitize.min.js.map diff --git a/src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js.map b/src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js.map new file mode 100644 index 00000000..c479150a --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-sanitize_1.2.13/angular-sanitize.min.js.map @@ -0,0 +1,8 @@ +{ +"version":3, +"file":"angular-sanitize.min.js", +"lineCount":13, +"mappings":"A;;;;;aAKC,SAAQ,CAACA,CAAD,CAASC,CAAT,CAAkBC,CAAlB,CAA6B,CAkJtCC,QAASA,EAAY,CAACC,CAAD,CAAQ,CAC3B,IAAIC,EAAM,EACGC,EAAAC,CAAmBF,CAAnBE,CAAwBN,CAAAO,KAAxBD,CACbH,MAAA,CAAaA,CAAb,CACA,OAAOC,EAAAI,KAAA,CAAS,EAAT,CAJoB,CAmE7BC,QAASA,EAAO,CAACC,CAAD,CAAM,CAAA,IAChBC,EAAM,EAAIC,EAAAA,CAAQF,CAAAG,MAAA,CAAU,GAAV,CAAtB,KAAsCC,CACtC,KAAKA,CAAL,CAAS,CAAT,CAAYA,CAAZ,CAAgBF,CAAAG,OAAhB,CAA8BD,CAAA,EAA9B,CAAmCH,CAAA,CAAIC,CAAA,CAAME,CAAN,CAAJ,CAAA,CAAgB,CAAA,CACnD,OAAOH,EAHa,CAmBtBK,QAASA,EAAU,CAAEC,CAAF,CAAQC,CAAR,CAAkB,CAiFnCC,QAASA,EAAa,CAAEC,CAAF,CAAOC,CAAP,CAAgBC,CAAhB,CAAsBC,CAAtB,CAA8B,CAClDF,CAAA,CAAUrB,CAAAwB,UAAA,CAAkBH,CAAlB,CACV,IAAKI,CAAA,CAAeJ,CAAf,CAAL,CACE,IAAA,CAAQK,CAAAC,KAAA,EAAR,EAAwBC,CAAA,CAAgBF,CAAAC,KAAA,EAAhB,CAAxB,CAAA,CACEE,CAAA,CAAa,EAAb,CAAiBH,CAAAC,KAAA,EAAjB,CAICG,EAAA,CAAwBT,CAAxB,CAAL,EAA0CK,CAAAC,KAAA,EAA1C,EAA0DN,CAA1D,EACEQ,CAAA,CAAa,EAAb,CAAiBR,CAAjB,CAKF,EAFAE,CAEA,CAFQQ,CAAA,CAAcV,CAAd,CAER,EAFmC,CAAC,CAACE,CAErC,GACEG,CAAAM,KAAA,CAAYX,CAAZ,CAEF,KAAIY,EAAQ,EAEZX,EAAAY,QAAA,CAAaC,CAAb,CACE,QAAQ,CAACC,CAAD,CAAQC,CAAR,CAAcC,CAAd,CAAiCC,CAAjC,CAAoDC,CAApD,CAAmE,CAMzEP,CAAA,CAAMI,CAAN,CAAA,CAAcI,CAAA,CALFH,CAKE,EAJTC,CAIS,EAHTC,CAGS,EAFT,EAES,CAN2D,CAD7E,CASItB,EAAAwB,MAAJ,EAAmBxB,CAAAwB,MAAA,CAAerB,CAAf,CAAwBY,CAAxB,CAA+BV,CAA/B,CA5B+B,CA+BpDM,QAASA,EAAW,CAAET,CAAF,CAAOC,CAAP,CAAiB,CAAA,IAC/BsB,EAAM,CADyB,CACtB7B,CAEb,IADAO,CACA,CADUrB,CAAAwB,UAAA,CAAkBH,CAAlB,CACV,CAEE,IAAMsB,CAAN,CAAYjB,CAAAX,OAAZ,CAA2B,CAA3B,CAAqC,CAArC,EAA8B4B,CAA9B,EACOjB,CAAA,CAAOiB,CAAP,CADP,EACuBtB,CADvB,CAAwCsB,CAAA,EAAxC;AAIF,GAAY,CAAZ,EAAKA,CAAL,CAAgB,CAEd,IAAM7B,CAAN,CAAUY,CAAAX,OAAV,CAAyB,CAAzB,CAA4BD,CAA5B,EAAiC6B,CAAjC,CAAsC7B,CAAA,EAAtC,CACMI,CAAA0B,IAAJ,EAAiB1B,CAAA0B,IAAA,CAAalB,CAAA,CAAOZ,CAAP,CAAb,CAGnBY,EAAAX,OAAA,CAAe4B,CAND,CATmB,CAhHF,IAC/BE,CAD+B,CACxB1C,CADwB,CACVuB,EAAQ,EADE,CACEC,EAAOV,CAG5C,KAFAS,CAAAC,KAEA,CAFamB,QAAQ,EAAG,CAAE,MAAOpB,EAAA,CAAOA,CAAAX,OAAP,CAAsB,CAAtB,CAAT,CAExB,CAAQE,CAAR,CAAA,CAAe,CACbd,CAAA,CAAQ,CAAA,CAGR,IAAMuB,CAAAC,KAAA,EAAN,EAAuBoB,CAAA,CAAiBrB,CAAAC,KAAA,EAAjB,CAAvB,CAmDEV,CASA,CATOA,CAAAiB,QAAA,CAAiBc,MAAJ,CAAW,kBAAX,CAAgCtB,CAAAC,KAAA,EAAhC,CAA+C,QAA/C,CAAyD,GAAzD,CAAb,CACL,QAAQ,CAACsB,CAAD,CAAMC,CAAN,CAAW,CACjBA,CAAA,CAAOA,CAAAhB,QAAA,CAAaiB,CAAb,CAA6B,IAA7B,CAAAjB,QAAA,CAA2CkB,CAA3C,CAAyD,IAAzD,CAEHlC,EAAAf,MAAJ,EAAmBe,CAAAf,MAAA,CAAesC,CAAA,CAAeS,CAAf,CAAf,CAEnB,OAAO,EALU,CADd,CASP,CAAArB,CAAA,CAAa,EAAb,CAAiBH,CAAAC,KAAA,EAAjB,CA5DF,KAAyD,CAGvD,GAA8B,CAA9B,GAAKV,CAAAoC,QAAA,CAAa,SAAb,CAAL,CAEER,CAEA,CAFQ5B,CAAAoC,QAAA,CAAa,IAAb,CAAmB,CAAnB,CAER,CAAc,CAAd,EAAKR,CAAL,EAAmB5B,CAAAqC,YAAA,CAAiB,QAAjB,CAAwBT,CAAxB,CAAnB,GAAsDA,CAAtD,GACM3B,CAAAqC,QAEJ,EAFqBrC,CAAAqC,QAAA,CAAiBtC,CAAAuC,UAAA,CAAgB,CAAhB,CAAmBX,CAAnB,CAAjB,CAErB,CADA5B,CACA,CADOA,CAAAuC,UAAA,CAAgBX,CAAhB,CAAwB,CAAxB,CACP,CAAA1C,CAAA,CAAQ,CAAA,CAHV,CAJF,KAUO,IAAKsD,CAAAC,KAAA,CAAoBzC,CAApB,CAAL,CAGL,IAFAmB,CAEA,CAFQnB,CAAAmB,MAAA,CAAYqB,CAAZ,CAER,CACExC,CACA;AADOA,CAAAiB,QAAA,CAAcE,CAAA,CAAM,CAAN,CAAd,CAAyB,EAAzB,CACP,CAAAjC,CAAA,CAAQ,CAAA,CAFV,CAHK,IAQA,IAAKwD,CAAAD,KAAA,CAA4BzC,CAA5B,CAAL,CAGL,IAFAmB,CAEA,CAFQnB,CAAAmB,MAAA,CAAYwB,CAAZ,CAER,CACE3C,CAEA,CAFOA,CAAAuC,UAAA,CAAgBpB,CAAA,CAAM,CAAN,CAAArB,OAAhB,CAEP,CADAqB,CAAA,CAAM,CAAN,CAAAF,QAAA,CAAkB0B,CAAlB,CAAkC/B,CAAlC,CACA,CAAA1B,CAAA,CAAQ,CAAA,CAHV,CAHK,IAUK0D,EAAAH,KAAA,CAAsBzC,CAAtB,CAAL,GACLmB,CADK,CACGnB,CAAAmB,MAAA,CAAY0B,CAAZ,CADH,IAIH7C,CAEA,CAFOA,CAAAuC,UAAA,CAAgBpB,CAAA,CAAM,CAAN,CAAArB,OAAhB,CAEP,CADAqB,CAAA,CAAM,CAAN,CAAAF,QAAA,CAAkB4B,CAAlB,CAAoC3C,CAApC,CACA,CAAAhB,CAAA,CAAQ,CAAA,CANL,CAUFA,EAAL,GACE0C,CAKA,CALQ5B,CAAAoC,QAAA,CAAa,GAAb,CAKR,CAHIH,CAGJ,CAHmB,CAAR,CAAAL,CAAA,CAAY5B,CAAZ,CAAmBA,CAAAuC,UAAA,CAAgB,CAAhB,CAAmBX,CAAnB,CAG9B,CAFA5B,CAEA,CAFe,CAAR,CAAA4B,CAAA,CAAY,EAAZ,CAAiB5B,CAAAuC,UAAA,CAAgBX,CAAhB,CAExB,CAAI3B,CAAAf,MAAJ,EAAmBe,CAAAf,MAAA,CAAesC,CAAA,CAAeS,CAAf,CAAf,CANrB,CAzCuD,CA+DzD,GAAKjC,CAAL,EAAaU,CAAb,CACE,KAAMoC,EAAA,CAAgB,UAAhB,CAC4C9C,CAD5C,CAAN,CAGFU,CAAA,CAAOV,CAvEM,CA2EfY,CAAA,EA/EmC,CA2IrCY,QAASA,EAAc,CAACuB,CAAD,CAAQ,CAC7B,GAAI,CAACA,CAAL,CAAc,MAAO,EAIrB,KAAIC,EAAQC,CAAAC,KAAA,CAAaH,CAAb,CACRI,EAAAA,CAAcH,CAAA,CAAM,CAAN,CAClB,KAAII,EAAaJ,CAAA,CAAM,CAAN,CAEjB,IADIK,CACJ,CADcL,CAAA,CAAM,CAAN,CACd,CACEM,CAAAC,UAKA,CALoBF,CAAApC,QAAA,CAAgB,IAAhB,CAAqB,MAArB,CAKpB,CAAAoC,CAAA,CAAU,aAAA,EAAiBC,EAAjB,CACRA,CAAAE,YADQ,CACgBF,CAAAG,UAE5B,OAAON,EAAP,CAAqBE,CAArB,CAA+BD,CAlBF,CA4B/BM,QAASA,EAAc,CAACX,CAAD,CAAQ,CAC7B,MAAOA,EAAA9B,QAAA,CACG,IADH;AACS,OADT,CAAAA,QAAA,CAEG0C,CAFH,CAE4B,QAAQ,CAACZ,CAAD,CAAO,CAC9C,MAAO,IAAP,CAAcA,CAAAa,WAAA,CAAiB,CAAjB,CAAd,CAAoC,GADU,CAF3C,CAAA3C,QAAA,CAKG,IALH,CAKS,MALT,CAAAA,QAAA,CAMG,IANH,CAMS,MANT,CADsB,CAoB/B7B,QAASA,EAAkB,CAACD,CAAD,CAAM0E,CAAN,CAAmB,CAC5C,IAAIC,EAAS,CAAA,CAAb,CACIC,EAAMhF,CAAAiF,KAAA,CAAa7E,CAAb,CAAkBA,CAAA4B,KAAlB,CACV,OAAO,OACEU,QAAQ,CAACtB,CAAD,CAAMa,CAAN,CAAaV,CAAb,CAAmB,CAChCH,CAAA,CAAMpB,CAAAwB,UAAA,CAAkBJ,CAAlB,CACD2D,EAAAA,CAAL,EAAehC,CAAA,CAAgB3B,CAAhB,CAAf,GACE2D,CADF,CACW3D,CADX,CAGK2D,EAAL,EAAsC,CAAA,CAAtC,GAAeG,CAAA,CAAc9D,CAAd,CAAf,GACE4D,CAAA,CAAI,GAAJ,CAcA,CAbAA,CAAA,CAAI5D,CAAJ,CAaA,CAZApB,CAAAmF,QAAA,CAAgBlD,CAAhB,CAAuB,QAAQ,CAAC+B,CAAD,CAAQoB,CAAR,CAAY,CACzC,IAAIC,EAAKrF,CAAAwB,UAAA,CAAkB4D,CAAlB,CAAT,CACIE,EAAmB,KAAnBA,GAAWlE,CAAXkE,EAAqC,KAArCA,GAA4BD,CAA5BC,EAAyD,YAAzDA,GAAgDD,CAC3B,EAAA,CAAzB,GAAIE,CAAA,CAAWF,CAAX,CAAJ,EACsB,CAAA,CADtB,GACGG,CAAA,CAASH,CAAT,CADH,EAC8B,CAAAP,CAAA,CAAad,CAAb,CAAoBsB,CAApB,CAD9B,GAEEN,CAAA,CAAI,GAAJ,CAIA,CAHAA,CAAA,CAAII,CAAJ,CAGA,CAFAJ,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAIL,CAAA,CAAeX,CAAf,CAAJ,CACA,CAAAgB,CAAA,CAAI,GAAJ,CANF,CAHyC,CAA3C,CAYA,CAAAA,CAAA,CAAIzD,CAAA,CAAQ,IAAR,CAAe,GAAnB,CAfF,CALgC,CAD7B,KAwBAqB,QAAQ,CAACxB,CAAD,CAAK,CACdA,CAAA,CAAMpB,CAAAwB,UAAA,CAAkBJ,CAAlB,CACD2D,EAAL,EAAsC,CAAA,CAAtC,GAAeG,CAAA,CAAc9D,CAAd,CAAf,GACE4D,CAAA,CAAI,IAAJ,CAEA,CADAA,CAAA,CAAI5D,CAAJ,CACA,CAAA4D,CAAA,CAAI,GAAJ,CAHF,CAKI5D,EAAJ,EAAW2D,CAAX,GACEA,CADF,CACW,CAAA,CADX,CAPc,CAxBb,OAmCE5E,QAAQ,CAACA,CAAD,CAAO,CACb4E,CAAL;AACEC,CAAA,CAAIL,CAAA,CAAexE,CAAf,CAAJ,CAFgB,CAnCjB,CAHqC,CAja9C,IAAI4D,EAAkB/D,CAAAyF,SAAA,CAAiB,WAAjB,CAAtB,CAyJI3B,EACG,4FA1JP,CA2JEF,EAAiB,2BA3JnB,CA4JEzB,EAAc,yEA5JhB,CA6JE0B,EAAmB,IA7JrB,CA8JEF,EAAyB,SA9J3B,CA+JER,EAAiB,qBA/JnB,CAgKEM,EAAiB,qBAhKnB,CAiKEL,EAAe,yBAjKjB,CAmKEwB,EAA0B,gBAnK5B,CA4KI7C,EAAetB,CAAA,CAAQ,wBAAR,CAIfiF,EAAAA,CAA8BjF,CAAA,CAAQ,gDAAR,CAC9BkF,EAAAA,CAA+BlF,CAAA,CAAQ,OAAR,CADnC,KAEIqB,EAAyB9B,CAAA4F,OAAA,CAAe,EAAf,CACeD,CADf,CAEeD,CAFf,CAF7B,CAOIjE,EAAgBzB,CAAA4F,OAAA,CAAe,EAAf,CAAmBF,CAAnB,CAAgDjF,CAAA,CAAQ,4KAAR,CAAhD,CAPpB;AAYImB,EAAiB5B,CAAA4F,OAAA,CAAe,EAAf,CAAmBD,CAAnB,CAAiDlF,CAAA,CAAQ,2JAAR,CAAjD,CAZrB,CAkBIsC,EAAkBtC,CAAA,CAAQ,cAAR,CAlBtB,CAoBIyE,EAAgBlF,CAAA4F,OAAA,CAAe,EAAf,CACe7D,CADf,CAEeN,CAFf,CAGeG,CAHf,CAIeE,CAJf,CApBpB,CA2BI0D,EAAW/E,CAAA,CAAQ,0CAAR,CA3Bf,CA4BI8E,EAAavF,CAAA4F,OAAA,CAAe,EAAf,CAAmBJ,CAAnB,CAA6B/E,CAAA,CAC1C,ySAD0C,CAA7B,CA5BjB;AA0LI8D,EAAUsB,QAAAC,cAAA,CAAuB,KAAvB,CA1Ld,CA2LI5B,EAAU,wBAsGdlE,EAAA+F,OAAA,CAAe,YAAf,CAA6B,EAA7B,CAAAC,SAAA,CAA0C,WAA1C,CA7UAC,QAA0B,EAAG,CAC3B,IAAAC,KAAA,CAAY,CAAC,eAAD,CAAkB,QAAQ,CAACC,CAAD,CAAgB,CACpD,MAAO,SAAQ,CAAClF,CAAD,CAAO,CACpB,IAAIb,EAAM,EACVY,EAAA,CAAWC,CAAX,CAAiBZ,CAAA,CAAmBD,CAAnB,CAAwB,QAAQ,CAACgG,CAAD,CAAMd,CAAN,CAAe,CAC9D,MAAO,CAAC,SAAA5B,KAAA,CAAeyC,CAAA,CAAcC,CAAd,CAAmBd,CAAnB,CAAf,CADsD,CAA/C,CAAjB,CAGA,OAAOlF,EAAAI,KAAA,CAAS,EAAT,CALa,CAD8B,CAA1C,CADe,CA6U7B,CAuGAR,EAAA+F,OAAA,CAAe,YAAf,CAAAM,OAAA,CAAoC,OAApC,CAA6C,CAAC,WAAD,CAAc,QAAQ,CAACC,CAAD,CAAY,CAAA,IACzEC,EACE,mEAFuE,CAGzEC,EAAgB,UAEpB,OAAO,SAAQ,CAACtD,CAAD,CAAOuD,CAAP,CAAe,CAoB5BC,QAASA,EAAO,CAACxD,CAAD,CAAO,CAChBA,CAAL,EAGAjC,CAAAe,KAAA,CAAU9B,CAAA,CAAagD,CAAb,CAAV,CAJqB,CAOvByD,QAASA,EAAO,CAACC,CAAD,CAAM1D,CAAN,CAAY,CAC1BjC,CAAAe,KAAA,CAAU,KAAV,CACIhC,EAAA6G,UAAA,CAAkBJ,CAAlB,CAAJ;CACExF,CAAAe,KAAA,CAAU,UAAV,CAEA,CADAf,CAAAe,KAAA,CAAUyE,CAAV,CACA,CAAAxF,CAAAe,KAAA,CAAU,IAAV,CAHF,CAKAf,EAAAe,KAAA,CAAU,QAAV,CACAf,EAAAe,KAAA,CAAU4E,CAAV,CACA3F,EAAAe,KAAA,CAAU,IAAV,CACA0E,EAAA,CAAQxD,CAAR,CACAjC,EAAAe,KAAA,CAAU,MAAV,CAX0B,CA1B5B,GAAI,CAACkB,CAAL,CAAW,MAAOA,EAMlB,KALA,IAAId,CAAJ,CACI0E,EAAM5D,CADV,CAEIjC,EAAO,EAFX,CAGI2F,CAHJ,CAII9F,CACJ,CAAQsB,CAAR,CAAgB0E,CAAA1E,MAAA,CAAUmE,CAAV,CAAhB,CAAA,CAEEK,CAMA,CANMxE,CAAA,CAAM,CAAN,CAMN,CAJIA,CAAA,CAAM,CAAN,CAIJ,EAJgBA,CAAA,CAAM,CAAN,CAIhB,GAJ0BwE,CAI1B,CAJgC,SAIhC,CAJ4CA,CAI5C,EAHA9F,CAGA,CAHIsB,CAAAS,MAGJ,CAFA6D,CAAA,CAAQI,CAAAC,OAAA,CAAW,CAAX,CAAcjG,CAAd,CAAR,CAEA,CADA6F,CAAA,CAAQC,CAAR,CAAaxE,CAAA,CAAM,CAAN,CAAAF,QAAA,CAAiBsE,CAAjB,CAAgC,EAAhC,CAAb,CACA,CAAAM,CAAA,CAAMA,CAAAtD,UAAA,CAAc1C,CAAd,CAAkBsB,CAAA,CAAM,CAAN,CAAArB,OAAlB,CAER2F,EAAA,CAAQI,CAAR,CACA,OAAOR,EAAA,CAAUrF,CAAAT,KAAA,CAAU,EAAV,CAAV,CAlBqB,CAL+C,CAAlC,CAA7C,CA1jBsC,CAArC,CAAA,CA2mBET,MA3mBF,CA2mBUA,MAAAC,QA3mBV;", +"sources":["angular-sanitize.js"], +"names":["window","angular","undefined","sanitizeText","chars","buf","htmlSanitizeWriter","writer","noop","join","makeMap","str","obj","items","split","i","length","htmlParser","html","handler","parseStartTag","tag","tagName","rest","unary","lowercase","blockElements","stack","last","inlineElements","parseEndTag","optionalEndTagElements","voidElements","push","attrs","replace","ATTR_REGEXP","match","name","doubleQuotedValue","singleQuotedValue","unquotedValue","decodeEntities","start","pos","end","index","stack.last","specialElements","RegExp","all","text","COMMENT_REGEXP","CDATA_REGEXP","indexOf","lastIndexOf","comment","substring","DOCTYPE_REGEXP","test","BEGING_END_TAGE_REGEXP","END_TAG_REGEXP","BEGIN_TAG_REGEXP","START_TAG_REGEXP","$sanitizeMinErr","value","parts","spaceRe","exec","spaceBefore","spaceAfter","content","hiddenPre","innerHTML","textContent","innerText","encodeEntities","NON_ALPHANUMERIC_REGEXP","charCodeAt","uriValidator","ignore","out","bind","validElements","forEach","key","lkey","isImage","validAttrs","uriAttrs","$$minErr","optionalEndTagBlockElements","optionalEndTagInlineElements","extend","document","createElement","module","provider","$SanitizeProvider","$get","$$sanitizeUri","uri","filter","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","target","addText","addLink","url","isDefined","raw","substr"] +} diff --git a/src/main/resources/static/editor-app/libs/angular-scroll_0.5.7/angular-scroll.min.js b/src/main/resources/static/editor-app/libs/angular-scroll_0.5.7/angular-scroll.min.js new file mode 100644 index 00000000..d979dfe0 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-scroll_0.5.7/angular-scroll.min.js @@ -0,0 +1 @@ +var duScrollDefaultEasing=function(e){return.5>e?Math.pow(2*e,2)/2:1-Math.pow(2*(1-e),2)/2};angular.module("duScroll",["duScroll.scrollspy","duScroll.requestAnimation","duScroll.smoothScroll","duScroll.scrollContainer","duScroll.scrollHelpers"]).value("duScrollDuration",350).value("duScrollGreedy",!1).value("duScrollEasing",duScrollDefaultEasing),angular.module("duScroll.scrollHelpers",[]).run(["$window","$q","cancelAnimation","requestAnimation","duScrollEasing",function(e,t,n,r,o){var l=angular.element.prototype;this.$get=function(){return l};var i=function(e){return"undefined"!=typeof HTMLDocument&&e instanceof HTMLDocument||e.nodeType&&e.nodeType===e.DOCUMENT_NODE},u=function(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement||e.nodeType&&e.nodeType===e.ELEMENT_NODE},c=function(e){return u(e)||i(e)?e:e[0]};l.scrollTo=function(t,n,r){var o;if(angular.isElement(t)?o=this.scrollToElement:r&&(o=this.scrollToAnimated),o)return o.apply(this,arguments);var l=c(this);return i(l)?e.scrollTo(t,n):(l.scrollLeft=t,void(l.scrollTop=n))};var a,s;l.scrollToAnimated=function(e,l,i,u){i&&!u&&(u=o);var c=this.scrollLeft(),d=this.scrollTop(),f=Math.round(e-c),p=Math.round(l-d),m=null;a&&(n(a),s.reject());var g=this;if(s=t.defer(),!f&&!p)return s.resolve(),s.promise;var v=function(e){null===m&&(m=e);var t=e-m,n=t>=i?1:u(t/i);g.scrollTo(c+Math.ceil(f*n),d+Math.ceil(p*n)),1>n?a=r(v):(a=null,s.resolve())};return g.scrollTo(c,d),a=r(v),s.promise},l.scrollToElement=function(e,t,n,r){var o=c(this),l=this.scrollTop()+c(e).getBoundingClientRect().top-t;return u(o)&&(l-=o.getBoundingClientRect().top),this.scrollTo(0,l,n,r)};var d={scrollLeft:function(t,n,r){if(angular.isNumber(t))return this.scrollTo(t,this.scrollTop(),n,r);var o=c(this);return i(o)?e.scrollX||document.documentElement.scrollLeft||document.body.scrollLeft:o.scrollLeft},scrollTop:function(t,n,r){if(angular.isNumber(t))return this.scrollTo(this.scrollTop(),t,n,r);var o=c(this);return i(o)?e.scrollY||document.documentElement.scrollTop||document.body.scrollTop:o.scrollTop}},f=function(e,t){return function(n,r){return r?t.apply(this,arguments):e.apply(this,arguments)}};for(var p in d)l[p]=l[p]?f(l[p],d[p]):d[p]}]),angular.module("duScroll.polyfill",[]).factory("polyfill",["$window",function(e){var t=["webkit","moz","o","ms"];return function(n,r){if(e[n])return e[n];for(var o,l=n.substr(0,1).toUpperCase()+n.substr(1),i=0;i=a?"top":null!==e&&a+e<=t.top?"middle":null!==v&&t.top+n+g>=o-v?"bottom":"middle"}function u(){return p[0]===t?t.pageYOffset:p[0].scrollTop}function c(){return p[0]===t?t.document.body.scrollHeight:p[0].scrollHeight}var d={},f=angular.extend({},e,s),p=f.target,m="affix affix-top affix-bottom",g=0,$=0,h=0,v=0,y=null,w=null,b=o.parent();if(f.offsetParent)if(f.offsetParent.match(/^\d+$/))for(var D=0;D<1*f.offsetParent-1;D++)b=b.parent();else b=angular.element(f.offsetParent);return d.init=function(){d.$parseOffsets(),$=a.offset(o[0]).top+g,p.on("scroll",d.checkPosition),p.on("click",d.checkPositionWithEventLoop),r.on("resize",d.$debouncedOnResize),d.checkPosition(),d.checkPositionWithEventLoop()},d.destroy=function(){p.off("scroll",d.checkPosition),p.off("click",d.checkPositionWithEventLoop),r.off("resize",d.$debouncedOnResize)},d.checkPositionWithEventLoop=function(){setTimeout(d.checkPosition,1)},d.checkPosition=function(){var e=u(),t=a.offset(o[0]),n=a.height(o[0]),r=l(w,t,n);y!==r&&(y=r,o.removeClass(m).addClass("affix"+("middle"!==r?"-"+r:"")),"top"===r?(w=null,o.css("position",f.offsetParent?"":"relative"),o.css("top","")):"bottom"===r?(w=f.offsetUnpin?-(1*f.offsetUnpin):t.top-e,o.css("position",f.offsetParent?"":"relative"),o.css("top",f.offsetParent?"":i[0].offsetHeight-v-n-$+"px")):(w=null,o.css("position","fixed"),o.css("top",g+"px")))},d.$onResize=function(){d.$parseOffsets(),d.checkPosition()},d.$debouncedOnResize=n(d.$onResize,50),d.$parseOffsets=function(){o.css("position",f.offsetParent?"":"relative"),f.offsetTop&&("auto"===f.offsetTop&&(f.offsetTop="+0"),f.offsetTop.match(/^[-+]\d+$/)?(g=1*-f.offsetTop,h=f.offsetParent?a.offset(b[0]).top+1*f.offsetTop:a.offset(o[0]).top-a.css(o[0],"marginTop",!0)+1*f.offsetTop):h=1*f.offsetTop),f.offsetBottom&&(v=f.offsetParent&&f.offsetBottom.match(/^[-+]\d+$/)?c()-(a.offset(b[0]).top+a.height(b[0]))+1*f.offsetBottom+1:1*f.offsetBottom)},d.init(),d}var i=angular.element(t.document.body),r=angular.element(t);return o}]}).directive("bsAffix",["$affix","$window",function(e,t){return{restrict:"EAC",require:"^?bsAffixTarget",link:function(n,a,o,i){var r={scope:n,offsetTop:"auto",target:i?i.$element:angular.element(t)};angular.forEach(["offsetTop","offsetBottom","offsetParent","offsetUnpin"],function(e){angular.isDefined(o[e])&&(r[e]=o[e])});var s=e(a,r);n.$on("$destroy",function(){s&&s.destroy(),r=null,s=null})}}}]).directive("bsAffixTarget",function(){return{controller:["$element",function(e){this.$element=e}]}}),angular.module("mgcrea.ngStrap.alert",["mgcrea.ngStrap.modal"]).provider("$alert",function(){var e=this.defaults={animation:"am-fade",prefixClass:"alert",placement:null,template:"alert/alert.tpl.html",container:!1,element:null,backdrop:!1,keyboard:!0,show:!0,duration:!1,type:!1,dismissable:!0};this.$get=["$modal","$timeout",function(t,n){function a(a){var o={},i=angular.extend({},e,a);o=t(i),o.$scope.dismissable=!!i.dismissable,i.type&&(o.$scope.type=i.type);var r=o.show;return i.duration&&(o.show=function(){r(),n(function(){o.hide()},1e3*i.duration)}),o}return a}]}).directive("bsAlert",["$window","$sce","$alert",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","placement","keyboard","html","container","animation","duration","dismissable"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content","type"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsAlert&&e.$watch(o.bsAlert,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r&&r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.aside",["mgcrea.ngStrap.modal"]).provider("$aside",function(){var e=this.defaults={animation:"am-fade-and-slide-right",prefixClass:"aside",placement:"right",template:"aside/aside.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$modal",function(t){function n(n){var a={},o=angular.extend({},e,n);return a=t(o)}return n}]}).directive("bsAside",["$window","$sce","$aside",function(e,t,n){e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsAside&&e.$watch(o.bsAside,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r&&r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.button",[]).provider("$button",function(){var e=this.defaults={activeClass:"active",toggleEvent:"click"};this.$get=function(){return{defaults:e}}}).directive("bsCheckboxGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="checkbox"]');angular.forEach(n,function(e){var n=angular.element(e);n.attr("bs-checkbox",""),n.attr("ng-model",t.ngModel+"."+n.attr("value"))})}}}).directive("bsCheckbox",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var s=n,l="INPUT"===o[0].nodeName,u=l?o.parent():o,c=angular.isDefined(i.trueValue)?i.trueValue:!0;a.test(i.trueValue)&&(c=e.$eval(i.trueValue));var d=angular.isDefined(i.falseValue)?i.falseValue:!1;a.test(i.falseValue)&&(d=e.$eval(i.falseValue));var f="boolean"!=typeof c||"boolean"!=typeof d;f&&(r.$parsers.push(function(e){return e?c:d}),e.$watch(i.ngModel,function(){r.$render()})),r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){l||r.$setViewValue(!u.hasClass("active")),f||r.$render()})})}}}]).directive("bsRadioGroup",function(){return{restrict:"A",require:"ngModel",compile:function(e,t){e.attr("data-toggle","buttons"),e.removeAttr("ng-model");var n=e[0].querySelectorAll('input[type="radio"]');angular.forEach(n,function(e){angular.element(e).attr("bs-radio",""),angular.element(e).attr("ng-model",t.ngModel)})}}}).directive("bsRadio",["$button","$$rAF",function(e,t){var n=e.defaults,a=/^(true|false|\d+)$/;return{restrict:"A",require:"ngModel",link:function(e,o,i,r){var s=n,l="INPUT"===o[0].nodeName,u=l?o.parent():o,c=a.test(i.value)?e.$eval(i.value):i.value;r.$render=function(){var e=angular.equals(r.$modelValue,c);t(function(){l&&(o[0].checked=e),u.toggleClass(s.activeClass,e)})},o.bind(s.toggleEvent,function(){e.$apply(function(){r.$setViewValue(c),r.$render()})})}}}]),angular.module("mgcrea.ngStrap.datepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$datepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"datepicker",placement:"bottom-left",template:"datepicker/datepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!1,dateType:"date",dateFormat:"shortDate",modelDateFormat:null,dayFormat:"dd",strictFormat:!1,autoclose:!1,minDate:-1/0,maxDate:+1/0,startView:0,minView:0,startWeek:0,daysOfWeekDisabled:"",iconLeft:"glyphicon glyphicon-chevron-left",iconRight:"glyphicon glyphicon-chevron-right"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","datepickerViews","$tooltip",function(t,n,a,o,i,r,s,l){function u(t,n,a){function o(e){e.selected=r.$isSelected(e.date)}function i(){t[0].focus()}var r=l(t,angular.extend({},e,a)),u=a.scope,f=r.$options,p=r.$scope;f.startView&&(f.startView-=f.minView);var m=s(r);r.$views=m.views;var g=m.viewDate;p.$mode=f.startView,p.$iconLeft=f.iconLeft,p.$iconRight=f.iconRight;var $=r.$views[p.$mode];p.$select=function(e){r.select(e)},p.$selectPane=function(e){r.$selectPane(e)},p.$toggleMode=function(){r.setMode((p.$mode+1)%r.$views.length)},r.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())&&(r.$date=e,$.update.call($,e)),r.$build(!0)},r.updateDisabledDates=function(e){f.disabledDateRanges=e;for(var t=0,n=p.rows.length;n>t;t++)angular.forEach(p.rows[t],r.$setDisabledEl)},r.select=function(e,t){angular.isDate(n.$dateValue)||(n.$dateValue=new Date(e)),!p.$mode||t?(n.$setViewValue(angular.copy(e)),n.$render(),f.autoclose&&!t&&r.hide(!0)):(angular.extend(g,{year:e.getFullYear(),month:e.getMonth(),date:e.getDate()}),r.setMode(p.$mode-1),r.$build())},r.setMode=function(e){p.$mode=e,$=r.$views[p.$mode],r.$build()},r.$build=function(e){e===!0&&$.built||(e!==!1||$.built)&&$.build.call($)},r.$updateSelected=function(){for(var e=0,t=p.rows.length;t>e;e++)angular.forEach(p.rows[e],o)},r.$isSelected=function(e){return $.isSelected(e)},r.$setDisabledEl=function(e){e.disabled=$.isDisabled(e.date)},r.$selectPane=function(e){var t=$.steps,n=new Date(Date.UTC(g.year+(t.year||0)*e,g.month+(t.month||0)*e,g.date+(t.day||0)*e));angular.extend(g,{year:n.getUTCFullYear(),month:n.getUTCMonth(),date:n.getUTCDate()}),r.$build()},r.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),d){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},r.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return p.$mode?p.$apply(function(){r.setMode(p.$mode-1)}):r.hide(!0);$.onKeyDown(e),u.$digest()}};var h=r.init;r.init=function(){return c&&f.useNative?(t.prop("type","date"),t.css("-webkit-appearance","textfield"),void 0):(d&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",i)),h(),void 0)};var v=r.destroy;r.destroy=function(){c&&f.useNative&&t.off("click",i),v()};var y=r.show;r.show=function(){y(),setTimeout(function(){r.$element.on(d?"touchstart":"mousedown",r.$onMouseDown),f.keyboard&&t.on("keydown",r.$onKeyDown)})};var w=r.hide;return r.hide=function(e){r.$element.off(d?"touchstart":"mousedown",r.$onMouseDown),f.keyboard&&t.off("keydown",r.$onKeyDown),w(e)},r}var c=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),d="createTouch"in t.document&&c;return e.lang||(e.lang=i.id),u.defaults=e,u}]}).directive("bsDatepicker",["$window","$parse","$q","$locale","dateFilter","$datepicker","$dateParser","$timeout",function(e,t,n,a,o,i,r){var s=(i.defaults,/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent)),l=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){function u(e){return e&&e.length?e:null}var c={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","dateType","dateFormat","modelDateFormat","dayFormat","strictFormat","startWeek","startDate","useNative","lang","startView","minView","iconLeft","iconRight","daysOfWeekDisabled"],function(e){angular.isDefined(n[e])&&(c[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){d&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(",?(datepicker),?")),e===!0?d.show():d.hide())}),s&&c.useNative&&(c.dateFormat="yyyy-MM-dd");var d=i(t,a,c);c=d.$options,angular.forEach(["minDate","maxDate"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){if("today"===t){var n=new Date;d.$options[e]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()+("maxDate"===e?1:0),0,0,0,"minDate"===e?0:-1)}else d.$options[e]=angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):l(t)?+new Date(parseInt(t,10)):angular.isString(t)&&0===t.length?"maxDate"===e?+1/0:-1/0:+new Date(t);!isNaN(d.$options[e])&&d.$build(!1)})}),e.$watch(n.ngModel,function(){d.update(a.$dateValue)},!0),angular.isDefined(n.disabledDates)&&e.$watch(n.disabledDates,function(e,t){e=u(e),t=u(t),e!==t&&d.updateDisabledDates(e)});var f=r({format:c.dateFormat,lang:c.lang,strict:c.strictFormat});a.$parsers.unshift(function(e){if(!e)return a.$setValidity("date",!0),void 0;var t=f.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))return a.$setValidity("date",!1),void 0;var n=isNaN(d.$options.minDate)||t.getTime()>=d.$options.minDate,i=isNaN(d.$options.maxDate)||t.getTime()<=d.$options.maxDate,r=n&&i;return a.$setValidity("date",r),a.$setValidity("min",n),a.$setValidity("max",i),r&&(a.$dateValue=t),"string"===c.dateType?o(t,c.modelDateFormat||c.dateFormat):"number"===c.dateType?a.$dateValue.getTime():"iso"===c.dateType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===c.dateType?f.parse(e,null,c.modelDateFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,c.dateFormat))},e.$on("$destroy",function(){d&&d.destroy(),c=null,d=null})}}}]).provider("datepickerViews",function(){function e(e,t){for(var n=[];e.length>0;)n.push(e.splice(0,t));return n}function t(e,t){return(e%t+t)%t}this.defaults={dayFormat:"dd",daySplit:7};this.$get=["$locale","$sce","dateFilter",function(n,a,o){return function(i){var r=i.$scope,s=i.$options,l=n.DATETIME_FORMATS.SHORTDAY,u=l.slice(s.startWeek).concat(l.slice(0,s.startWeek)),c=a.trustAsHtml(''+u.join('')+""),d=i.$date||(s.startDate?new Date(s.startDate):new Date),f={year:d.getFullYear(),month:d.getMonth(),date:d.getDate()},p=(6e4*d.getTimezoneOffset(),[{format:s.dayFormat,split:7,steps:{month:1},update:function(e,t){!this.built||t||e.getFullYear()!==f.year||e.getMonth()!==f.month?(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getDate()!==f.date&&(f.date=i.$date.getDate(),i.$updateSelected())},build:function(){var n=new Date(f.year,f.month,1),a=n.getTimezoneOffset(),l=new Date(+n-864e5*t(n.getDay()-s.startWeek,7)),u=l.getTimezoneOffset(),d=(new Date).toDateString();u!==a&&(l=new Date(+l+6e4*(u-a)));for(var p,m=[],g=0;42>g;g++)p=new Date(l.getFullYear(),l.getMonth(),l.getDate()+g),m.push({date:p,isToday:p.toDateString()===d,label:o(p,this.format),selected:i.$date&&this.isSelected(p),muted:p.getMonth()!==f.month,disabled:this.isDisabled(p)});r.title=o(n,"MMMM yyyy"),r.showLabels=!0,r.labels=c,r.rows=e(m,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()&&e.getDate()===i.$date.getDate()},isDisabled:function(e){var t=e.getTime();if(ts.maxDate)return!0;if(-1!==s.daysOfWeekDisabled.indexOf(e.getDay()))return!0;if(s.disabledDateRanges)for(var n=0;n=s.disabledDateRanges[n].start)return t<=s.disabledDateRanges[n].end?!0:!1;return!1},onKeyDown:function(e){var t,n=i.$date.getTime();37===e.keyCode?t=new Date(n-864e5):38===e.keyCode?t=new Date(n-6048e5):39===e.keyCode?t=new Date(n+864e5):40===e.keyCode&&(t=new Date(n+6048e5)),this.isDisabled(t)||i.select(t,!0)}},{name:"month",format:"MMM",split:4,steps:{year:1},update:function(e){this.built&&e.getFullYear()===f.year?e.getMonth()!==f.month&&(angular.extend(f,{month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected()):(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build())},build:function(){for(var t,n=(new Date(f.year,0,1),[]),a=0;12>a;a++)t=new Date(f.year,a,1),n.push({date:t,label:o(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=o(t,"yyyy"),r.showLabels=!1,r.rows=e(n,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()&&e.getMonth()===i.$date.getMonth()},isDisabled:function(e){var t=+new Date(e.getFullYear(),e.getMonth()+1,0);return ts.maxDate},onKeyDown:function(e){var t=i.$date.getMonth(),n=new Date(i.$date);37===e.keyCode?n.setMonth(t-1):38===e.keyCode?n.setMonth(t-4):39===e.keyCode?n.setMonth(t+1):40===e.keyCode&&n.setMonth(t+4),this.isDisabled(n)||i.select(n,!0)}},{name:"year",format:"yyyy",split:4,steps:{year:12},update:function(e,t){!this.built||t||parseInt(e.getFullYear()/20,10)!==parseInt(f.year/20,10)?(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$build()):e.getFullYear()!==f.year&&(angular.extend(f,{year:i.$date.getFullYear(),month:i.$date.getMonth(),date:i.$date.getDate()}),i.$updateSelected())},build:function(){for(var t,n=f.year-f.year%(3*this.split),a=[],s=0;12>s;s++)t=new Date(n+s,0,1),a.push({date:t,label:o(t,this.format),selected:i.$isSelected(t),disabled:this.isDisabled(t)});r.title=a[0].label+"-"+a[a.length-1].label,r.showLabels=!1,r.rows=e(a,this.split),this.built=!0},isSelected:function(e){return i.$date&&e.getFullYear()===i.$date.getFullYear()},isDisabled:function(e){var t=+new Date(e.getFullYear()+1,0,0);return ts.maxDate},onKeyDown:function(e){var t=i.$date.getFullYear(),n=new Date(i.$date);37===e.keyCode?n.setYear(t-1):38===e.keyCode?n.setYear(t-4):39===e.keyCode?n.setYear(t+1):40===e.keyCode&&n.setYear(t+4),this.isDisabled(n)||i.select(n,!0)}}]);return{views:s.minView?Array.prototype.slice.call(p,s.minView):p,viewDate:f}}}]}),angular.module("mgcrea.ngStrap.dropdown",["mgcrea.ngStrap.tooltip"]).provider("$dropdown",function(){var e=this.defaults={animation:"am-fade",prefixClass:"dropdown",placement:"bottom-left",template:"dropdown/dropdown.tpl.html",trigger:"click",container:!1,keyboard:!0,html:!1,delay:0};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function o(t,o){function s(e){return e.target!==t[0]?e.target!==t[0]&&l.hide():void 0}{var l={},u=angular.extend({},e,o);l.$scope=u.scope&&u.scope.$new()||n.$new()}l=a(t,u);var c=t.parent();l.$onKeyDown=function(e){if(/(38|40)/.test(e.keyCode)){e.preventDefault(),e.stopPropagation();var t=angular.element(l.$element[0].querySelectorAll("li:not(.divider) a"));if(t.length){var n;angular.forEach(t,function(e,t){r&&r.call(e,":focus")&&(n=t)}),38===e.keyCode&&n>0?n--:40===e.keyCode&&n1){var r=i.search(n[t]);e=e.split(n[t]).join(""),m[n[t]]&&(a[r]=m[n[t]])}return angular.forEach(a,function(e){e&&o.push(e)}),o}function s(e){return e.replace(/\//g,"[\\/]").replace("/-/g","[-]").replace(/\./g,"[.]").replace(/\\s/g,"[\\s]")}function l(e){var t,n=Object.keys(p),a=e;for(t=0;tu?a=setTimeout(l,t-u):(a=null,n||(s=e.apply(i,o)))},u=n&&!a;return a||(a=setTimeout(l,t)),u&&(s=e.apply(i,o)),s}}).constant("throttle",function(e,t,n){var a,o,i,r=null,s=0;n||(n={});var l=function(){s=n.leading===!1?0:new Date,r=null,i=e.apply(a,o)};return function(){var u=new Date;s||n.leading!==!1||(s=u);var c=t-(u-s);return a=this,o=arguments,0>=c?(clearTimeout(r),r=null,s=u,i=e.apply(a,o)):r||n.trailing===!1||(r=setTimeout(l,c)),i}}),angular.module("mgcrea.ngStrap.helpers.dimensions",[]).factory("dimensions",["$document","$window",function(){var t=(angular.element,{}),n=t.nodeName=function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()};t.css=function(t,n,a){var o;return o=t.currentStyle?t.currentStyle[n]:e.getComputedStyle?e.getComputedStyle(t)[n]:t.style[n],a===!0?parseFloat(o)||0:o},t.offset=function(t){var n=t.getBoundingClientRect(),a=t.ownerDocument;return{width:n.width||t.offsetWidth,height:n.height||t.offsetHeight,top:n.top+(e.pageYOffset||a.documentElement.scrollTop)-(a.documentElement.clientTop||0),left:n.left+(e.pageXOffset||a.documentElement.scrollLeft)-(a.documentElement.clientLeft||0)}},t.position=function(e){var o,i,r={top:0,left:0};return"fixed"===t.css(e,"position")?i=e.getBoundingClientRect():(o=a(e),i=t.offset(e),i=t.offset(e),n(o,"html")||(r=t.offset(o)),r.top+=t.css(o,"borderTopWidth",!0),r.left+=t.css(o,"borderLeftWidth",!0)),{width:e.offsetWidth,height:e.offsetHeight,top:i.top-r.top-t.css(e,"marginTop",!0),left:i.left-r.left-t.css(e,"marginLeft",!0)}};var a=function(e){var a=e.ownerDocument,o=e.offsetParent||a;if(n(o,"#document"))return a.documentElement;for(;o&&!n(o,"html")&&"static"===t.css(o,"position");)o=o.offsetParent;return o||a.documentElement};return t.height=function(e,n){var a=e.offsetHeight;return n?a+=t.css(e,"marginTop",!0)+t.css(e,"marginBottom",!0):a-=t.css(e,"paddingTop",!0)+t.css(e,"paddingBottom",!0)+t.css(e,"borderTopWidth",!0)+t.css(e,"borderBottomWidth",!0),a},t.width=function(e,n){var a=e.offsetWidth;return n?a+=t.css(e,"marginLeft",!0)+t.css(e,"marginRight",!0):a-=t.css(e,"paddingLeft",!0)+t.css(e,"paddingRight",!0)+t.css(e,"borderLeftWidth",!0)+t.css(e,"borderRightWidth",!0),a},t}]),angular.module("mgcrea.ngStrap.helpers.parseOptions",[]).provider("$parseOptions",function(){var e=this.defaults={regexp:/^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/};this.$get=["$parse","$q",function(t,n){function a(a,o){function i(e,t){return e.map(function(e,n){var a,o,i={};return i[c]=e,a=u(t,i),o=p(t,i)||n,{label:a,value:o}})}var r={},s=angular.extend({},e,o);r.$values=[];var l,u,c,d,f,p,m;return r.init=function(){r.$match=l=a.match(s.regexp),u=t(l[2]||l[1]),c=l[4]||l[6],d=l[5],f=t(l[3]||""),p=t(l[2]?l[1]:c),m=t(l[7])},r.valuesFn=function(e,t){return n.when(m(e,t)).then(function(t){return r.$values=t?i(t,e):{},r.$values})},r.init(),r}return a}]}),angular.version.minor<3&&angular.version.dot<14&&angular.module("ng").factory("$$rAF",["$window","$timeout",function(e,t){var n=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame,a=e.cancelAnimationFrame||e.webkitCancelAnimationFrame||e.mozCancelAnimationFrame||e.webkitCancelRequestAnimationFrame,o=!!n,i=o?function(e){var t=n(e);return function(){a(t)}}:function(e){var n=t(e,16.66,!1);return function(){t.cancel(n)}};return i.supported=o,i}]),angular.module("mgcrea.ngStrap.modal",["mgcrea.ngStrap.helpers.dimensions"]).provider("$modal",function(){var e=this.defaults={animation:"am-fade",backdropAnimation:"am-fade",prefixClass:"modal",prefixEvent:"modal",placement:"top",template:"modal/modal.tpl.html",contentTemplate:!1,container:!1,element:null,backdrop:!0,keyboard:!0,html:!1,show:!0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","$timeout","$sce","dimensions",function(n,a,o,i,r,s,l,u,c){function d(t){function n(e){e.target===e.currentTarget&&("static"===r.backdrop?i.focus():i.hide())}var i={},r=i.$options=angular.extend({},e,t);i.$promise=p(r.template);var s=i.$scope=r.scope&&r.scope.$new()||a.$new();r.element||r.container||(r.container="body"),m(["title","content"],function(e){r[e]&&(s[e]=c.trustAsHtml(r[e]))}),s.$hide=function(){s.$$postDigest(function(){i.hide()})},s.$show=function(){s.$$postDigest(function(){i.show()})},s.$toggle=function(){s.$$postDigest(function(){i.toggle()})},r.contentTemplate&&(i.$promise=i.$promise.then(function(e){var n=angular.element(e);return p(r.contentTemplate).then(function(e){var a=f('[ng-bind="content"]',n[0]).removeAttr("ng-bind").html(e);return t.template||a.next().remove(),n[0].outerHTML})}));var u,d,y=angular.element('
      ');return i.$promise.then(function(e){angular.isObject(e)&&(e=e.data),r.html&&(e=e.replace(v,'ng-bind-html="')),e=g.apply(e),u=o(e),i.init()}),i.init=function(){r.show&&s.$$postDigest(function(){i.show()})},i.destroy=function(){d&&(d.remove(),d=null),y&&(y.remove(),y=null),s.$destroy()},i.show=function(){s.$emit(r.prefixEvent+".show.before",i);var e;e=angular.isElement(r.container)?r.container:r.container?f(r.container):null;var t=r.container?null:r.element;d=i.$element=u(s,function(){}),d.css({display:"block"}).addClass(r.placement),r.animation&&(r.backdrop&&y.addClass(r.backdropAnimation),d.addClass(r.animation)),r.backdrop&&l.enter(y,h,null,function(){}),l.enter(d,e,t,function(){s.$emit(r.prefixEvent+".show",i)}),s.$isShown=!0,s.$$phase||s.$root&&s.$root.$$phase||s.$digest();var a=d[0];$(function(){a.focus()}),h.addClass(r.prefixClass+"-open"),r.animation&&h.addClass(r.prefixClass+"-with-"+r.animation),r.backdrop&&(d.on("click",n),y.on("click",n)),r.keyboard&&d.on("keyup",i.$onKeyUp)},i.hide=function(){s.$emit(r.prefixEvent+".hide.before",i),l.leave(d,function(){s.$emit(r.prefixEvent+".hide",i),h.removeClass(r.prefixClass+"-open"),r.animation&&h.removeClass(r.prefixClass+"-with-"+r.animation)}),r.backdrop&&l.leave(y,function(){}),s.$isShown=!1,s.$$phase||s.$root&&s.$root.$$phase||s.$digest(),r.backdrop&&(d.off("click",n),y.off("click",n)),r.keyboard&&d.off("keyup",i.$onKeyUp)},i.toggle=function(){s.$isShown?i.hide():i.show()},i.focus=function(){d[0].focus()},i.$onKeyUp=function(e){27===e.which&&s.$isShown&&(i.hide(),e.stopPropagation())},i}function f(e,n){return angular.element((n||t).querySelectorAll(e))}function p(e){return i.when(r.get(e)||s.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=angular.forEach,g=String.prototype.trim,$=n.requestAnimationFrame||n.setTimeout,h=angular.element(n.document.body),v=/ng-bind="/gi;return d}]}).directive("bsModal",["$window","$sce","$modal",function(e,t,n){return{restrict:"EAC",scope:!0,link:function(e,a,o){var i={scope:e,element:a,show:!1};angular.forEach(["template","contentTemplate","placement","backdrop","keyboard","html","container","animation"],function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),angular.forEach(["title","content"],function(n){o[n]&&o.$observe(n,function(a){e[n]=t.trustAsHtml(a)})}),o.bsModal&&e.$watch(o.bsModal,function(t){angular.isObject(t)?angular.extend(e,t):e.content=t},!0);var r=n(i);a.on(o.trigger||"click",r.toggle),e.$on("$destroy",function(){r&&r.destroy(),i=null,r=null})}}}]),angular.module("mgcrea.ngStrap.navbar",[]).provider("$navbar",function(){var e=this.defaults={activeClass:"active",routeAttr:"data-match-route",strict:!1};this.$get=function(){return{defaults:e}}}).directive("bsNavbar",["$window","$location","$navbar",function(e,t,n){var a=n.defaults;return{restrict:"A",link:function(e,n,o){var i=angular.copy(a);angular.forEach(Object.keys(a),function(e){angular.isDefined(o[e])&&(i[e]=o[e])}),e.$watch(function(){return t.path()},function(e){var t=n[0].querySelectorAll("li["+i.routeAttr+"]");angular.forEach(t,function(t){var n=angular.element(t),a=n.attr(i.routeAttr).replace("/","\\/");i.strict&&(a="^"+a+"$");var o=new RegExp(a,["i"]);o.test(e)?n.addClass(i.activeClass):n.removeClass(i.activeClass)})})}}}]),angular.module("mgcrea.ngStrap.popover",["mgcrea.ngStrap.tooltip"]).provider("$popover",function(){var e=this.defaults={animation:"am-fade",customClass:"",container:!1,target:!1,placement:"right",template:"popover/popover.tpl.html",contentTemplate:!1,trigger:"click",keyboard:!0,html:!1,title:"",content:"",delay:0};this.$get=["$tooltip",function(t){function n(n,a){var o=angular.extend({},e,a),i=t(n,o);return o.content&&(i.$scope.content=o.content),i}return n}]}).directive("bsPopover",["$window","$sce","$popover",function(e,t,n){var a=e.requestAnimationFrame||e.setTimeout;return{restrict:"EAC",scope:!0,link:function(e,o,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","customClass"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title","content"],function(n){i[n]&&i.$observe(n,function(o,i){e[n]=t.trustAsHtml(o),angular.isDefined(i)&&a(function(){s&&s.$applyPlacement() +})})}),i.bsPopover&&e.$watch(i.bsPopover,function(t,n){angular.isObject(t)?angular.extend(e,t):e.content=t,angular.isDefined(n)&&a(function(){s&&s.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(",?(popover),?")),e===!0?s.show():s.hide())});var s=n(o,r);e.$on("$destroy",function(){s&&s.destroy(),r=null,s=null})}}}]),angular.module("mgcrea.ngStrap.scrollspy",["mgcrea.ngStrap.helpers.debounce","mgcrea.ngStrap.helpers.dimensions"]).provider("$scrollspy",function(){var e=this.$$spies={},n=this.defaults={debounce:150,throttle:100,offset:100};this.$get=["$window","$document","$rootScope","dimensions","debounce","throttle",function(a,o,i,r,s,l){function u(e,t){return e[0].nodeName&&e[0].nodeName.toLowerCase()===t.toLowerCase()}function c(o){var c=angular.extend({},n,o);c.element||(c.element=p);var m=u(c.element,"body"),g=m?d:c.element,$=m?"window":c.id;if(e[$])return e[$].$$count++,e[$];var h,v,y,w,b,D,k,S,T={},x=T.$trackedElements=[],M=[];return T.init=function(){this.$$count=1,w=s(this.checkPosition,c.debounce),b=l(this.checkPosition,c.throttle),g.on("click",this.checkPositionWithEventLoop),d.on("resize",w),g.on("scroll",b),D=s(this.checkOffsets,c.debounce),h=i.$on("$viewContentLoaded",D),v=i.$on("$includeContentLoaded",D),D(),$&&(e[$]=T)},T.destroy=function(){this.$$count--,this.$$count>0||(g.off("click",this.checkPositionWithEventLoop),d.off("resize",w),g.off("scroll",w),h(),v(),$&&delete e[$])},T.checkPosition=function(){if(M.length){if(S=(m?a.pageYOffset:g.prop("scrollTop"))||0,k=Math.max(a.innerHeight,f.prop("clientHeight")),SM[e+1].offsetTop))return T.$activateElement(M[e])}},T.checkPositionWithEventLoop=function(){setTimeout(this.checkPosition,1)},T.$activateElement=function(e){if(y){var t=T.$getTrackedElement(y);t&&(t.source.removeClass("active"),u(t.source,"li")&&u(t.source.parent().parent(),"li")&&t.source.parent().parent().removeClass("active"))}y=e.target,e.source.addClass("active"),u(e.source,"li")&&u(e.source.parent().parent(),"li")&&e.source.parent().parent().addClass("active")},T.$getTrackedElement=function(e){return x.filter(function(t){return t.target===e})[0]},T.checkOffsets=function(){angular.forEach(x,function(e){var n=t.querySelector(e.target);e.offsetTop=n?r.offset(n).top:null,c.offset&&null!==e.offsetTop&&(e.offsetTop-=1*c.offset)}),M=x.filter(function(e){return null!==e.offsetTop}).sort(function(e,t){return e.offsetTop-t.offsetTop}),w()},T.trackElement=function(e,t){x.push({target:e,source:t})},T.untrackElement=function(e,t){for(var n,a=x.length;a--;)if(x[a].target===e&&x[a].source===t){n=a;break}x=x.splice(n,1)},T.activate=function(e){x[e].addClass("active")},T.init(),T}var d=angular.element(a),f=angular.element(o.prop("documentElement")),p=angular.element(a.document.body);return c}]}).directive("bsScrollspy",["$rootScope","debounce","dimensions","$scrollspy",function(e,t,n,a){return{restrict:"EAC",link:function(e,t,n){var o={scope:e};angular.forEach(["offset","target"],function(e){angular.isDefined(n[e])&&(o[e]=n[e])});var i=a(o);i.trackElement(o.target,t),e.$on("$destroy",function(){i&&(i.untrackElement(o.target,t),i.destroy()),o=null,i=null})}}}]).directive("bsScrollspyList",["$rootScope","debounce","dimensions","$scrollspy",function(){return{restrict:"A",compile:function(e){var t=e[0].querySelectorAll("li > a[href]");angular.forEach(t,function(e){var t=angular.element(e);t.parent().attr("bs-scrollspy","").attr("data-target",t.attr("href"))})}}}]),angular.module("mgcrea.ngStrap.select",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$select",function(){var e=this.defaults={animation:"am-fade",prefixClass:"select",prefixEvent:"$select",placement:"bottom-left",template:"select/select.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,multiple:!1,allNoneButtons:!1,sort:!0,caretHtml:' ',placeholder:"Choose among the following...",maxLength:3,maxLengthHtml:"selected",iconCheckmark:"glyphicon glyphicon-ok"};this.$get=["$window","$document","$rootScope","$tooltip",function(t,n,a,o){function i(t,n,a){var i={},r=angular.extend({},e,a);i=o(t,r);var l=i.$scope;l.$matches=[],l.$activeIndex=0,l.$isMultiple=r.multiple,l.$showAllNoneButtons=r.allNoneButtons&&r.multiple,l.$iconCheckmark=r.iconCheckmark,l.$activate=function(e){l.$$postDigest(function(){i.activate(e)})},l.$select=function(e){l.$$postDigest(function(){i.select(e)})},l.$isVisible=function(){return i.$isVisible()},l.$isActive=function(e){return i.$isActive(e)},l.$selectAll=function(){for(var e=0;e=l.$matches.length&&(l.$activeIndex=r.multiple?[]:0)},i.$isVisible=function(){return r.minLength&&n?l.$matches.length&&n.$viewValue.length>=r.minLength:l.$matches.length},i.$isActive=function(e){return r.multiple?-1!==l.$activeIndex.indexOf(e):l.$activeIndex===e},i.$getIndex=function(e){var t=l.$matches.length,n=t;if(t){for(n=t;n--&&l.$matches[n].value!==e;);if(!(0>n))return n}},i.$onMouseDown=function(e){if(e.preventDefault(),e.stopPropagation(),s){var t=angular.element(e.target);t.triggerHandler("click")}},i.$onKeyDown=function(e){if(/(9|13|38|40)/.test(e.keyCode)){if(e.preventDefault(),e.stopPropagation(),!r.multiple&&(13===e.keyCode||9===e.keyCode))return i.select(l.$activeIndex);38===e.keyCode&&l.$activeIndex>0?l.$activeIndex--:40===e.keyCode&&l.$activeIndex'),l.after(t)}var u=o(n.ngOptions),c=a(t,r,s),d=u.$match[7].replace(/\|.+/,"").trim();e.$watch(d,function(){u.valuesFn(e,r).then(function(e){c.update(e),r.$render()})},!0),e.$watch(n.ngModel,function(){c.$updateActiveIndex(),r.$render()},!0),r.$render=function(){var e,a;s.multiple&&angular.isArray(r.$modelValue)?(e=r.$modelValue.map(function(e){return a=c.$getIndex(e),angular.isDefined(a)?c.$scope.$matches[a].label:!1}).filter(angular.isDefined),e=e.length>(s.maxLength||i.maxLength)?e.length+" "+(s.maxLengthHtml||i.maxLengthHtml):e.join(", ")):(a=c.$getIndex(r.$modelValue),e=angular.isDefined(a)?c.$scope.$matches[a].label:!1),t.html((e?e:n.placeholder||i.placeholder)+i.caretHtml)},e.$on("$destroy",function(){c&&c.destroy(),s=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tab",[]).provider("$tab",function(){var e=this.defaults={animation:"am-fade",template:"tab/tab.tpl.html",navClass:"nav-tabs"},t=this.controller=function(t,n,a){var o=this;o.$options=angular.copy(e),angular.forEach(["animation"],function(e){angular.isDefined(a[e])&&(o.$options[e]=a[e])}),o.$panes=t.$panes=[],o.$viewChangeListeners=[],o.$push=function(e){o.$panes.push(e)},o.$panes.$active=0,o.$setActive=t.$setActive=function(e){o.$panes.$active=e,o.$viewChangeListeners.forEach(function(e){e()})}};this.$get=function(){var n={};return n.defaults=e,n.controller=t,n}}).directive("bsTabs",["$window","$animate","$tab",function(e,t,n){var a=n.defaults;return{require:["?ngModel","bsTabs"],transclude:!0,scope:!0,controller:n.controller,templateUrl:function(e,t){return t.template||a.template},link:function(e,t,n,o){var i=o[0],r=o[1];e.$navClass=n.navClass||a.navClass,i&&(r.$viewChangeListeners.push(function(){i.$setViewValue(r.$panes.$active)}),i.$formatters.push(function(e){return r.$setActive(1*e),e}))}}}]).directive("bsPane",["$window","$animate","$sce",function(e,t,n){return{require:["^?ngModel","^bsTabs"],scope:!0,link:function(e,a,o,i){function r(){var n=s.$panes.indexOf(e),o=s.$panes.$active;t[n===o?"addClass":"removeClass"](a,"active")}var s=(i[0],i[1]);a.addClass("tab-pane"),o.$observe("title",function(t){e.title=n.trustAsHtml(t)}),s.$options.animation&&a.addClass(s.$options.animation),s.$push(e),s.$viewChangeListeners.push(function(){r()}),r()}}}]),angular.module("mgcrea.ngStrap.timepicker",["mgcrea.ngStrap.helpers.dateParser","mgcrea.ngStrap.tooltip"]).provider("$timepicker",function(){var e=this.defaults={animation:"am-fade",prefixClass:"timepicker",placement:"bottom-left",template:"timepicker/timepicker.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,useNative:!0,timeType:"date",timeFormat:"shortTime",modelTimeFormat:null,autoclose:!1,minTime:-1/0,maxTime:+1/0,length:5,hourStep:1,minuteStep:5,iconUp:"glyphicon glyphicon-chevron-up",iconDown:"glyphicon glyphicon-chevron-down",arrowBehavior:"pager"};this.$get=["$window","$document","$rootScope","$sce","$locale","dateFilter","$tooltip",function(t,n,a,o,i,r,s){function l(t,n,a){function o(e,n){if(t[0].createTextRange){var a=t[0].createTextRange();a.collapse(!0),a.moveStart("character",e),a.moveEnd("character",n),a.select()}else t[0].setSelectionRange?t[0].setSelectionRange(e,n):angular.isUndefined(t[0].selectionStart)&&(t[0].selectionStart=e,t[0].selectionEnd=n)}function l(){t[0].focus()}var d=s(t,angular.extend({},e,a)),f=a.scope,p=d.$options,m=d.$scope,g=0,$=n.$dateValue||new Date,h={hour:$.getHours(),meridian:$.getHours()<12,minute:$.getMinutes(),second:$.getSeconds(),millisecond:$.getMilliseconds()},v=i.DATETIME_FORMATS[p.timeFormat]||p.timeFormat,y=/(h+)([:\.])?(m+)[ ]?(a?)/i.exec(v).slice(1);m.$iconUp=p.iconUp,m.$iconDown=p.iconDown,m.$select=function(e,t){d.select(e,t)},m.$moveIndex=function(e,t){d.$moveIndex(e,t)},m.$switchMeridian=function(e){d.switchMeridian(e)},d.update=function(e){angular.isDate(e)&&!isNaN(e.getTime())?(d.$date=e,angular.extend(h,{hour:e.getHours(),minute:e.getMinutes(),second:e.getSeconds(),millisecond:e.getMilliseconds()}),d.$build()):d.$isBuilt||d.$build()},d.select=function(e,t,a){(!n.$dateValue||isNaN(n.$dateValue.getTime()))&&(n.$dateValue=new Date(1970,0,1)),angular.isDate(e)||(e=new Date(e)),0===t?n.$dateValue.setHours(e.getHours()):1===t&&n.$dateValue.setMinutes(e.getMinutes()),n.$setViewValue(n.$dateValue),n.$render(),p.autoclose&&!a&&d.hide(!0)},d.switchMeridian=function(e){var t=(e||n.$dateValue).getHours();n.$dateValue.setHours(12>t?t+12:t-12),n.$setViewValue(n.$dateValue),n.$render()},d.$build=function(){var e,t,n=m.midIndex=parseInt(p.length/2,10),a=[];for(e=0;e1*p.maxTime},m.$arrowAction=function(e,t){"picker"===p.arrowBehavior?d.$setTimeByStep(e,t):d.$moveIndex(e,t)},d.$setTimeByStep=function(e,t){{var n=new Date(d.$date),a=n.getHours(),o=(r(n,"h").length,n.getMinutes());r(n,"mm").length}0===t?n.setHours(a-parseInt(p.hourStep,10)*e):n.setMinutes(o-parseInt(p.minuteStep,10)*e),d.select(n,t,!0),f.$digest()},d.$moveIndex=function(e,t){var n;0===t?(n=new Date(1970,0,1,h.hour+e*p.length,h.minute),angular.extend(h,{hour:n.getHours()})):1===t&&(n=new Date(1970,0,1,h.hour,h.minute+e*p.length*p.minuteStep),angular.extend(h,{minute:n.getMinutes()})),d.$build()},d.$onMouseDown=function(e){if("input"!==e.target.nodeName.toLowerCase()&&e.preventDefault(),e.stopPropagation(),c){var t=angular.element(e.target);"button"!==t[0].nodeName.toLowerCase()&&(t=t.parent()),t.triggerHandler("click")}},d.$onKeyDown=function(e){if(/(38|37|39|40|13)/.test(e.keyCode)&&!e.shiftKey&&!e.altKey){if(e.preventDefault(),e.stopPropagation(),13===e.keyCode)return d.hide(!0);var t=new Date(d.$date),n=t.getHours(),a=r(t,"h").length,i=t.getMinutes(),s=r(t,"mm").length,l=/(37|39)/.test(e.keyCode),u=2+1*!!y[3];l&&(37===e.keyCode?g=1>g?u-1:g-1:39===e.keyCode&&(g=u-1>g?g+1:0));var c=[0,a];0===g?(38===e.keyCode?t.setHours(n-parseInt(p.hourStep,10)):40===e.keyCode&&t.setHours(n+parseInt(p.hourStep,10)),c=[0,a]):1===g?(38===e.keyCode?t.setMinutes(i-parseInt(p.minuteStep,10)):40===e.keyCode&&t.setMinutes(i+parseInt(p.minuteStep,10)),c=[a+1,a+1+s]):2===g&&(l||d.switchMeridian(),c=[a+1+s+1,a+1+s+3]),d.select(t,g,!0),o(c[0],c[1]),f.$digest()}};var w=d.init;d.init=function(){return u&&p.useNative?(t.prop("type","time"),t.css("-webkit-appearance","textfield"),void 0):(c&&(t.prop("type","text"),t.attr("readonly","true"),t.on("click",l)),w(),void 0)};var b=d.destroy;d.destroy=function(){u&&p.useNative&&t.off("click",l),b()};var D=d.show;d.show=function(){D(),setTimeout(function(){d.$element.on(c?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.on("keydown",d.$onKeyDown)})};var k=d.hide;return d.hide=function(e){d.$element.off(c?"touchstart":"mousedown",d.$onMouseDown),p.keyboard&&t.off("keydown",d.$onKeyDown),k(e)},d}var u=(angular.element(t.document.body),/(ip(a|o)d|iphone|android)/gi.test(t.navigator.userAgent)),c="createTouch"in t.document&&u;return e.lang||(e.lang=i.id),l.defaults=e,l}]}).directive("bsTimepicker",["$window","$parse","$q","$locale","dateFilter","$timepicker","$dateParser","$timeout",function(e,t,n,a,o,i,r){{var s=i.defaults,l=/(ip(a|o)d|iphone|android)/gi.test(e.navigator.userAgent);e.requestAnimationFrame||e.setTimeout}return{restrict:"EAC",require:"ngModel",link:function(e,t,n,a){var u={scope:e,controller:a};angular.forEach(["placement","container","delay","trigger","keyboard","html","animation","template","autoclose","timeType","timeFormat","modelTimeFormat","useNative","hourStep","minuteStep","length","arrowBehavior"],function(e){angular.isDefined(n[e])&&(u[e]=n[e])}),n.bsShow&&e.$watch(n.bsShow,function(e){c&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(",?(timepicker),?")),e===!0?c.show():c.hide())}),l&&(u.useNative||s.useNative)&&(u.timeFormat="HH:mm");var c=i(t,a,u);u=c.$options;var d=r({format:u.timeFormat,lang:u.lang});angular.forEach(["minTime","maxTime"],function(e){angular.isDefined(n[e])&&n.$observe(e,function(t){c.$options[e]="now"===t?(new Date).setFullYear(1970,0,1):angular.isString(t)&&t.match(/^".+"$/)?+new Date(t.substr(1,t.length-2)):d.parse(t,new Date(1970,0,1,0)),!isNaN(c.$options[e])&&c.$build()})}),e.$watch(n.ngModel,function(){c.update(a.$dateValue)},!0),a.$parsers.unshift(function(e){if(!e)return a.$setValidity("date",!0),void 0;var t=d.parse(e,a.$dateValue);if(!t||isNaN(t.getTime()))a.$setValidity("date",!1);else{var n=t.getTime()>=u.minTime&&t.getTime()<=u.maxTime;a.$setValidity("date",n),n&&(a.$dateValue=t)}return"string"===u.timeType?o(t,u.modelTimeFormat||u.timeFormat):"number"===u.timeType?a.$dateValue.getTime():"iso"===u.timeType?a.$dateValue.toISOString():new Date(a.$dateValue)}),a.$formatters.push(function(e){var t;return t=angular.isUndefined(e)||null===e?0/0:angular.isDate(e)?e:"string"===u.timeType?d.parse(e,null,u.modelTimeFormat):new Date(e),a.$dateValue=t,a.$dateValue}),a.$render=function(){t.val(!a.$dateValue||isNaN(a.$dateValue.getTime())?"":o(a.$dateValue,u.timeFormat))},e.$on("$destroy",function(){c&&c.destroy(),u=null,c=null})}}}]),angular.module("mgcrea.ngStrap.tooltip",["mgcrea.ngStrap.helpers.dimensions"]).provider("$tooltip",function(){var e=this.defaults={animation:"am-fade",customClass:"",prefixClass:"tooltip",prefixEvent:"tooltip",container:!1,target:!1,placement:"top",template:"tooltip/tooltip.tpl.html",contentTemplate:!1,trigger:"hover focus",keyboard:!1,html:!1,show:!1,title:"",type:"",delay:0};this.$get=["$window","$rootScope","$compile","$q","$templateCache","$http","$animate","dimensions","$$rAF",function(n,a,o,i,r,s,l,u,c){function d(t,n){function i(){return"body"===h.container?u.offset(h.target[0]||t[0]):u.position(h.target[0]||t[0])}function r(e,t,n,a){var o,i=e.split("-");switch(i[0]){case"right":o={top:t.top+t.height/2-a/2,left:t.left+t.width};break;case"bottom":o={top:t.top+t.height,left:t.left+t.width/2-n/2};break;case"left":o={top:t.top+t.height/2-a/2,left:t.left-n};break;default:o={top:t.top-a,left:t.left+t.width/2-n/2}}if(!i[1])return o;if("top"===i[0]||"bottom"===i[0])switch(i[1]){case"left":o.left=t.left;break;case"right":o.left=t.left+t.width-n}else if("left"===i[0]||"right"===i[0])switch(i[1]){case"top":o.top=t.top-a;break;case"bottom":o.top=t.top+t.height}return o}var s={},d=t[0].nodeName.toLowerCase(),h=s.$options=angular.extend({},e,n);s.$promise=p(h.template);var v=s.$scope=h.scope&&h.scope.$new()||a.$new();h.delay&&angular.isString(h.delay)&&(h.delay=parseFloat(h.delay)),h.title&&(s.$scope.title=h.title),v.$hide=function(){v.$$postDigest(function(){s.hide()})},v.$show=function(){v.$$postDigest(function(){s.show()})},v.$toggle=function(){v.$$postDigest(function(){s.toggle()})},s.$isShown=v.$isShown=!1;var y,w;h.contentTemplate&&(s.$promise=s.$promise.then(function(e){var t=angular.element(e);return p(h.contentTemplate).then(function(e){var n=f('[ng-bind="content"]',t[0]);return n.length||(n=f('[ng-bind="title"]',t[0])),n.removeAttr("ng-bind").html(e),t[0].outerHTML})}));var b,D,k,S;return s.$promise.then(function(e){angular.isObject(e)&&(e=e.data),h.html&&(e=e.replace($,'ng-bind-html="')),e=m.apply(e),k=e,b=o(e),s.init()}),s.init=function(){h.delay&&angular.isNumber(h.delay)&&(h.delay={show:h.delay,hide:h.delay}),"self"===h.container?S=t:angular.isElement(h.container)?S=h.container:h.container&&(S=f(h.container));var e=h.trigger.split(" ");angular.forEach(e,function(e){"click"===e?t.on("click",s.toggle):"manual"!==e&&(t.on("hover"===e?"mouseenter":"focus",s.enter),t.on("hover"===e?"mouseleave":"blur",s.leave),"button"===d&&"hover"!==e&&t.on(g?"touchstart":"mousedown",s.$onFocusElementMouseDown))}),h.target&&(h.target=angular.isElement(h.target)?h.target:f(h.target)),h.show&&v.$$postDigest(function(){"focus"===h.trigger?t[0].focus():s.show()})},s.destroy=function(){for(var e=h.trigger.split(" "),n=e.length;n--;){var a=e[n];"click"===a?t.off("click",s.toggle):"manual"!==a&&(t.off("hover"===a?"mouseenter":"focus",s.enter),t.off("hover"===a?"mouseleave":"blur",s.leave),"button"===d&&"hover"!==a&&t.off(g?"touchstart":"mousedown",s.$onFocusElementMouseDown))}D&&(D.remove(),D=null),clearTimeout(y),v.$destroy()},s.enter=function(){return clearTimeout(y),w="in",h.delay&&h.delay.show?(y=setTimeout(function(){"in"===w&&s.show()},h.delay.show),void 0):s.show()},s.show=function(){v.$emit(h.prefixEvent+".show.before",s);var e=h.container?S:null,n=h.container?null:t;D&&D.remove(),D=s.$element=b(v,function(){}),D.css({top:"-9999px",left:"-9999px",display:"block",visibility:"hidden"}).addClass(h.placement),h.animation&&D.addClass(h.animation),h.type&&D.addClass(h.prefixClass+"-"+h.type),h.customClass&&D.addClass(h.customClass),l.enter(D,e,n,function(){v.$emit(h.prefixEvent+".show",s)}),s.$isShown=v.$isShown=!0,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),c(function(){s.$applyPlacement(),D.css({visibility:"visible"})}),h.keyboard&&("focus"!==h.trigger?(s.focus(),D.on("keyup",s.$onKeyUp)):t.on("keyup",s.$onFocusKeyUp))},s.leave=function(){return clearTimeout(y),w="out",h.delay&&h.delay.hide?(y=setTimeout(function(){"out"===w&&s.hide()},h.delay.hide),void 0):s.hide()},s.hide=function(e){s.$isShown&&(v.$emit(h.prefixEvent+".hide.before",s),l.leave(D,function(){return v.$emit(h.prefixEvent+".hide",s),e&&"focus"===h.trigger?t[0].blur():void 0}),s.$isShown=v.$isShown=!1,v.$$phase||v.$root&&v.$root.$$phase||v.$digest(),h.keyboard&&null!==D&&D.off("keyup",s.$onKeyUp))},s.toggle=function(){s.$isShown?s.leave():s.enter()},s.focus=function(){D[0].focus()},s.$applyPlacement=function(){if(D){var e=i(),t=D.prop("offsetWidth"),n=D.prop("offsetHeight"),a=r(h.placement,e,t,n);a.top+="px",a.left+="px",D.css(a)}},s.$onKeyUp=function(e){27===e.which&&s.$isShown&&(s.hide(),e.stopPropagation())},s.$onFocusKeyUp=function(e){27===e.which&&(t[0].blur(),e.stopPropagation())},s.$onFocusElementMouseDown=function(e){e.preventDefault(),e.stopPropagation(),s.$isShown?t[0].blur():t[0].focus()},s}function f(e,n){return angular.element((n||t).querySelectorAll(e))}function p(e){return i.when(r.get(e)||s.get(e)).then(function(t){return angular.isObject(t)?(r.put(e,t.data),t.data):t})}var m=String.prototype.trim,g="createTouch"in n.document,$=/ng-bind="/gi;return d}]}).directive("bsTooltip",["$window","$location","$sce","$tooltip","$$rAF",function(e,t,n,a,o){return{restrict:"EAC",scope:!0,link:function(e,t,i){var r={scope:e};angular.forEach(["template","contentTemplate","placement","container","target","delay","trigger","keyboard","html","animation","type","customClass"],function(e){angular.isDefined(i[e])&&(r[e]=i[e])}),angular.forEach(["title"],function(t){i.$observe(t,function(a,i){e[t]=n.trustAsHtml(a),angular.isDefined(i)&&o(function(){s&&s.$applyPlacement()})})}),i.bsTooltip&&e.$watch(i.bsTooltip,function(t,n){angular.isObject(t)?angular.extend(e,t):e.title=t,angular.isDefined(n)&&o(function(){s&&s.$applyPlacement()})},!0),i.bsShow&&e.$watch(i.bsShow,function(e){s&&angular.isDefined(e)&&(angular.isString(e)&&(e=!!e.match(",?(tooltip),?")),e===!0?s.show():s.hide())});var s=a(t,r);e.$on("$destroy",function(){s&&s.destroy(),r=null,s=null})}}}]),angular.module("mgcrea.ngStrap.typeahead",["mgcrea.ngStrap.tooltip","mgcrea.ngStrap.helpers.parseOptions"]).provider("$typeahead",function(){var e=this.defaults={animation:"am-fade",prefixClass:"typeahead",prefixEvent:"$typeahead",placement:"bottom-left",template:"typeahead/typeahead.tpl.html",trigger:"focus",container:!1,keyboard:!0,html:!1,delay:0,minLength:1,filter:"filter",limit:6};this.$get=["$window","$rootScope","$tooltip",function(t,n,a){function o(t,n,o){var i={},r=angular.extend({},e,o);i=a(t,r);var s=o.scope,l=i.$scope;l.$resetMatches=function(){l.$matches=[],l.$activeIndex=0},l.$resetMatches(),l.$activate=function(e){l.$$postDigest(function(){i.activate(e)})},l.$select=function(e){l.$$postDigest(function(){i.select(e)})},l.$isVisible=function(){return i.$isVisible()},i.update=function(e){l.$matches=e,l.$activeIndex>=e.length&&(l.$activeIndex=0)},i.activate=function(e){l.$activeIndex=e},i.select=function(e){var t=l.$matches[e].value;n.$setViewValue(t),n.$render(),l.$resetMatches(),s&&s.$digest(),l.$emit(r.prefixEvent+".select",t,e)},i.$isVisible=function(){return r.minLength&&n?l.$matches.length&&angular.isString(n.$viewValue)&&n.$viewValue.length>=r.minLength:!!l.$matches.length},i.$getIndex=function(e){var t=l.$matches.length,n=t;if(t){for(n=t;n--&&l.$matches[n].value!==e;);if(!(0>n))return n}},i.$onMouseDown=function(e){e.preventDefault(),e.stopPropagation()},i.$onKeyDown=function(e){/(38|40|13)/.test(e.keyCode)&&(i.$isVisible()&&(e.preventDefault(),e.stopPropagation()),13===e.keyCode&&l.$matches.length?i.select(l.$activeIndex):38===e.keyCode&&l.$activeIndex>0?l.$activeIndex--:40===e.keyCode&&l.$activeIndex0)return r.$setViewValue(r.$viewValue.substring(0,r.$viewValue.length-1)),void 0;e.length>u&&(e=e.slice(0,u));var n=f.$isVisible();n&&f.update(e),(1!==e.length||e[0].value!==t)&&(!n&&f.update(e),r.$render())})}),r.$render=function(){if(r.$isEmpty(r.$viewValue))return t.val("");var e=f.$getIndex(r.$modelValue),n=angular.isDefined(e)?f.$scope.$matches[e].label:r.$viewValue;n=angular.isObject(n)?n.label:n,t.val(n.replace(/<(?:.|\n)*?>/gm,"").trim())},e.$on("$destroy",function(){f&&f.destroy(),s=null,f=null})}}}])}(window,document); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-strap_2.0.5/angular-strap.tpl.min.js b/src/main/resources/static/editor-app/libs/angular-strap_2.0.5/angular-strap.tpl.min.js new file mode 100644 index 00000000..a01fd902 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-strap_2.0.5/angular-strap.tpl.min.js @@ -0,0 +1,8 @@ +/** + * angular-strap + * @version v2.0.5 - 2014-09-03 + * @link http://mgcrea.github.io/angular-strap + * @author Olivier Louvignes (olivier@mg-crea.com) + * @license MIT License, http://www.opensource.org/licenses/MIT + */ +!function(){"use strict";angular.module("mgcrea.ngStrap.alert").run(["$templateCache",function(t){t.put("alert/alert.tpl.html",'
       
      ')}]),angular.module("mgcrea.ngStrap.aside").run(["$templateCache",function(t){t.put("aside/aside.tpl.html",'')}]),angular.module("mgcrea.ngStrap.datepicker").run(["$templateCache",function(t){t.put("datepicker/datepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.dropdown").run(["$templateCache",function(t){t.put("dropdown/dropdown.tpl.html",'')}]),angular.module("mgcrea.ngStrap.modal").run(["$templateCache",function(t){t.put("modal/modal.tpl.html",'')}]),angular.module("mgcrea.ngStrap.popover").run(["$templateCache",function(t){t.put("popover/popover.tpl.html",'

      ')}]),angular.module("mgcrea.ngStrap.select").run(["$templateCache",function(t){t.put("select/select.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tab").run(["$templateCache",function(t){t.put("tab/tab.tpl.html",'
      ')}]),angular.module("mgcrea.ngStrap.timepicker").run(["$templateCache",function(t){t.put("timepicker/timepicker.tpl.html",'')}]),angular.module("mgcrea.ngStrap.tooltip").run(["$templateCache",function(t){t.put("tooltip/tooltip.tpl.html",'
      ')}]),angular.module("mgcrea.ngStrap.typeahead").run(["$templateCache",function(t){t.put("typeahead/typeahead.tpl.html",'')}])}(window,document); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/.bower.json b/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/.bower.json new file mode 100644 index 00000000..d2b66a99 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/.bower.json @@ -0,0 +1,19 @@ +{ + "name": "angular-translate-loader-static-files", + "version": "0.1.6", + "main": "./angular-translate-loader-static-files.js", + "dependencies": { + "angular": "1.0.8", + "angular-translate": "~1.1.1" + }, + "homepage": "https://github.com/PascalPrecht/bower-angular-translate-loader-static-files", + "_release": "0.1.6", + "_resolution": { + "type": "version", + "tag": "0.1.6", + "commit": "eaac546d29d6cde45873e6bad9d18cdff071d983" + }, + "_source": "git://github.com/PascalPrecht/bower-angular-translate-loader-static-files.git", + "_target": "0.1.6", + "_originalSource": "angular-translate-loader-static-files" +} \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js b/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js new file mode 100644 index 00000000..ee3303eb --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.js @@ -0,0 +1,31 @@ +/*! + * angular-translate - v2.4.2 - 2014-10-21 + * http://github.com/angular-translate/angular-translate + * Copyright (c) 2014 ; Licensed MIT + */ +angular.module('pascalprecht.translate').factory('$translateStaticFilesLoader', [ + '$q', + '$http', + function ($q, $http) { + return function (options) { + if (!options || (!angular.isString(options.prefix) || !angular.isString(options.suffix))) { + throw new Error('Couldn\'t load static files, no prefix or suffix specified!'); + } + var deferred = $q.defer(); + $http(angular.extend({ + url: [ + options.prefix, + options.key, + options.suffix + ].join(''), + method: 'GET', + params: '' + }, options.$http)).success(function (data) { + deferred.resolve(data); + }).error(function (data) { + deferred.reject(options.key); + }); + return deferred.promise; + }; + } +]); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js b/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js new file mode 100644 index 00000000..c8938bde --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate-loader-static-files/angular-translate-loader-static-files.min.js @@ -0,0 +1,6 @@ +/*! + * angular-translate - v2.4.2 - 2014-10-21 + * http://github.com/angular-translate/angular-translate + * Copyright (c) 2014 ; Licensed MIT + */ +angular.module("pascalprecht.translate").factory("$translateStaticFilesLoader",["$q","$http",function(a,b){return function(c){if(!c||!angular.isString(c.prefix)||!angular.isString(c.suffix))throw new Error("Couldn't load static files, no prefix or suffix specified!");var d=a.defer();return b(angular.extend({url:[c.prefix,c.key,c.suffix].join(""),method:"GET",params:""},c.$http)).success(function(a){d.resolve(a)}).error(function(){d.reject(c.key)}),d.promise}}]); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/.bower.json b/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/.bower.json new file mode 100644 index 00000000..39d2dcec --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/.bower.json @@ -0,0 +1,20 @@ +{ + "name": "angular-translate-storage-cookie", + "version": "0.1.6", + "main": "./angular-translate-storage-cookie.js", + "dependencies": { + "angular": "1.0.8", + "angular-cookies": "1.0.8", + "angular-translate": "~1.1.1" + }, + "homepage": "https://github.com/PascalPrecht/bower-angular-translate-storage-cookie", + "_release": "0.1.6", + "_resolution": { + "type": "version", + "tag": "0.1.6", + "commit": "fc9ea3275f0f9bf0a60ca073b58488d934a348ac" + }, + "_source": "git://github.com/PascalPrecht/bower-angular-translate-storage-cookie.git", + "_target": "0.1.6", + "_originalSource": "angular-translate-storage-cookie" +} \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js b/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js new file mode 100644 index 00000000..34f180b2 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.js @@ -0,0 +1,19 @@ +/*! + * angular-translate - v2.4.2 - 2014-10-21 + * http://github.com/angular-translate/angular-translate + * Copyright (c) 2014 ; Licensed MIT + */ +angular.module('pascalprecht.translate').factory('$translateCookieStorage', [ + '$cookieStore', + function ($cookieStore) { + var $translateCookieStorage = { + get: function (name) { + return $cookieStore.get(name); + }, + set: function (name, value) { + $cookieStore.put(name, value); + } + }; + return $translateCookieStorage; + } +]); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js b/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js new file mode 100644 index 00000000..66f0b929 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate-storage-cookie/angular-translate-storage-cookie.min.js @@ -0,0 +1,6 @@ +/*! + * angular-translate - v2.4.2 - 2014-10-21 + * http://github.com/angular-translate/angular-translate + * Copyright (c) 2014 ; Licensed MIT + */ +angular.module("pascalprecht.translate").factory("$translateCookieStorage",["$cookieStore",function(a){var b={get:function(b){return a.get(b)},set:function(b,c){a.put(b,c)}};return b}]); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js b/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js new file mode 100644 index 00000000..46bcb55f --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.js @@ -0,0 +1,960 @@ +/*! + * angular-translate - v2.4.2 - 2014-10-21 + * http://github.com/angular-translate/angular-translate + * Copyright (c) 2014 ; Licensed MIT + */ +angular.module('pascalprecht.translate', ['ng']).run([ + '$translate', + function ($translate) { + var key = $translate.storageKey(), storage = $translate.storage(); + if (storage) { + if (!storage.get(key)) { + if (angular.isString($translate.preferredLanguage())) { + $translate.use($translate.preferredLanguage()); + } else { + storage.set(key, $translate.use()); + } + } else { + $translate.use(storage.get(key)); + } + } else if (angular.isString($translate.preferredLanguage())) { + $translate.use($translate.preferredLanguage()); + } + } +]); +angular.module('pascalprecht.translate').provider('$translate', [ + '$STORAGE_KEY', + function ($STORAGE_KEY) { + var $translationTable = {}, $preferredLanguage, $availableLanguageKeys = [], $languageKeyAliases, $fallbackLanguage, $fallbackWasString, $uses, $nextLang, $storageFactory, $storageKey = $STORAGE_KEY, $storagePrefix, $missingTranslationHandlerFactory, $interpolationFactory, $interpolatorFactories = [], $interpolationSanitizationStrategy = false, $loaderFactory, $cloakClassName = 'translate-cloak', $loaderOptions, $notFoundIndicatorLeft, $notFoundIndicatorRight, $postCompilingEnabled = false, NESTED_OBJECT_DELIMITER = '.', loaderCache; + var version = '2.4.2'; + var getLocale = function () { + var nav = window.navigator; + return ((angular.isArray(nav.languages) ? nav.languages[0] : nav.language || nav.browserLanguage || nav.systemLanguage || nav.userLanguage) || '').split('-').join('_'); + }; + var indexOf = function (array, searchElement) { + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === searchElement) { + return i; + } + } + return -1; + }; + var trim = function () { + return this.replace(/^\s+|\s+$/g, ''); + }; + var negotiateLocale = function (preferred) { + var avail = [], locale = angular.lowercase(preferred), i = 0, n = $availableLanguageKeys.length; + for (; i < n; i++) { + avail.push(angular.lowercase($availableLanguageKeys[i])); + } + if (indexOf(avail, locale) > -1) { + return preferred; + } + if ($languageKeyAliases) { + var alias; + for (var langKeyAlias in $languageKeyAliases) { + var hasWildcardKey = false; + var hasExactKey = Object.prototype.hasOwnProperty.call($languageKeyAliases, langKeyAlias) && angular.lowercase(langKeyAlias) === angular.lowercase(preferred); + if (langKeyAlias.slice(-1) === '*') { + hasWildcardKey = langKeyAlias.slice(0, -1) === preferred.slice(0, langKeyAlias.length - 1); + } + if (hasExactKey || hasWildcardKey) { + alias = $languageKeyAliases[langKeyAlias]; + if (indexOf(avail, angular.lowercase(alias)) > -1) { + return alias; + } + } + } + } + var parts = preferred.split('_'); + if (parts.length > 1 && indexOf(avail, angular.lowercase(parts[0])) > -1) { + return parts[0]; + } + return preferred; + }; + var translations = function (langKey, translationTable) { + if (!langKey && !translationTable) { + return $translationTable; + } + if (langKey && !translationTable) { + if (angular.isString(langKey)) { + return $translationTable[langKey]; + } + } else { + if (!angular.isObject($translationTable[langKey])) { + $translationTable[langKey] = {}; + } + angular.extend($translationTable[langKey], flatObject(translationTable)); + } + return this; + }; + this.translations = translations; + this.cloakClassName = function (name) { + if (!name) { + return $cloakClassName; + } + $cloakClassName = name; + return this; + }; + var flatObject = function (data, path, result, prevKey) { + var key, keyWithPath, keyWithShortPath, val; + if (!path) { + path = []; + } + if (!result) { + result = {}; + } + for (key in data) { + if (!Object.prototype.hasOwnProperty.call(data, key)) { + continue; + } + val = data[key]; + if (angular.isObject(val)) { + flatObject(val, path.concat(key), result, key); + } else { + keyWithPath = path.length ? '' + path.join(NESTED_OBJECT_DELIMITER) + NESTED_OBJECT_DELIMITER + key : key; + if (path.length && key === prevKey) { + keyWithShortPath = '' + path.join(NESTED_OBJECT_DELIMITER); + result[keyWithShortPath] = '@:' + keyWithPath; + } + result[keyWithPath] = val; + } + } + return result; + }; + this.addInterpolation = function (factory) { + $interpolatorFactories.push(factory); + return this; + }; + this.useMessageFormatInterpolation = function () { + return this.useInterpolation('$translateMessageFormatInterpolation'); + }; + this.useInterpolation = function (factory) { + $interpolationFactory = factory; + return this; + }; + this.useSanitizeValueStrategy = function (value) { + $interpolationSanitizationStrategy = value; + return this; + }; + this.preferredLanguage = function (langKey) { + setupPreferredLanguage(langKey); + return this; + }; + var setupPreferredLanguage = function (langKey) { + if (langKey) { + $preferredLanguage = langKey; + } + return $preferredLanguage; + }; + this.translationNotFoundIndicator = function (indicator) { + this.translationNotFoundIndicatorLeft(indicator); + this.translationNotFoundIndicatorRight(indicator); + return this; + }; + this.translationNotFoundIndicatorLeft = function (indicator) { + if (!indicator) { + return $notFoundIndicatorLeft; + } + $notFoundIndicatorLeft = indicator; + return this; + }; + this.translationNotFoundIndicatorRight = function (indicator) { + if (!indicator) { + return $notFoundIndicatorRight; + } + $notFoundIndicatorRight = indicator; + return this; + }; + this.fallbackLanguage = function (langKey) { + fallbackStack(langKey); + return this; + }; + var fallbackStack = function (langKey) { + if (langKey) { + if (angular.isString(langKey)) { + $fallbackWasString = true; + $fallbackLanguage = [langKey]; + } else if (angular.isArray(langKey)) { + $fallbackWasString = false; + $fallbackLanguage = langKey; + } + if (angular.isString($preferredLanguage) && indexOf($fallbackLanguage, $preferredLanguage) < 0) { + $fallbackLanguage.push($preferredLanguage); + } + return this; + } else { + if ($fallbackWasString) { + return $fallbackLanguage[0]; + } else { + return $fallbackLanguage; + } + } + }; + this.use = function (langKey) { + if (langKey) { + if (!$translationTable[langKey] && !$loaderFactory) { + throw new Error('$translateProvider couldn\'t find translationTable for langKey: \'' + langKey + '\''); + } + $uses = langKey; + return this; + } + return $uses; + }; + var storageKey = function (key) { + if (!key) { + if ($storagePrefix) { + return $storagePrefix + $storageKey; + } + return $storageKey; + } + $storageKey = key; + }; + this.storageKey = storageKey; + this.useUrlLoader = function (url, options) { + return this.useLoader('$translateUrlLoader', angular.extend({ url: url }, options)); + }; + this.useStaticFilesLoader = function (options) { + return this.useLoader('$translateStaticFilesLoader', options); + }; + this.useLoader = function (loaderFactory, options) { + $loaderFactory = loaderFactory; + $loaderOptions = options || {}; + return this; + }; + this.useLocalStorage = function () { + return this.useStorage('$translateLocalStorage'); + }; + this.useCookieStorage = function () { + return this.useStorage('$translateCookieStorage'); + }; + this.useStorage = function (storageFactory) { + $storageFactory = storageFactory; + return this; + }; + this.storagePrefix = function (prefix) { + if (!prefix) { + return prefix; + } + $storagePrefix = prefix; + return this; + }; + this.useMissingTranslationHandlerLog = function () { + return this.useMissingTranslationHandler('$translateMissingTranslationHandlerLog'); + }; + this.useMissingTranslationHandler = function (factory) { + $missingTranslationHandlerFactory = factory; + return this; + }; + this.usePostCompiling = function (value) { + $postCompilingEnabled = !!value; + return this; + }; + this.determinePreferredLanguage = function (fn) { + var locale = fn && angular.isFunction(fn) ? fn() : getLocale(); + if (!$availableLanguageKeys.length) { + $preferredLanguage = locale; + } else { + $preferredLanguage = negotiateLocale(locale); + } + return this; + }; + this.registerAvailableLanguageKeys = function (languageKeys, aliases) { + if (languageKeys) { + $availableLanguageKeys = languageKeys; + if (aliases) { + $languageKeyAliases = aliases; + } + return this; + } + return $availableLanguageKeys; + }; + this.useLoaderCache = function (cache) { + if (cache === false) { + loaderCache = undefined; + } else if (cache === true) { + loaderCache = true; + } else if (typeof cache === 'undefined') { + loaderCache = '$translationCache'; + } else if (cache) { + loaderCache = cache; + } + return this; + }; + this.$get = [ + '$log', + '$injector', + '$rootScope', + '$q', + function ($log, $injector, $rootScope, $q) { + var Storage, defaultInterpolator = $injector.get($interpolationFactory || '$translateDefaultInterpolation'), pendingLoader = false, interpolatorHashMap = {}, langPromises = {}, fallbackIndex, startFallbackIteration; + var $translate = function (translationId, interpolateParams, interpolationId) { + if (angular.isArray(translationId)) { + var translateAll = function (translationIds) { + var results = {}; + var promises = []; + var translate = function (translationId) { + var deferred = $q.defer(); + var regardless = function (value) { + results[translationId] = value; + deferred.resolve([ + translationId, + value + ]); + }; + $translate(translationId, interpolateParams, interpolationId).then(regardless, regardless); + return deferred.promise; + }; + for (var i = 0, c = translationIds.length; i < c; i++) { + promises.push(translate(translationIds[i])); + } + return $q.all(promises).then(function () { + return results; + }); + }; + return translateAll(translationId); + } + var deferred = $q.defer(); + if (translationId) { + translationId = trim.apply(translationId); + } + var promiseToWaitFor = function () { + var promise = $preferredLanguage ? langPromises[$preferredLanguage] : langPromises[$uses]; + fallbackIndex = 0; + if ($storageFactory && !promise) { + var langKey = Storage.get($storageKey); + promise = langPromises[langKey]; + if ($fallbackLanguage && $fallbackLanguage.length) { + var index = indexOf($fallbackLanguage, langKey); + fallbackIndex = index === 0 ? 1 : 0; + if (indexOf($fallbackLanguage, $preferredLanguage) < 0) { + $fallbackLanguage.push($preferredLanguage); + } + } + } + return promise; + }(); + if (!promiseToWaitFor) { + determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); + } else { + promiseToWaitFor.then(function () { + determineTranslation(translationId, interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); + }, deferred.reject); + } + return deferred.promise; + }; + var applyNotFoundIndicators = function (translationId) { + if ($notFoundIndicatorLeft) { + translationId = [ + $notFoundIndicatorLeft, + translationId + ].join(' '); + } + if ($notFoundIndicatorRight) { + translationId = [ + translationId, + $notFoundIndicatorRight + ].join(' '); + } + return translationId; + }; + var useLanguage = function (key) { + $uses = key; + $rootScope.$emit('$translateChangeSuccess', { language: key }); + if ($storageFactory) { + Storage.set($translate.storageKey(), $uses); + } + defaultInterpolator.setLocale($uses); + angular.forEach(interpolatorHashMap, function (interpolator, id) { + interpolatorHashMap[id].setLocale($uses); + }); + $rootScope.$emit('$translateChangeEnd', { language: key }); + }; + var loadAsync = function (key) { + if (!key) { + throw 'No language key specified for loading.'; + } + var deferred = $q.defer(); + $rootScope.$emit('$translateLoadingStart', { language: key }); + pendingLoader = true; + var cache = loaderCache; + if (typeof cache === 'string') { + cache = $injector.get(cache); + } + var loaderOptions = angular.extend({}, $loaderOptions, { + key: key, + $http: angular.extend({}, { cache: cache }, $loaderOptions.$http) + }); + $injector.get($loaderFactory)(loaderOptions).then(function (data) { + var translationTable = {}; + $rootScope.$emit('$translateLoadingSuccess', { language: key }); + if (angular.isArray(data)) { + angular.forEach(data, function (table) { + angular.extend(translationTable, flatObject(table)); + }); + } else { + angular.extend(translationTable, flatObject(data)); + } + pendingLoader = false; + deferred.resolve({ + key: key, + table: translationTable + }); + $rootScope.$emit('$translateLoadingEnd', { language: key }); + }, function (key) { + $rootScope.$emit('$translateLoadingError', { language: key }); + deferred.reject(key); + $rootScope.$emit('$translateLoadingEnd', { language: key }); + }); + return deferred.promise; + }; + if ($storageFactory) { + Storage = $injector.get($storageFactory); + if (!Storage.get || !Storage.set) { + throw new Error('Couldn\'t use storage \'' + $storageFactory + '\', missing get() or set() method!'); + } + } + if (angular.isFunction(defaultInterpolator.useSanitizeValueStrategy)) { + defaultInterpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); + } + if ($interpolatorFactories.length) { + angular.forEach($interpolatorFactories, function (interpolatorFactory) { + var interpolator = $injector.get(interpolatorFactory); + interpolator.setLocale($preferredLanguage || $uses); + if (angular.isFunction(interpolator.useSanitizeValueStrategy)) { + interpolator.useSanitizeValueStrategy($interpolationSanitizationStrategy); + } + interpolatorHashMap[interpolator.getInterpolationIdentifier()] = interpolator; + }); + } + var getTranslationTable = function (langKey) { + var deferred = $q.defer(); + if (Object.prototype.hasOwnProperty.call($translationTable, langKey)) { + deferred.resolve($translationTable[langKey]); + } else if (langPromises[langKey]) { + langPromises[langKey].then(function (data) { + translations(data.key, data.table); + deferred.resolve(data.table); + }, deferred.reject); + } else { + deferred.reject(); + } + return deferred.promise; + }; + var getFallbackTranslation = function (langKey, translationId, interpolateParams, Interpolator) { + var deferred = $q.defer(); + getTranslationTable(langKey).then(function (translationTable) { + if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { + Interpolator.setLocale(langKey); + deferred.resolve(Interpolator.interpolate(translationTable[translationId], interpolateParams)); + Interpolator.setLocale($uses); + } else { + deferred.reject(); + } + }, deferred.reject); + return deferred.promise; + }; + var getFallbackTranslationInstant = function (langKey, translationId, interpolateParams, Interpolator) { + var result, translationTable = $translationTable[langKey]; + if (Object.prototype.hasOwnProperty.call(translationTable, translationId)) { + Interpolator.setLocale(langKey); + result = Interpolator.interpolate(translationTable[translationId], interpolateParams); + Interpolator.setLocale($uses); + } + return result; + }; + var translateByHandler = function (translationId) { + if ($missingTranslationHandlerFactory) { + var resultString = $injector.get($missingTranslationHandlerFactory)(translationId, $uses); + if (resultString !== undefined) { + return resultString; + } else { + return translationId; + } + } else { + return translationId; + } + }; + var resolveForFallbackLanguage = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { + var deferred = $q.defer(); + if (fallbackLanguageIndex < $fallbackLanguage.length) { + var langKey = $fallbackLanguage[fallbackLanguageIndex]; + getFallbackTranslation(langKey, translationId, interpolateParams, Interpolator).then(deferred.resolve, function () { + resolveForFallbackLanguage(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator).then(deferred.resolve); + }); + } else { + deferred.resolve(translateByHandler(translationId)); + } + return deferred.promise; + }; + var resolveForFallbackLanguageInstant = function (fallbackLanguageIndex, translationId, interpolateParams, Interpolator) { + var result; + if (fallbackLanguageIndex < $fallbackLanguage.length) { + var langKey = $fallbackLanguage[fallbackLanguageIndex]; + result = getFallbackTranslationInstant(langKey, translationId, interpolateParams, Interpolator); + if (!result) { + result = resolveForFallbackLanguageInstant(fallbackLanguageIndex + 1, translationId, interpolateParams, Interpolator); + } + } + return result; + }; + var fallbackTranslation = function (translationId, interpolateParams, Interpolator) { + return resolveForFallbackLanguage(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); + }; + var fallbackTranslationInstant = function (translationId, interpolateParams, Interpolator) { + return resolveForFallbackLanguageInstant(startFallbackIteration > 0 ? startFallbackIteration : fallbackIndex, translationId, interpolateParams, Interpolator); + }; + var determineTranslation = function (translationId, interpolateParams, interpolationId) { + var deferred = $q.defer(); + var table = $uses ? $translationTable[$uses] : $translationTable, Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; + if (table && Object.prototype.hasOwnProperty.call(table, translationId)) { + var translation = table[translationId]; + if (translation.substr(0, 2) === '@:') { + $translate(translation.substr(2), interpolateParams, interpolationId).then(deferred.resolve, deferred.reject); + } else { + deferred.resolve(Interpolator.interpolate(translation, interpolateParams)); + } + } else { + var missingTranslationHandlerTranslation; + if ($missingTranslationHandlerFactory && !pendingLoader) { + missingTranslationHandlerTranslation = translateByHandler(translationId); + } + if ($uses && $fallbackLanguage && $fallbackLanguage.length) { + fallbackTranslation(translationId, interpolateParams, Interpolator).then(function (translation) { + deferred.resolve(translation); + }, function (_translationId) { + deferred.reject(applyNotFoundIndicators(_translationId)); + }); + } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { + deferred.resolve(missingTranslationHandlerTranslation); + } else { + deferred.reject(applyNotFoundIndicators(translationId)); + } + } + return deferred.promise; + }; + var determineTranslationInstant = function (translationId, interpolateParams, interpolationId) { + var result, table = $uses ? $translationTable[$uses] : $translationTable, Interpolator = interpolationId ? interpolatorHashMap[interpolationId] : defaultInterpolator; + if (table && Object.prototype.hasOwnProperty.call(table, translationId)) { + var translation = table[translationId]; + if (translation.substr(0, 2) === '@:') { + result = determineTranslationInstant(translation.substr(2), interpolateParams, interpolationId); + } else { + result = Interpolator.interpolate(translation, interpolateParams); + } + } else { + var missingTranslationHandlerTranslation; + if ($missingTranslationHandlerFactory && !pendingLoader) { + missingTranslationHandlerTranslation = translateByHandler(translationId); + } + if ($uses && $fallbackLanguage && $fallbackLanguage.length) { + fallbackIndex = 0; + result = fallbackTranslationInstant(translationId, interpolateParams, Interpolator); + } else if ($missingTranslationHandlerFactory && !pendingLoader && missingTranslationHandlerTranslation) { + result = missingTranslationHandlerTranslation; + } else { + result = applyNotFoundIndicators(translationId); + } + } + return result; + }; + $translate.preferredLanguage = function (langKey) { + if (langKey) { + setupPreferredLanguage(langKey); + } + return $preferredLanguage; + }; + $translate.cloakClassName = function () { + return $cloakClassName; + }; + $translate.fallbackLanguage = function (langKey) { + if (langKey !== undefined && langKey !== null) { + fallbackStack(langKey); + if ($loaderFactory) { + if ($fallbackLanguage && $fallbackLanguage.length) { + for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { + if (!langPromises[$fallbackLanguage[i]]) { + langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]); + } + } + } + } + $translate.use($translate.use()); + } + if ($fallbackWasString) { + return $fallbackLanguage[0]; + } else { + return $fallbackLanguage; + } + }; + $translate.useFallbackLanguage = function (langKey) { + if (langKey !== undefined && langKey !== null) { + if (!langKey) { + startFallbackIteration = 0; + } else { + var langKeyPosition = indexOf($fallbackLanguage, langKey); + if (langKeyPosition > -1) { + startFallbackIteration = langKeyPosition; + } + } + } + }; + $translate.proposedLanguage = function () { + return $nextLang; + }; + $translate.storage = function () { + return Storage; + }; + $translate.use = function (key) { + if (!key) { + return $uses; + } + var deferred = $q.defer(); + $rootScope.$emit('$translateChangeStart', { language: key }); + var aliasedKey = negotiateLocale(key); + if (aliasedKey) { + key = aliasedKey; + } + if (!$translationTable[key] && $loaderFactory && !langPromises[key]) { + $nextLang = key; + langPromises[key] = loadAsync(key).then(function (translation) { + translations(translation.key, translation.table); + deferred.resolve(translation.key); + useLanguage(translation.key); + if ($nextLang === key) { + $nextLang = undefined; + } + }, function (key) { + if ($nextLang === key) { + $nextLang = undefined; + } + $rootScope.$emit('$translateChangeError', { language: key }); + deferred.reject(key); + $rootScope.$emit('$translateChangeEnd', { language: key }); + }); + } else { + deferred.resolve(key); + useLanguage(key); + } + return deferred.promise; + }; + $translate.storageKey = function () { + return storageKey(); + }; + $translate.isPostCompilingEnabled = function () { + return $postCompilingEnabled; + }; + $translate.refresh = function (langKey) { + if (!$loaderFactory) { + throw new Error('Couldn\'t refresh translation table, no loader registered!'); + } + var deferred = $q.defer(); + function resolve() { + deferred.resolve(); + $rootScope.$emit('$translateRefreshEnd', { language: langKey }); + } + function reject() { + deferred.reject(); + $rootScope.$emit('$translateRefreshEnd', { language: langKey }); + } + $rootScope.$emit('$translateRefreshStart', { language: langKey }); + if (!langKey) { + var tables = [], loadingKeys = {}; + if ($fallbackLanguage && $fallbackLanguage.length) { + for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { + tables.push(loadAsync($fallbackLanguage[i])); + loadingKeys[$fallbackLanguage[i]] = true; + } + } + if ($uses && !loadingKeys[$uses]) { + tables.push(loadAsync($uses)); + } + $q.all(tables).then(function (tableData) { + angular.forEach(tableData, function (data) { + if ($translationTable[data.key]) { + delete $translationTable[data.key]; + } + translations(data.key, data.table); + }); + if ($uses) { + useLanguage($uses); + } + resolve(); + }); + } else if ($translationTable[langKey]) { + loadAsync(langKey).then(function (data) { + translations(data.key, data.table); + if (langKey === $uses) { + useLanguage($uses); + } + resolve(); + }, reject); + } else { + reject(); + } + return deferred.promise; + }; + $translate.instant = function (translationId, interpolateParams, interpolationId) { + if (translationId === null || angular.isUndefined(translationId)) { + return translationId; + } + if (angular.isArray(translationId)) { + var results = {}; + for (var i = 0, c = translationId.length; i < c; i++) { + results[translationId[i]] = $translate.instant(translationId[i], interpolateParams, interpolationId); + } + return results; + } + if (angular.isString(translationId) && translationId.length < 1) { + return translationId; + } + if (translationId) { + translationId = trim.apply(translationId); + } + var result, possibleLangKeys = []; + if ($preferredLanguage) { + possibleLangKeys.push($preferredLanguage); + } + if ($uses) { + possibleLangKeys.push($uses); + } + if ($fallbackLanguage && $fallbackLanguage.length) { + possibleLangKeys = possibleLangKeys.concat($fallbackLanguage); + } + for (var j = 0, d = possibleLangKeys.length; j < d; j++) { + var possibleLangKey = possibleLangKeys[j]; + if ($translationTable[possibleLangKey]) { + if (typeof $translationTable[possibleLangKey][translationId] !== 'undefined') { + result = determineTranslationInstant(translationId, interpolateParams, interpolationId); + } + } + if (typeof result !== 'undefined') { + break; + } + } + if (!result && result !== '') { + result = defaultInterpolator.interpolate(translationId, interpolateParams); + if ($missingTranslationHandlerFactory && !pendingLoader) { + result = translateByHandler(translationId); + } + } + return result; + }; + $translate.versionInfo = function () { + return version; + }; + $translate.loaderCache = function () { + return loaderCache; + }; + if ($loaderFactory) { + if (angular.equals($translationTable, {})) { + $translate.use($translate.use()); + } + if ($fallbackLanguage && $fallbackLanguage.length) { + var processAsyncResult = function (translation) { + translations(translation.key, translation.table); + $rootScope.$emit('$translateChangeEnd', { language: translation.key }); + }; + for (var i = 0, len = $fallbackLanguage.length; i < len; i++) { + langPromises[$fallbackLanguage[i]] = loadAsync($fallbackLanguage[i]).then(processAsyncResult); + } + } + } + return $translate; + } + ]; + } +]); +angular.module('pascalprecht.translate').factory('$translateDefaultInterpolation', [ + '$interpolate', + function ($interpolate) { + var $translateInterpolator = {}, $locale, $identifier = 'default', $sanitizeValueStrategy = null, sanitizeValueStrategies = { + escaped: function (params) { + var result = {}; + for (var key in params) { + if (Object.prototype.hasOwnProperty.call(params, key)) { + result[key] = angular.element('
      ').text(params[key]).html(); + } + } + return result; + } + }; + var sanitizeParams = function (params) { + var result; + if (angular.isFunction(sanitizeValueStrategies[$sanitizeValueStrategy])) { + result = sanitizeValueStrategies[$sanitizeValueStrategy](params); + } else { + result = params; + } + return result; + }; + $translateInterpolator.setLocale = function (locale) { + $locale = locale; + }; + $translateInterpolator.getInterpolationIdentifier = function () { + return $identifier; + }; + $translateInterpolator.useSanitizeValueStrategy = function (value) { + $sanitizeValueStrategy = value; + return this; + }; + $translateInterpolator.interpolate = function (string, interpolateParams) { + if ($sanitizeValueStrategy) { + interpolateParams = sanitizeParams(interpolateParams); + } + return $interpolate(string)(interpolateParams || {}); + }; + return $translateInterpolator; + } +]); +angular.module('pascalprecht.translate').constant('$STORAGE_KEY', 'NG_TRANSLATE_LANG_KEY'); +angular.module('pascalprecht.translate').directive('translate', [ + '$translate', + '$q', + '$interpolate', + '$compile', + '$parse', + '$rootScope', + function ($translate, $q, $interpolate, $compile, $parse, $rootScope) { + return { + restrict: 'AE', + scope: true, + compile: function (tElement, tAttr) { + var translateValuesExist = tAttr.translateValues ? tAttr.translateValues : undefined; + var translateInterpolation = tAttr.translateInterpolation ? tAttr.translateInterpolation : undefined; + var translateValueExist = tElement[0].outerHTML.match(/translate-value-+/i); + var interpolateRegExp = '^(.*)(' + $interpolate.startSymbol() + '.*' + $interpolate.endSymbol() + ')(.*)'; + return function linkFn(scope, iElement, iAttr) { + scope.interpolateParams = {}; + scope.preText = ''; + scope.postText = ''; + iAttr.$observe('translate', function (translationId) { + if (angular.equals(translationId, '') || !angular.isDefined(translationId)) { + var interpolateMatches = iElement.text().match(interpolateRegExp); + if (angular.isArray(interpolateMatches)) { + scope.preText = interpolateMatches[1]; + scope.postText = interpolateMatches[3]; + scope.translationId = $interpolate(interpolateMatches[2])(scope.$parent); + } else { + scope.translationId = iElement.text().replace(/^\s+|\s+$/g, ''); + } + } else { + scope.translationId = translationId; + } + }); + iAttr.$observe('translateDefault', function (value) { + scope.defaultText = value; + }); + if (translateValuesExist) { + iAttr.$observe('translateValues', function (interpolateParams) { + if (interpolateParams) { + scope.$parent.$watch(function () { + angular.extend(scope.interpolateParams, $parse(interpolateParams)(scope.$parent)); + }); + } + }); + } + if (translateValueExist) { + var fn = function (attrName) { + iAttr.$observe(attrName, function (value) { + scope.interpolateParams[angular.lowercase(attrName.substr(14, 1)) + attrName.substr(15)] = value; + }); + }; + for (var attr in iAttr) { + if (Object.prototype.hasOwnProperty.call(iAttr, attr) && attr.substr(0, 14) === 'translateValue' && attr !== 'translateValues') { + fn(attr); + } + } + } + var applyElementContent = function (value, scope, successful) { + if (!successful && typeof scope.defaultText !== 'undefined') { + value = scope.defaultText; + } + iElement.html(scope.preText + value + scope.postText); + var globallyEnabled = $translate.isPostCompilingEnabled(); + var locallyDefined = typeof tAttr.translateCompile !== 'undefined'; + var locallyEnabled = locallyDefined && tAttr.translateCompile !== 'false'; + if (globallyEnabled && !locallyDefined || locallyEnabled) { + $compile(iElement.contents())(scope); + } + }; + var updateTranslationFn = function () { + if (!translateValuesExist && !translateValueExist) { + return function () { + var unwatch = scope.$watch('translationId', function (value) { + if (scope.translationId && value) { + $translate(value, {}, translateInterpolation).then(function (translation) { + applyElementContent(translation, scope, true); + unwatch(); + }, function (translationId) { + applyElementContent(translationId, scope, false); + unwatch(); + }); + } + }, true); + }; + } else { + return function () { + var updateTranslations = function () { + if (scope.translationId && scope.interpolateParams) { + $translate(scope.translationId, scope.interpolateParams, translateInterpolation).then(function (translation) { + applyElementContent(translation, scope, true); + }, function (translationId) { + applyElementContent(translationId, scope, false); + }); + } + }; + scope.$watch('interpolateParams', updateTranslations, true); + scope.$watch('translationId', updateTranslations); + }; + } + }(); + var unbind = $rootScope.$on('$translateChangeSuccess', updateTranslationFn); + updateTranslationFn(); + scope.$on('$destroy', unbind); + }; + } + }; + } +]); +angular.module('pascalprecht.translate').directive('translateCloak', [ + '$rootScope', + '$translate', + function ($rootScope, $translate) { + return { + compile: function (tElement) { + var applyCloak = function () { + tElement.addClass($translate.cloakClassName()); + }, removeCloak = function () { + tElement.removeClass($translate.cloakClassName()); + }, removeListener = $rootScope.$on('$translateChangeEnd', function () { + removeCloak(); + removeListener(); + removeListener = null; + }); + applyCloak(); + return function linkFn(scope, iElement, iAttr) { + if (iAttr.translateCloak && iAttr.translateCloak.length) { + iAttr.$observe('translateCloak', function (translationId) { + $translate(translationId).then(removeCloak, applyCloak); + }); + } + }; + } + }; + } +]); +angular.module('pascalprecht.translate').filter('translate', [ + '$parse', + '$translate', + function ($parse, $translate) { + var translateFilter = function (translationId, interpolateParams, interpolation) { + if (!angular.isObject(interpolateParams)) { + interpolateParams = $parse(interpolateParams)(this); + } + return $translate.instant(translationId, interpolateParams, interpolation); + }; + translateFilter.$stateful = true; + return translateFilter; + } +]); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.min.js b/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.min.js new file mode 100644 index 00000000..d5a421d1 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular-translate_2.4.2/angular-translate.min.js @@ -0,0 +1,6 @@ +/*! + * angular-translate - v2.4.2 - 2014-10-21 + * http://github.com/angular-translate/angular-translate + * Copyright (c) 2014 ; Licensed MIT + */ +angular.module("pascalprecht.translate",["ng"]).run(["$translate",function(a){var b=a.storageKey(),c=a.storage();c?c.get(b)?a.use(c.get(b)):angular.isString(a.preferredLanguage())?a.use(a.preferredLanguage()):c.set(b,a.use()):angular.isString(a.preferredLanguage())&&a.use(a.preferredLanguage())}]),angular.module("pascalprecht.translate").provider("$translate",["$STORAGE_KEY",function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q={},r=[],s=a,t=[],u=!1,v="translate-cloak",w=!1,x=".",y="2.4.2",z=function(){var a=window.navigator;return((angular.isArray(a.languages)?a.languages[0]:a.language||a.browserLanguage||a.systemLanguage||a.userLanguage)||"").split("-").join("_")},A=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},B=function(){return this.replace(/^\s+|\s+$/g,"")},C=function(a){for(var b=[],d=angular.lowercase(a),e=0,f=r.length;f>e;e++)b.push(angular.lowercase(r[e]));if(A(b,d)>-1)return a;if(c){var g;for(var h in c){var i=!1,j=Object.prototype.hasOwnProperty.call(c,h)&&angular.lowercase(h)===angular.lowercase(a);if("*"===h.slice(-1)&&(i=h.slice(0,-1)===a.slice(0,h.length-1)),(j||i)&&(g=c[h],A(b,angular.lowercase(g))>-1))return g}}var k=a.split("_");return k.length>1&&A(b,angular.lowercase(k[0]))>-1?k[0]:a},D=function(a,b){if(!a&&!b)return q;if(a&&!b){if(angular.isString(a))return q[a]}else angular.isObject(q[a])||(q[a]={}),angular.extend(q[a],E(b));return this};this.translations=D,this.cloakClassName=function(a){return a?(v=a,this):v};var E=function(a,b,c,d){var e,f,g,h;b||(b=[]),c||(c={});for(e in a)Object.prototype.hasOwnProperty.call(a,e)&&(h=a[e],angular.isObject(h)?E(h,b.concat(e),c,e):(f=b.length?""+b.join(x)+x+e:e,b.length&&e===d&&(g=""+b.join(x),c[g]="@:"+f),c[f]=h));return c};this.addInterpolation=function(a){return t.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return k=a,this},this.useSanitizeValueStrategy=function(a){return u=a,this},this.preferredLanguage=function(a){return F(a),this};var F=function(a){return a&&(b=a),b};this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(n=a,this):n},this.translationNotFoundIndicatorRight=function(a){return a?(o=a,this):o},this.fallbackLanguage=function(a){return G(a),this};var G=function(a){return a?(angular.isString(a)?(e=!0,d=[a]):angular.isArray(a)&&(e=!1,d=a),angular.isString(b)&&A(d,b)<0&&d.push(b),this):e?d[0]:d};this.use=function(a){if(a){if(!q[a]&&!l)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return f=a,this}return f};var H=function(a){return a?void(s=a):i?i+s:s};this.storageKey=H,this.useUrlLoader=function(a,b){return this.useLoader("$translateUrlLoader",angular.extend({url:a},b))},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return l=a,m=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return h=a,this},this.storagePrefix=function(a){return a?(i=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return j=a,this},this.usePostCompiling=function(a){return w=!!a,this},this.determinePreferredLanguage=function(a){var c=a&&angular.isFunction(a)?a():z();return b=r.length?C(c):c,this},this.registerAvailableLanguageKeys=function(a,b){return a?(r=a,b&&(c=b),this):r},this.useLoaderCache=function(a){return a===!1?p=void 0:a===!0?p=!0:"undefined"==typeof a?p="$translationCache":a&&(p=a),this},this.$get=["$log","$injector","$rootScope","$q",function(a,c,i,r){var x,z,I,J=c.get(k||"$translateDefaultInterpolation"),K=!1,L={},M={},N=function(a,c,e){if(angular.isArray(a)){var g=function(a){for(var b={},d=[],f=function(a){var d=r.defer(),f=function(c){b[a]=c,d.resolve([a,c])};return N(a,c,e).then(f,f),d.promise},g=0,h=a.length;h>g;g++)d.push(f(a[g]));return r.all(d).then(function(){return b})};return g(a)}var i=r.defer();a&&(a=B.apply(a));var j=function(){var a=b?M[b]:M[f];if(z=0,h&&!a){var c=x.get(s);if(a=M[c],d&&d.length){var e=A(d,c);z=0===e?1:0,A(d,b)<0&&d.push(b)}}return a}();return j?j.then(function(){Z(a,c,e).then(i.resolve,i.reject)},i.reject):Z(a,c,e).then(i.resolve,i.reject),i.promise},O=function(a){return n&&(a=[n,a].join(" ")),o&&(a=[a,o].join(" ")),a},P=function(a){f=a,i.$emit("$translateChangeSuccess",{language:a}),h&&x.set(N.storageKey(),f),J.setLocale(f),angular.forEach(L,function(a,b){L[b].setLocale(f)}),i.$emit("$translateChangeEnd",{language:a})},Q=function(a){if(!a)throw"No language key specified for loading.";var b=r.defer();i.$emit("$translateLoadingStart",{language:a}),K=!0;var d=p;"string"==typeof d&&(d=c.get(d));var e=angular.extend({},m,{key:a,$http:angular.extend({},{cache:d},m.$http)});return c.get(l)(e).then(function(c){var d={};i.$emit("$translateLoadingSuccess",{language:a}),angular.isArray(c)?angular.forEach(c,function(a){angular.extend(d,E(a))}):angular.extend(d,E(c)),K=!1,b.resolve({key:a,table:d}),i.$emit("$translateLoadingEnd",{language:a})},function(a){i.$emit("$translateLoadingError",{language:a}),b.reject(a),i.$emit("$translateLoadingEnd",{language:a})}),b.promise};if(h&&(x=c.get(h),!x.get||!x.set))throw new Error("Couldn't use storage '"+h+"', missing get() or set() method!");angular.isFunction(J.useSanitizeValueStrategy)&&J.useSanitizeValueStrategy(u),t.length&&angular.forEach(t,function(a){var d=c.get(a);d.setLocale(b||f),angular.isFunction(d.useSanitizeValueStrategy)&&d.useSanitizeValueStrategy(u),L[d.getInterpolationIdentifier()]=d});var R=function(a){var b=r.defer();return Object.prototype.hasOwnProperty.call(q,a)?b.resolve(q[a]):M[a]?M[a].then(function(a){D(a.key,a.table),b.resolve(a.table)},b.reject):b.reject(),b.promise},S=function(a,b,c,d){var e=r.defer();return R(a).then(function(g){Object.prototype.hasOwnProperty.call(g,b)?(d.setLocale(a),e.resolve(d.interpolate(g[b],c)),d.setLocale(f)):e.reject()},e.reject),e.promise},T=function(a,b,c,d){var e,g=q[a];return Object.prototype.hasOwnProperty.call(g,b)&&(d.setLocale(a),e=d.interpolate(g[b],c),d.setLocale(f)),e},U=function(a){if(j){var b=c.get(j)(a,f);return void 0!==b?b:a}return a},V=function(a,b,c,e){var f=r.defer();if(a0?I:z,a,b,c)},Y=function(a,b,c){return W(I>0?I:z,a,b,c)},Z=function(a,b,c){var e=r.defer(),g=f?q[f]:q,h=c?L[c]:J;if(g&&Object.prototype.hasOwnProperty.call(g,a)){var i=g[a];"@:"===i.substr(0,2)?N(i.substr(2),b,c).then(e.resolve,e.reject):e.resolve(h.interpolate(i,b))}else{var k;j&&!K&&(k=U(a)),f&&d&&d.length?X(a,b,h).then(function(a){e.resolve(a)},function(a){e.reject(O(a))}):j&&!K&&k?e.resolve(k):e.reject(O(a))}return e.promise},$=function(a,b,c){var e,g=f?q[f]:q,h=c?L[c]:J;if(g&&Object.prototype.hasOwnProperty.call(g,a)){var i=g[a];e="@:"===i.substr(0,2)?$(i.substr(2),b,c):h.interpolate(i,b)}else{var k;j&&!K&&(k=U(a)),f&&d&&d.length?(z=0,e=Y(a,b,h)):e=j&&!K&&k?k:O(a)}return e};if(N.preferredLanguage=function(a){return a&&F(a),b},N.cloakClassName=function(){return v},N.fallbackLanguage=function(a){if(void 0!==a&&null!==a){if(G(a),l&&d&&d.length)for(var b=0,c=d.length;c>b;b++)M[d[b]]||(M[d[b]]=Q(d[b]));N.use(N.use())}return e?d[0]:d},N.useFallbackLanguage=function(a){if(void 0!==a&&null!==a)if(a){var b=A(d,a);b>-1&&(I=b)}else I=0},N.proposedLanguage=function(){return g},N.storage=function(){return x},N.use=function(a){if(!a)return f;var b=r.defer();i.$emit("$translateChangeStart",{language:a});var c=C(a);return c&&(a=c),q[a]||!l||M[a]?(b.resolve(a),P(a)):(g=a,M[a]=Q(a).then(function(c){D(c.key,c.table),b.resolve(c.key),P(c.key),g===a&&(g=void 0)},function(a){g===a&&(g=void 0),i.$emit("$translateChangeError",{language:a}),b.reject(a),i.$emit("$translateChangeEnd",{language:a})})),b.promise},N.storageKey=function(){return H()},N.isPostCompilingEnabled=function(){return w},N.refresh=function(a){function b(){e.resolve(),i.$emit("$translateRefreshEnd",{language:a})}function c(){e.reject(),i.$emit("$translateRefreshEnd",{language:a})}if(!l)throw new Error("Couldn't refresh translation table, no loader registered!");var e=r.defer();if(i.$emit("$translateRefreshStart",{language:a}),a)q[a]?Q(a).then(function(c){D(c.key,c.table),a===f&&P(f),b()},c):c();else{var g=[],h={};if(d&&d.length)for(var j=0,k=d.length;k>j;j++)g.push(Q(d[j])),h[d[j]]=!0;f&&!h[f]&&g.push(Q(f)),r.all(g).then(function(a){angular.forEach(a,function(a){q[a.key]&&delete q[a.key],D(a.key,a.table)}),f&&P(f),b()})}return e.promise},N.instant=function(a,c,e){if(null===a||angular.isUndefined(a))return a;if(angular.isArray(a)){for(var g={},h=0,i=a.length;i>h;h++)g[a[h]]=N.instant(a[h],c,e);return g}if(angular.isString(a)&&a.length<1)return a;a&&(a=B.apply(a));var k,l=[];b&&l.push(b),f&&l.push(f),d&&d.length&&(l=l.concat(d));for(var m=0,n=l.length;n>m;m++){var o=l[m];if(q[o]&&"undefined"!=typeof q[o][a]&&(k=$(a,c,e)),"undefined"!=typeof k)break}return k||""===k||(k=J.interpolate(a,c),j&&!K&&(k=U(a))),k},N.versionInfo=function(){return y},N.loaderCache=function(){return p},l&&(angular.equals(q,{})&&N.use(N.use()),d&&d.length))for(var _=function(a){D(a.key,a.table),i.$emit("$translateChangeEnd",{language:a.key})},ab=0,bb=d.length;bb>ab;ab++)M[d[ab]]=Q(d[ab]).then(_);return N}]}]),angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",["$interpolate",function(a){var b,c={},d="default",e=null,f={escaped:function(a){var b={};for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=angular.element("
      ").text(a[c]).html());return b}},g=function(a){var b;return b=angular.isFunction(f[e])?f[e](a):a};return c.setLocale=function(a){b=a},c.getInterpolationIdentifier=function(){return d},c.useSanitizeValueStrategy=function(a){return e=a,this},c.interpolate=function(b,c){return e&&(c=g(c)),a(b)(c||{})},c}]),angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",["$translate","$q","$interpolate","$compile","$parse","$rootScope",function(a,b,c,d,e,f){return{restrict:"AE",scope:!0,compile:function(b,g){var h=g.translateValues?g.translateValues:void 0,i=g.translateInterpolation?g.translateInterpolation:void 0,j=b[0].outerHTML.match(/translate-value-+/i),k="^(.*)("+c.startSymbol()+".*"+c.endSymbol()+")(.*)";return function(b,l,m){if(b.interpolateParams={},b.preText="",b.postText="",m.$observe("translate",function(a){if(angular.equals(a,"")||!angular.isDefined(a)){var d=l.text().match(k);angular.isArray(d)?(b.preText=d[1],b.postText=d[3],b.translationId=c(d[2])(b.$parent)):b.translationId=l.text().replace(/^\s+|\s+$/g,"")}else b.translationId=a}),m.$observe("translateDefault",function(a){b.defaultText=a}),h&&m.$observe("translateValues",function(a){a&&b.$parent.$watch(function(){angular.extend(b.interpolateParams,e(a)(b.$parent))})}),j){var n=function(a){m.$observe(a,function(c){b.interpolateParams[angular.lowercase(a.substr(14,1))+a.substr(15)]=c})};for(var o in m)Object.prototype.hasOwnProperty.call(m,o)&&"translateValue"===o.substr(0,14)&&"translateValues"!==o&&n(o)}var p=function(b,c,e){e||"undefined"==typeof c.defaultText||(b=c.defaultText),l.html(c.preText+b+c.postText);var f=a.isPostCompilingEnabled(),h="undefined"!=typeof g.translateCompile,i=h&&"false"!==g.translateCompile;(f&&!h||i)&&d(l.contents())(c)},q=function(){return h||j?function(){var c=function(){b.translationId&&b.interpolateParams&&a(b.translationId,b.interpolateParams,i).then(function(a){p(a,b,!0)},function(a){p(a,b,!1)})};b.$watch("interpolateParams",c,!0),b.$watch("translationId",c)}:function(){var c=b.$watch("translationId",function(d){b.translationId&&d&&a(d,{},i).then(function(a){p(a,b,!0),c()},function(a){p(a,b,!1),c()})},!0)}}(),r=f.$on("$translateChangeSuccess",q);q(),b.$on("$destroy",r)}}}}]),angular.module("pascalprecht.translate").directive("translateCloak",["$rootScope","$translate",function(a,b){return{compile:function(c){var d=function(){c.addClass(b.cloakClassName())},e=function(){c.removeClass(b.cloakClassName())},f=a.$on("$translateChangeEnd",function(){e(),f(),f=null});return d(),function(a,c,f){f.translateCloak&&f.translateCloak.length&&f.$observe("translateCloak",function(a){b(a).then(e,d)})}}}}]),angular.module("pascalprecht.translate").filter("translate",["$parse","$translate",function(a,b){var c=function(c,d,e){return angular.isObject(d)||(d=a(d)(this)),b.instant(c,d,e)};return c.$stateful=!0,c}]); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/angular_1.2.13/angular-animate.min.js b/src/main/resources/static/editor-app/libs/angular_1.2.13/angular-animate.min.js new file mode 100644 index 00000000..45028654 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/angular_1.2.13/angular-animate.min.js @@ -0,0 +1,27 @@ +/* + AngularJS v1.2.13 + (c) 2010-2014 Google, Inc. http://angularjs.org + License: MIT +*/ +(function(z,f,T){'use strict';f.module("ngAnimate",["ng"]).factory("$$animateReflow",["$window","$timeout","$document",function(f,h,d){var n=f.requestAnimationFrame||f.webkitRequestAnimationFrame||function(d){return h(d,10,!1)},w=f.cancelAnimationFrame||f.webkitCancelAnimationFrame||function(d){return h.cancel(d)};return function(d){var f=n(function(){d()});return function(){w(f)}}}]).factory("$$asyncQueueBuffer",["$timeout",function(f){var h,d=[];return function(n){f.cancel(h);d.push(n);h=f(function(){for(var f= +0;f= +u&&a>=s&&e()}var h=d(a);b=a.data(E);if(-1!=h.className.indexOf(c)&&b){var l="";D(c.split(" "),function(b,a){l+=(0").append(b).html();try{return 3===b[0].nodeType?O(c):c.match(/^(<[^>]+>)/)[1].replace(/^<([\w\-]+)/, +function(a,b){return"<"+O(b)})}catch(d){return O(c)}}function Xb(b){try{return decodeURIComponent(b)}catch(a){}}function Yb(b){var a={},c,d;r((b||"").split("&"),function(b){b&&(c=b.split("="),d=Xb(c[0]),v(d)&&(b=v(c[1])?Xb(c[1]):!0,a[d]?H(a[d])?a[d].push(b):a[d]=[a[d],b]:a[d]=b))});return a}function Zb(b){var a=[];r(b,function(b,d){H(b)?r(b,function(b){a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))}):a.push(va(d,!0)+(!0===b?"":"="+va(b,!0)))});return a.length?a.join("&"):""}function xb(b){return va(b, +!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function va(b,a){return encodeURIComponent(b).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,a?"%20":"+")}function Uc(b,a){function c(a){a&&d.push(a)}var d=[b],e,f,g=["ng:app","ng-app","x-ng-app","data-ng-app"],h=/\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;r(g,function(a){g[a]=!0;c(T.getElementById(a));a=a.replace(":","\\:");b.querySelectorAll&&(r(b.querySelectorAll("."+a),c),r(b.querySelectorAll("."+ +a+"\\:"),c),r(b.querySelectorAll("["+a+"]"),c))});r(d,function(a){if(!e){var b=h.exec(" "+a.className+" ");b?(e=a,f=(b[2]||"").replace(/\s+/g,",")):r(a.attributes,function(b){!e&&g[b.name]&&(e=a,f=b.value)})}});e&&a(e,f?[f]:[])}function $b(b,a){var c=function(){b=z(b);if(b.injector()){var c=b[0]===T?"document":ga(b);throw Oa("btstrpd",c);}a=a||[];a.unshift(["$provide",function(a){a.value("$rootElement",b)}]);a.unshift("ng");c=ac(a);c.invoke(["$rootScope","$rootElement","$compile","$injector","$animate", +function(a,b,c,d,e){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},d=/^NG_DEFER_BOOTSTRAP!/;if(C&&!d.test(C.name))return c();C.name=C.name.replace(d,"");Ba.resumeBootstrap=function(b){r(b,function(b){a.push(b)});c()}}function db(b,a){a=a||"_";return b.replace(Vc,function(b,d){return(d?a:"")+b.toLowerCase()})}function yb(b,a,c){if(!b)throw Oa("areq",a||"?",c||"required");return b}function Qa(b,a,c){c&&H(b)&&(b=b[b.length-1]);yb(N(b),a,"not a function, got "+(b&&"object"==typeof b? +b.constructor.name||"Object":typeof b));return b}function wa(b,a){if("hasOwnProperty"===b)throw Oa("badname",a);}function bc(b,a,c){if(!a)return b;a=a.split(".");for(var d,e=b,f=a.length,g=0;g 
      "+b;a.removeChild(a.firstChild);Cb(this,a.childNodes);z(T.createDocumentFragment()).append(this)}else Cb(this, +b)}function Db(b){return b.cloneNode(!0)}function Da(b){cc(b);var a=0;for(b=b.childNodes||[];a=P?(c.preventDefault=null,c.stopPropagation=null,c.isDefaultPrevented=null):(delete c.preventDefault,delete c.stopPropagation,delete c.isDefaultPrevented)};c.elem=b;return c}function Ea(b){var a=typeof b,c;"object"==a&&null!==b?"function"==typeof(c=b.$$hashKey)?c=b.$$hashKey():c=== +s&&(c=b.$$hashKey=$a()):c=b;return a+":"+c}function Ta(b){r(b,this.put,this)}function jc(b){var a,c;"function"==typeof b?(a=b.$inject)||(a=[],b.length&&(c=b.toString().replace(ad,""),c=c.match(bd),r(c[1].split(cd),function(b){b.replace(dd,function(b,c,d){a.push(d)})})),b.$inject=a):H(b)?(c=b.length-1,Qa(b[c],"fn"),a=b.slice(0,c)):Qa(b,"fn",!0);return a}function ac(b){function a(a){return function(b,c){if(Z(b))r(b,Rb(a));else return a(b,c)}}function c(a,b){wa(a,"service");if(N(b)||H(b))b=m.instantiate(b); +if(!b.$get)throw Ua("pget",a);return l[a+h]=b}function d(a,b){return c(a,{$get:b})}function e(a){var b=[],c,d,f,h;r(a,function(a){if(!k.get(a)){k.put(a,!0);try{if(D(a))for(c=Va(a),b=b.concat(e(c.requires)).concat(c._runBlocks),d=c._invokeQueue,f=0,h=d.length;f 4096 bytes)!"));else{if(n.cookie!==ba)for(ba=n.cookie,d=ba.split("; "),L={},f=0;fk&&this.remove(p.key),b},get:function(a){var b=l[a];if(b)return e(b),n[a]},remove:function(a){var b=l[a];b&&(b==m&&(m=b.p),b==p&&(p=b.n),f(b.n,b.p),delete l[a],delete n[a],g--)},removeAll:function(){n={};g=0;l={};m=p=null},destroy:function(){l=h=n=null;delete a[b]},info:function(){return t({},h,{size:g})}}}var a={};b.info=function(){var b={};r(a,function(a,e){b[e]=a.info()});return b};b.get=function(b){return a[b]}; +return b}}function id(){this.$get=["$cacheFactory",function(b){return b("templates")}]}function kc(b,a){var c={},d="Directive",e=/^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,f=/(([\d\w\-_]+)(?:\:([^;]+))?;?)/,g=/^<\s*(tr|th|td|tbody)(\s+[^>]*)?>/i,h=/^(on[a-z]+|formaction)$/;this.directive=function k(a,e){wa(a,"directive");D(a)?(yb(e,"directiveFactory"),c.hasOwnProperty(a)||(c[a]=[],b.factory(a+d,["$injector","$exceptionHandler",function(b,d){var e=[];r(c[a],function(c,f){try{var h=b.invoke(c);N(h)?h= +{compile:aa(h)}:!h.compile&&h.link&&(h.compile=aa(h.link));h.priority=h.priority||0;h.index=f;h.name=h.name||a;h.require=h.require||h.controller&&h.name;h.restrict=h.restrict||"A";e.push(h)}catch(g){d(g)}});return e}])),c[a].push(e)):r(a,Rb(k));return this};this.aHrefSanitizationWhitelist=function(b){return v(b)?(a.aHrefSanitizationWhitelist(b),this):a.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(b){return v(b)?(a.imgSrcSanitizationWhitelist(b),this):a.imgSrcSanitizationWhitelist()}; +this.$get=["$injector","$interpolate","$exceptionHandler","$http","$templateCache","$parse","$controller","$rootScope","$document","$sce","$animate","$$sanitizeUri",function(a,b,m,p,q,A,B,I,u,G,W,y){function Y(a,b,c,d,e){a instanceof z||(a=z(a));r(a,function(b,c){3==b.nodeType&&b.nodeValue.match(/\S+/)&&(a[c]=z(b).wrap("").parent()[0])});var f=L(a,b,a,c,d,e);S(a,"ng-scope");return function(b,c,d){yb(b,"scope");var e=c?Fa.clone.call(a):a;r(d,function(a,b){e.data("$"+b+"Controller",a)}); +d=0;for(var h=e.length;darguments.length&&(b=a,a=s);Ha&&(c=lb);return q(a,b,c)}var K,y,u,Y,M,U,lb={},v;K=c===f?d:Ub(d,new Gb(z(f),d.$attr));y=K.$$element;if(L){var t=/^\s*([@=&])(\??)\s*(\w*)\s*$/;h=z(f);U=e.$new(!0);ba&&ba===L.$$originalDirective?h.data("$isolateScope",U):h.data("$isolateScopeNoTemplate",U);S(h,"ng-isolate-scope");r(L.scope,function(a,c){var d=a.match(t)||[],f=d[3]||c,h="?"==d[2],d=d[1],g,k,q,m;U.$$isolateBindings[c]=d+f;switch(d){case "@":K.$observe(f,function(a){U[c]= +a});K.$$observers[f].$$scope=e;K[f]&&(U[c]=b(K[f])(e));break;case "=":if(h&&!K[f])break;k=A(K[f]);m=k.literal?ta:function(a,b){return a===b};q=k.assign||function(){g=U[c]=k(e);throw ia("nonassign",K[f],L.name);};g=U[c]=k(e);U.$watch(function(){var a=k(e);m(a,U[c])||(m(a,g)?q(e,a=U[c]):U[c]=a);return g=a},null,k.literal);break;case "&":k=A(K[f]);U[c]=function(a){return k(e,a)};break;default:throw ia("iscp",L.name,c,a);}})}v=q&&p;W&&r(W,function(a){var b={$scope:a===L||a.$$isolateScope?U:e,$element:y, +$attrs:K,$transclude:v},c;M=a.controller;"@"==M&&(M=K[a.name]);c=B(M,b);lb[a.name]=c;Ha||y.data("$"+a.name+"Controller",c);a.controllerAs&&(b.$scope[a.controllerAs]=c)});h=0;for(u=g.length;hF.priority)break;if(t=F.scope)u=u||F,F.templateUrl||(R("new/isolated scope",L,F,J),Z(t)&&(L=F));ha=F.name;!F.templateUrl&&F.controller&&(t=F.controller,W=W||{},R("'"+ha+"' controller",W[ha],F,J),W[ha]=F);if(t=F.transclude)Wa=!0,F.$$tlb|| +(R("transclusion",v,F,J),v=F),"element"==t?(Ha=!0,y=F.priority,t=M(c,Q,V),J=d.$$element=z(T.createComment(" "+ha+": "+d[ha]+" ")),c=J[0],mb(f,z(ua.call(t,0)),c),E=Y(t,e,y,h&&h.name,{nonTlbTranscludeDirective:v})):(t=z(Db(c)).contents(),J.empty(),E=Y(t,e));if(F.template)if(R("template",ba,F,J),ba=F,t=N(F.template)?F.template(J,d):F.template,t=X(t),F.replace){h=F;t=x(t);c=t[0];if(1!=t.length||1!==c.nodeType)throw ia("tplrt",ha,"");mb(f,J,c);P={$attr:{}};t=U(c,[],P);var $=a.splice(C+1,a.length-(C+1)); +L&&kb(t);a=a.concat(t).concat($);w(d,P);P=a.length}else J.html(t);if(F.templateUrl)R("template",ba,F,J),ba=F,F.replace&&(h=F),I=O(a.splice(C,a.length-C),J,d,f,E,g,k,{controllerDirectives:W,newIsolateScopeDirective:L,templateDirective:ba,nonTlbTranscludeDirective:v}),P=a.length;else if(F.compile)try{pa=F.compile(J,d,E),N(pa)?p(null,pa,Q,V):pa&&p(pa.pre,pa.post,Q,V)}catch(aa){m(aa,ga(J))}F.terminal&&(I.terminal=!0,y=Math.max(y,F.priority))}I.scope=u&&!0===u.scope;I.transclude=Wa&&E;q.hasElementTranscludeDirective= +Ha;return I}function kb(a){for(var b=0,c=a.length;bp.priority)&&-1!=p.restrict.indexOf(f)&&(q&&(p=Tb(p,{$$start:q,$$end:l})),b.push(p),g=p)}catch(B){m(B)}}return g}function w(a,b){var c=b.$attr,d=a.$attr,e=a.$$element;r(a,function(d,e){"$"!=e.charAt(0)&&(b[e]&&(d+=("style"===e?";":" ")+b[e]),a.$set(e,d,!0,c[e]))}); +r(b,function(b,f){"class"==f?(S(e,b),a["class"]=(a["class"]?a["class"]+" ":"")+b):"style"==f?(e.attr("style",e.attr("style")+";"+b),a.style=(a.style?a.style+";":"")+b):"$"==f.charAt(0)||a.hasOwnProperty(f)||(a[f]=b,d[f]=c[f])})}function x(a){var b;a=da(a);if(b=g.exec(a)){b=b[1].toLowerCase();a=z(""+a+"
      ");var c=a.children("tbody"),d=/(td|th)/.test(b)&&a.find("tr");c.length&&"tbody"!==b&&(a=c);d&&d.length&&(a=d);return a.contents()}return z("
      "+a+"
      ").contents()}function O(a, +b,c,d,e,f,h,g){var k=[],l,m,A=b[0],B=a.shift(),y=t({},B,{templateUrl:null,transclude:null,replace:null,$$originalDirective:B}),I=N(B.templateUrl)?B.templateUrl(b,c):B.templateUrl;b.empty();p.get(G.getTrustedResourceUrl(I),{cache:q}).success(function(q){var p,G;q=X(q);if(B.replace){q=x(q);p=q[0];if(1!=q.length||1!==p.nodeType)throw ia("tplrt",B.name,I);q={$attr:{}};mb(d,b,p);var u=U(p,[],q);Z(B.scope)&&kb(u);a=u.concat(a);w(c,q)}else p=A,b.html(q);a.unshift(y);l=Wa(a,p,c,e,b,B,f,h,g);r(d,function(a, +c){a==p&&(d[c]=b[0])});for(m=L(b[0].childNodes,e);k.length;){q=k.shift();G=k.shift();var W=k.shift(),Y=k.shift(),u=b[0];if(G!==A){var M=G.className;g.hasElementTranscludeDirective&&B.replace||(u=Db(p));mb(W,z(G),u);S(z(u),M)}G=l.transclude?ba(q,l.transclude):Y;l(m,q,u,d,G)}k=null}).error(function(a,b,c,d){throw ia("tpload",d.url);});return function(a,b,c,d,e){k?(k.push(b),k.push(c),k.push(d),k.push(e)):l(m,b,c,d,e)}}function E(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name< +b.name?-1:1:a.index-b.index}function R(a,b,c,d){if(b)throw ia("multidir",b.name,c.name,a,ga(d));}function C(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:aa(function(a,b){var c=b.parent(),e=c.data("$binding")||[];e.push(d);S(c.data("$binding",e),"ng-binding");a.$watch(d,function(a){b[0].nodeValue=a})})})}function Ha(a,b){if("srcdoc"==b)return G.HTML;var c=Ga(a);if("xlinkHref"==b||"FORM"==c&&"action"==b||"IMG"!=c&&("src"==b||"ngSrc"==b))return G.RESOURCE_URL}function ha(a,c,d,e){var f=b(d,!0);if(f){if("multiple"=== +e&&"SELECT"===Ga(a))throw ia("selmulti",ga(a));c.push({priority:100,compile:function(){return{pre:function(c,d,g){d=g.$$observers||(g.$$observers={});if(h.test(e))throw ia("nodomevents");if(f=b(g[e],!0,Ha(a,e)))g[e]=f(c),(d[e]||(d[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||c).$watch(f,function(a,b){"class"===e&&a!=b?g.$updateClass(a,b):g.$set(e,a)})}}}})}}function mb(a,b,c){var d=b[0],e=b.length,f=d.parentNode,h,g;if(a)for(h=0,g=a.length;ha.status?b:m.reject(b)}var d={transformRequest:e.transformRequest,transformResponse:e.transformResponse},f=function(a){function b(a){var c;r(a,function(b,d){N(b)&&(c=b(),null!=c?a[d]=c:delete a[d])})}var c=e.headers,d=t({},a.headers), +f,h,c=t({},c.common,c[O(a.method)]);b(c);b(d);a:for(f in c){a=O(f);for(h in d)if(O(h)===a)continue a;d[f]=c[f]}return d}(a);t(d,a);d.headers=f;d.method=Ia(d.method);(a=Hb(d.url)?b.cookies()[d.xsrfCookieName||e.xsrfCookieName]:s)&&(f[d.xsrfHeaderName||e.xsrfHeaderName]=a);var h=[function(a){f=a.headers;var b=pc(a.data,oc(f),a.transformRequest);x(a.data)&&r(f,function(a,b){"content-type"===O(b)&&delete f[b]});x(a.withCredentials)&&!x(e.withCredentials)&&(a.withCredentials=e.withCredentials);return A(a, +b,f).then(c,c)},s],g=m.when(d);for(r(u,function(a){(a.request||a.requestError)&&h.unshift(a.request,a.requestError);(a.response||a.responseError)&&h.push(a.response,a.responseError)});h.length;){a=h.shift();var k=h.shift(),g=g.then(a,k)}g.success=function(a){g.then(function(b){a(b.data,b.status,b.headers,d)});return g};g.error=function(a){g.then(null,function(b){a(b.data,b.status,b.headers,d)});return g};return g}function A(b,c,f){function g(a,b,c){u&&(200<=a&&300>a?u.put(s,[a,b,nc(c)]):u.remove(s)); +k(b,a,c);d.$$phase||d.$apply()}function k(a,c,d){c=Math.max(c,0);(200<=c&&300>c?p.resolve:p.reject)({data:a,status:c,headers:oc(d),config:b})}function n(){var a=bb(q.pendingRequests,b);-1!==a&&q.pendingRequests.splice(a,1)}var p=m.defer(),A=p.promise,u,r,s=B(b.url,b.params);q.pendingRequests.push(b);A.then(n,n);(b.cache||e.cache)&&(!1!==b.cache&&"GET"==b.method)&&(u=Z(b.cache)?b.cache:Z(e.cache)?e.cache:I);if(u)if(r=u.get(s),v(r)){if(r.then)return r.then(n,n),r;H(r)?k(r[1],r[0],ca(r[2])):k(r,200, +{})}else u.put(s,A);x(r)&&a(b.method,s,c,g,f,b.timeout,b.withCredentials,b.responseType);return A}function B(a,b){if(!b)return a;var c=[];Qc(b,function(a,b){null===a||x(a)||(H(a)||(a=[a]),r(a,function(a){Z(a)&&(a=oa(a));c.push(va(b)+"="+va(a))}))});return a+(-1==a.indexOf("?")?"?":"&")+c.join("&")}var I=c("$http"),u=[];r(f,function(a){u.unshift(D(a)?p.get(a):p.invoke(a))});r(g,function(a,b){var c=D(a)?p.get(a):p.invoke(a);u.splice(b,0,{response:function(a){return c(m.when(a))},responseError:function(a){return c(m.reject(a))}})}); +q.pendingRequests=[];(function(a){r(arguments,function(a){q[a]=function(b,c){return q(t(c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){r(arguments,function(a){q[a]=function(b,c,d){return q(t(d||{},{method:a,url:b,data:c}))}})})("post","put");q.defaults=e;return q}]}function od(b){if(8>=P&&(!b.match(/^(get|post|head|put|delete|options)$/i)||!C.XMLHttpRequest))return new C.ActiveXObject("Microsoft.XMLHTTP");if(C.XMLHttpRequest)return new C.XMLHttpRequest;throw E("$httpBackend")("noxhr"); +}function pd(){this.$get=["$browser","$window","$document",function(b,a,c){return qd(b,od,b.defer,a.angular.callbacks,c[0])}]}function qd(b,a,c,d,e){function f(a,b){var c=e.createElement("script"),d=function(){c.onreadystatechange=c.onload=c.onerror=null;e.body.removeChild(c);b&&b()};c.type="text/javascript";c.src=a;P&&8>=P?c.onreadystatechange=function(){/loaded|complete/.test(c.readyState)&&d()}:c.onload=c.onerror=function(){d()};e.body.appendChild(c);return d}var g=-1;return function(e,n,k,l,m, +p,q,A){function B(){u=g;W&&W();y&&y.abort()}function I(a,d,e,f){S&&c.cancel(S);W=y=null;d=0===d?e?200:404:d;a(1223==d?204:d,e,f);b.$$completeOutstandingRequest(w)}var u;b.$$incOutstandingRequestCount();n=n||b.url();if("jsonp"==O(e)){var G="_"+(d.counter++).toString(36);d[G]=function(a){d[G].data=a};var W=f(n.replace("JSON_CALLBACK","angular.callbacks."+G),function(){d[G].data?I(l,200,d[G].data):I(l,u||-2);d[G]=Ba.noop})}else{var y=a(e);y.open(e,n,!0);r(m,function(a,b){v(a)&&y.setRequestHeader(b,a)}); +y.onreadystatechange=function(){if(y&&4==y.readyState){var a=null,b=null;u!==g&&(a=y.getAllResponseHeaders(),b="response"in y?y.response:y.responseText);I(l,u||y.status,b,a)}};q&&(y.withCredentials=!0);if(A)try{y.responseType=A}catch(Y){if("json"!==A)throw Y;}y.send(k||null)}if(0=h&&(m.resolve(q),l(p.$$intervalId),delete e[p.$$intervalId]); +A||b.$apply()},g);e[p.$$intervalId]=m;return p}var e={};d.cancel=function(a){return a&&a.$$intervalId in e?(e[a.$$intervalId].reject("canceled"),clearInterval(a.$$intervalId),delete e[a.$$intervalId],!0):!1};return d}]}function td(){this.$get=function(){return{id:"en-us",NUMBER_FORMATS:{DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{minInt:1,minFrac:0,maxFrac:3,posPre:"",posSuf:"",negPre:"-",negSuf:"",gSize:3,lgSize:3},{minInt:1,minFrac:2,maxFrac:2,posPre:"\u00a4",posSuf:"",negPre:"(\u00a4",negSuf:")", +gSize:3,lgSize:3}],CURRENCY_SYM:"$"},DATETIME_FORMATS:{MONTH:"January February March April May June July August September October November December".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),AMPMS:["AM","PM"],medium:"MMM d, y h:mm:ss a","short":"M/d/yy h:mm a",fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",mediumDate:"MMM d, y",shortDate:"M/d/yy", +mediumTime:"h:mm:ss a",shortTime:"h:mm a"},pluralCat:function(b){return 1===b?"one":"other"}}}}function rc(b){b=b.split("/");for(var a=b.length;a--;)b[a]=xb(b[a]);return b.join("/")}function sc(b,a,c){b=xa(b,c);a.$$protocol=b.protocol;a.$$host=b.hostname;a.$$port=Q(b.port)||ud[b.protocol]||null}function tc(b,a,c){var d="/"!==b.charAt(0);d&&(b="/"+b);b=xa(b,c);a.$$path=decodeURIComponent(d&&"/"===b.pathname.charAt(0)?b.pathname.substring(1):b.pathname);a.$$search=Yb(b.search);a.$$hash=decodeURIComponent(b.hash); +a.$$path&&"/"!=a.$$path.charAt(0)&&(a.$$path="/"+a.$$path)}function ma(b,a){if(0===a.indexOf(b))return a.substr(b.length)}function Xa(b){var a=b.indexOf("#");return-1==a?b:b.substr(0,a)}function Ib(b){return b.substr(0,Xa(b).lastIndexOf("/")+1)}function uc(b,a){this.$$html5=!0;a=a||"";var c=Ib(b);sc(b,this,b);this.$$parse=function(a){var e=ma(c,a);if(!D(e))throw Jb("ipthprfx",a,c);tc(e,this,b);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=Zb(this.$$search),b=this.$$hash? +"#"+xb(this.$$hash):"";this.$$url=rc(this.$$path)+(a?"?"+a:"")+b;this.$$absUrl=c+this.$$url.substr(1)};this.$$rewrite=function(d){var e;if((e=ma(b,d))!==s)return d=e,(e=ma(a,e))!==s?c+(ma("/",e)||e):b+d;if((e=ma(c,d))!==s)return c+e;if(c==d+"/")return c}}function Kb(b,a){var c=Ib(b);sc(b,this,b);this.$$parse=function(d){var e=ma(b,d)||ma(c,d),e="#"==e.charAt(0)?ma(a,e):this.$$html5?e:"";if(!D(e))throw Jb("ihshprfx",d,a);tc(e,this,b);d=this.$$path;var f=/^\/?.*?:(\/.*)/;0===e.indexOf(b)&&(e=e.replace(b, +""));f.exec(e)||(d=(e=f.exec(d))?e[1]:d);this.$$path=d;this.$$compose()};this.$$compose=function(){var c=Zb(this.$$search),e=this.$$hash?"#"+xb(this.$$hash):"";this.$$url=rc(this.$$path)+(c?"?"+c:"")+e;this.$$absUrl=b+(this.$$url?a+this.$$url:"")};this.$$rewrite=function(a){if(Xa(b)==Xa(a))return a}}function vc(b,a){this.$$html5=!0;Kb.apply(this,arguments);var c=Ib(b);this.$$rewrite=function(d){var e;if(b==Xa(d))return d;if(e=ma(c,d))return b+a+e;if(c===d+"/")return c}}function nb(b){return function(){return this[b]}} +function wc(b,a){return function(c){if(x(c))return this[b];this[b]=a(c);this.$$compose();return this}}function vd(){var b="",a=!1;this.hashPrefix=function(a){return v(a)?(b=a,this):b};this.html5Mode=function(b){return v(b)?(a=b,this):a};this.$get=["$rootScope","$browser","$sniffer","$rootElement",function(c,d,e,f){function g(a){c.$broadcast("$locationChangeSuccess",h.absUrl(),a)}var h,n=d.baseHref(),k=d.url();a?(n=k.substring(0,k.indexOf("/",k.indexOf("//")+2))+(n||"/"),e=e.history?uc:vc):(n=Xa(k), +e=Kb);h=new e(n,"#"+b);h.$$parse(h.$$rewrite(k));f.on("click",function(a){if(!a.ctrlKey&&!a.metaKey&&2!=a.which){for(var b=z(a.target);"a"!==O(b[0].nodeName);)if(b[0]===f[0]||!(b=b.parent())[0])return;var e=b.prop("href");Z(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=xa(e.animVal).href);var g=h.$$rewrite(e);e&&(!b.attr("target")&&g&&!a.isDefaultPrevented())&&(a.preventDefault(),g!=d.url()&&(h.$$parse(g),c.$apply(),C.angular["ff-684208-preventDefault"]=!0))}});h.absUrl()!=k&&d.url(h.absUrl(), +!0);d.onUrlChange(function(a){h.absUrl()!=a&&(c.$evalAsync(function(){var b=h.absUrl();h.$$parse(a);c.$broadcast("$locationChangeStart",a,b).defaultPrevented?(h.$$parse(b),d.url(b)):g(b)}),c.$$phase||c.$digest())});var l=0;c.$watch(function(){var a=d.url(),b=h.$$replace;l&&a==h.absUrl()||(l++,c.$evalAsync(function(){c.$broadcast("$locationChangeStart",h.absUrl(),a).defaultPrevented?h.$$parse(a):(d.url(h.absUrl(),b),g(a))}));h.$$replace=!1;return l});return h}]}function wd(){var b=!0,a=this;this.debugEnabled= +function(a){return v(a)?(b=a,this):b};this.$get=["$window",function(c){function d(a){a instanceof Error&&(a.stack?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=c.console||{},e=b[a]||b.log||w;a=!1;try{a=!!e.apply}catch(n){}return a?function(){var a=[];r(arguments,function(b){a.push(d(b))});return e.apply(b,a)}:function(a,b){e(a,null==b?"":b)}}return{log:e("log"),info:e("info"), +warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){b&&c.apply(a,arguments)}}()}}]}function ea(b,a){if("constructor"===b)throw ya("isecfld",a);return b}function Ya(b,a){if(b){if(b.constructor===b)throw ya("isecfn",a);if(b.document&&b.location&&b.alert&&b.setInterval)throw ya("isecwindow",a);if(b.children&&(b.nodeName||b.on&&b.find))throw ya("isecdom",a);}return b}function ob(b,a,c,d,e){e=e||{};a=a.split(".");for(var f,g=0;1e?xc(d[0],d[1],d[2],d[3],d[4],c,a):function(b,f){var h=0,g;do g=xc(d[h++],d[h++],d[h++],d[h++],d[h++],c,a)(b,f),f=s,b=g;while(ha)for(b in h++,d)d.hasOwnProperty(b)&&!e.hasOwnProperty(b)&&(l--,delete d[b])}else d!== +e&&(d=e,h++);return h},function(){b(e,d,c)})},$digest:function(){var d,f,h,g,k=this.$$asyncQueue,l=this.$$postDigestQueue,r,y,s=b,S,L=[],v,t,M;n("$digest");c=null;do{y=!1;for(S=this;k.length;){try{M=k.shift(),M.scope.$eval(M.expression)}catch(z){p.$$phase=null,e(z)}c=null}a:do{if(g=S.$$watchers)for(r=g.length;r--;)try{if(d=g[r])if((f=d.get(S))!==(h=d.last)&&!(d.eq?ta(f,h):"number"==typeof f&&"number"==typeof h&&isNaN(f)&&isNaN(h)))y=!0,c=d,d.last=d.eq?ca(f):f,d.fn(f,h===m?f:h,S),5>s&&(v=4-s,L[v]|| +(L[v]=[]),t=N(d.exp)?"fn: "+(d.exp.name||d.exp.toString()):d.exp,t+="; newVal: "+oa(f)+"; oldVal: "+oa(h),L[v].push(t));else if(d===c){y=!1;break a}}catch(D){p.$$phase=null,e(D)}if(!(g=S.$$childHead||S!==this&&S.$$nextSibling))for(;S!==this&&!(g=S.$$nextSibling);)S=S.$parent}while(S=g);if((y||k.length)&&!s--)throw p.$$phase=null,a("infdig",b,oa(L));}while(y||k.length);for(p.$$phase=null;l.length;)try{l.shift()()}catch(w){e(w)}},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy"); +this.$$destroyed=!0;this!==p&&(r(this.$$listenerCount,cb(null,l,this)),a.$$childHead==this&&(a.$$childHead=this.$$nextSibling),a.$$childTail==this&&(a.$$childTail=this.$$prevSibling),this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling),this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling),this.$parent=this.$$nextSibling=this.$$prevSibling=this.$$childHead=this.$$childTail=null)}},$eval:function(a,b){return f(a)(this,b)},$evalAsync:function(a){p.$$phase||p.$$asyncQueue.length|| +g.defer(function(){p.$$asyncQueue.length&&p.$digest()});this.$$asyncQueue.push({scope:this,expression:a})},$$postDigest:function(a){this.$$postDigestQueue.push(a)},$apply:function(a){try{return n("$apply"),this.$eval(a)}catch(b){e(b)}finally{p.$$phase=null;try{p.$digest()}catch(c){throw e(c),c;}}},$on:function(a,b){var c=this.$$listeners[a];c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){c[bb(c, +b)]=null;l(e,1,a)}},$emit:function(a,b){var c=[],d,f=this,h=!1,g={name:a,targetScope:f,stopPropagation:function(){h=!0},preventDefault:function(){g.defaultPrevented=!0},defaultPrevented:!1},k=[g].concat(ua.call(arguments,1)),n,l;do{d=f.$$listeners[a]||c;g.currentScope=f;n=0;for(l=d.length;nc.msieDocumentMode)throw ra("iequirks");var e=ca(fa);e.isEnabled=function(){return b};e.trustAs=d.trustAs;e.getTrusted=d.getTrusted;e.valueOf=d.valueOf;b||(e.trustAs=e.getTrusted=function(a,b){return b},e.valueOf=Aa);e.parseAs=function(b,c){var d=a(c);return d.literal&&d.constant?d:function(a,c){return e.getTrusted(b,d(a,c))}};var f=e.parseAs, +g=e.getTrusted,h=e.trustAs;r(fa,function(a,b){var c=O(b);e[Ra("parse_as_"+c)]=function(b){return f(a,b)};e[Ra("get_trusted_"+c)]=function(b){return g(a,b)};e[Ra("trust_as_"+c)]=function(b){return h(a,b)}});return e}]}function Hd(){this.$get=["$window","$document",function(b,a){var c={},d=Q((/android (\d+)/.exec(O((b.navigator||{}).userAgent))||[])[1]),e=/Boxee/i.test((b.navigator||{}).userAgent),f=a[0]||{},g=f.documentMode,h,n=/^(Moz|webkit|O|ms)(?=[A-Z])/,k=f.body&&f.body.style,l=!1,m=!1;if(k){for(var p in k)if(l= +n.exec(p)){h=l[0];h=h.substr(0,1).toUpperCase()+h.substr(1);break}h||(h="WebkitOpacity"in k&&"webkit");l=!!("transition"in k||h+"Transition"in k);m=!!("animation"in k||h+"Animation"in k);!d||l&&m||(l=D(f.body.style.webkitTransition),m=D(f.body.style.webkitAnimation))}return{history:!(!b.history||!b.history.pushState||4>d||e),hashchange:"onhashchange"in b&&(!g||7b;b=Math.abs(b);var g=b+"",h="",n=[],k=!1;if(-1!==g.indexOf("e")){var l=g.match(/([\d\.]+)e(-?)(\d+)/);l&&"-"==l[2]&&l[3]>e+1?g="0":(h=g,k=!0)}if(k)0b)&&(h=b.toFixed(e));else{g=(g.split(Ic)[1]||"").length; +x(e)&&(e=Math.min(Math.max(a.minFrac,g),a.maxFrac));g=Math.pow(10,e);b=Math.round(b*g)/g;b=(""+b).split(Ic);g=b[0];b=b[1]||"";var l=0,m=a.lgSize,p=a.gSize;if(g.length>=m+p)for(l=g.length-m,k=0;kb&&(d="-",b=-b); +for(b=""+b;b.length-c)e+=c;0===e&&-12==c&&(e=12);return Nb(e,a,d)}}function pb(b,a){return function(c,d){var e=c["get"+b](),f=Ia(a?"SHORT"+b:b);return d[f][e]}}function Ec(b){function a(a){var b;if(b=a.match(c)){a=new Date(0);var f=0,g=0,h=b[8]?a.setUTCFullYear:a.setFullYear,n=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Q(b[9]+b[10]),g=Q(b[9]+b[11]));h.call(a,Q(b[1]),Q(b[2])-1,Q(b[3])); +f=Q(b[4]||0)-f;g=Q(b[5]||0)-g;h=Q(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));n.call(a,f,g,h,b)}return a}var c=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;return function(c,e){var f="",g=[],h,n;e=e||"mediumDate";e=b.DATETIME_FORMATS[e]||e;D(c)&&(c=Qd.test(c)?Q(c):a(c));wb(c)&&(c=new Date(c));if(!La(c))return c;for(;e;)(n=Rd.exec(e))?(g=g.concat(ua.call(n,1)),e=g.pop()):(g.push(e),e=null);r(g,function(a){h=Sd[a];f+=h?h(c,b.DATETIME_FORMATS): +a.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return f}}function Ld(){return function(b){return oa(b,!0)}}function Md(){return function(b,a){if(!H(b)&&!D(b))return b;a=Q(a);if(D(b))return a?0<=a?b.slice(0,a):b.slice(a,b.length):"";var c=[],d,e;a>b.length?a=b.length:a<-b.length&&(a=-b.length);0a||37<=a&&40>=a)||k()});if(e.hasEvent("paste"))a.on("paste cut",k)}a.on("change",h);d.$render=function(){a.val(d.$isEmpty(d.$viewValue)?"":d.$viewValue)};var l=c.ngPattern;l&&((e=l.match(/^\/(.*)\/([gim]*)$/))?(l=RegExp(e[1],e[2]),e=function(a){return na(d,"pattern",d.$isEmpty(a)||l.test(a),a)}):e=function(c){var e=b.$eval(l);if(!e||!e.test)throw E("ngPattern")("noregexp",l,e,ga(a));return na(d,"pattern",d.$isEmpty(c)||e.test(c),c)},d.$formatters.push(e),d.$parsers.push(e));if(c.ngMinlength){var m= +Q(c.ngMinlength);e=function(a){return na(d,"minlength",d.$isEmpty(a)||a.length>=m,a)};d.$parsers.push(e);d.$formatters.push(e)}if(c.ngMaxlength){var p=Q(c.ngMaxlength);e=function(a){return na(d,"maxlength",d.$isEmpty(a)||a.length<=p,a)};d.$parsers.push(e);d.$formatters.push(e)}}function Ob(b,a){b="ngClass"+b;return function(){return{restrict:"AC",link:function(c,d,e){function f(b){if(!0===a||c.$index%2===a){var d=g(b||"");h?ta(b,h)||e.$updateClass(d,g(h)):e.$addClass(d)}h=ca(b)}function g(a){if(H(a))return a.join(" "); +if(Z(a)){var b=[];r(a,function(a,c){a&&b.push(c)});return b.join(" ")}return a}var h;c.$watch(e[b],f,!0);e.$observe("class",function(a){f(c.$eval(e[b]))});"ngClass"!==b&&c.$watch("$index",function(d,f){var h=d&1;if(h!==f&1){var m=g(c.$eval(e[b]));h===a?e.$addClass(m):e.$removeClass(m)}})}}}}var O=function(b){return D(b)?b.toLowerCase():b},Pd=Object.prototype.hasOwnProperty,Ia=function(b){return D(b)?b.toUpperCase():b},P,z,Ca,ua=[].slice,Td=[].push,Ma=Object.prototype.toString,Oa=E("ng"),Ba=C.angular|| +(C.angular={}),Va,Ga,ja=["0","0","0"];P=Q((/msie (\d+)/.exec(O(navigator.userAgent))||[])[1]);isNaN(P)&&(P=Q((/trident\/.*; rv:(\d+)/.exec(O(navigator.userAgent))||[])[1]));w.$inject=[];Aa.$inject=[];var da=function(){return String.prototype.trim?function(b){return D(b)?b.trim():b}:function(b){return D(b)?b.replace(/^\s\s*/,"").replace(/\s\s*$/,""):b}}();Ga=9>P?function(b){b=b.nodeName?b:b[0];return b.scopeName&&"HTML"!=b.scopeName?Ia(b.scopeName+":"+b.nodeName):b.nodeName}:function(b){return b.nodeName? +b.nodeName:b[0].nodeName};var Vc=/[A-Z]/g,Ud={full:"1.2.13",major:1,minor:2,dot:13,codeName:"romantic-transclusion"},Sa=R.cache={},eb=R.expando="ng-"+(new Date).getTime(),Zc=1,Kc=C.document.addEventListener?function(b,a,c){b.addEventListener(a,c,!1)}:function(b,a,c){b.attachEvent("on"+a,c)},Eb=C.document.removeEventListener?function(b,a,c){b.removeEventListener(a,c,!1)}:function(b,a,c){b.detachEvent("on"+a,c)};R._data=function(b){return this.cache[b[this.expando]]||{}};var Xc=/([\:\-\_]+(.))/g,Yc= +/^moz([A-Z])/,Bb=E("jqLite"),Fa=R.prototype={ready:function(b){function a(){c||(c=!0,b())}var c=!1;"complete"===T.readyState?setTimeout(a):(this.on("DOMContentLoaded",a),R(C).on("load",a))},toString:function(){var b=[];r(this,function(a){b.push(""+a)});return"["+b.join(", ")+"]"},eq:function(b){return 0<=b?z(this[b]):z(this[this.length+b])},length:0,push:Td,sort:[].sort,splice:[].splice},ib={};r("multiple selected checked disabled readOnly required open".split(" "),function(b){ib[O(b)]=b});var ic= +{};r("input select option textarea button form details".split(" "),function(b){ic[Ia(b)]=!0});r({data:ec,inheritedData:hb,scope:function(b){return z(b).data("$scope")||hb(b.parentNode||b,["$isolateScope","$scope"])},isolateScope:function(b){return z(b).data("$isolateScope")||z(b).data("$isolateScopeNoTemplate")},controller:fc,injector:function(b){return hb(b,"$injector")},removeAttr:function(b,a){b.removeAttribute(a)},hasClass:Fb,css:function(b,a,c){a=Ra(a);if(v(c))b.style[a]=c;else{var d;8>=P&&(d= +b.currentStyle&&b.currentStyle[a],""===d&&(d="auto"));d=d||b.style[a];8>=P&&(d=""===d?s:d);return d}},attr:function(b,a,c){var d=O(a);if(ib[d])if(v(c))c?(b[a]=!0,b.setAttribute(a,d)):(b[a]=!1,b.removeAttribute(d));else return b[a]||(b.attributes.getNamedItem(a)||w).specified?d:s;else if(v(c))b.setAttribute(a,c);else if(b.getAttribute)return b=b.getAttribute(a,2),null===b?s:b},prop:function(b,a,c){if(v(c))b[a]=c;else return b[a]},text:function(){function b(b,d){var e=a[b.nodeType];if(x(d))return e? +b[e]:"";b[e]=d}var a=[];9>P?(a[1]="innerText",a[3]="nodeValue"):a[1]=a[3]="textContent";b.$dv="";return b}(),val:function(b,a){if(x(a)){if("SELECT"===Ga(b)&&b.multiple){var c=[];r(b.options,function(a){a.selected&&c.push(a.value||a.text)});return 0===c.length?null:c}return b.value}b.value=a},html:function(b,a){if(x(a))return b.innerHTML;for(var c=0,d=b.childNodes;c":function(a,c,d,e){return d(a,c)>e(a,c)},"<=":function(a,c,d,e){return d(a,c)<=e(a,c)},">=":function(a,c,d,e){return d(a,c)>=e(a,c)},"&&":function(a,c,d,e){return d(a,c)&&e(a,c)},"||":function(a,c,d,e){return d(a,c)||e(a,c)},"&":function(a,c,d,e){return d(a, +c)&e(a,c)},"|":function(a,c,d,e){return e(a,c)(a,c,d(a,c))},"!":function(a,c,d){return!d(a,c)}},Yd={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Mb=function(a){this.options=a};Mb.prototype={constructor:Mb,lex:function(a){this.text=a;this.index=0;this.ch=s;this.lastCh=":";this.tokens=[];var c;for(a=[];this.index=a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdent:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},throwError:function(a,c,d){d=d||this.index;c=v(c)?"s "+c+"-"+this.index+" ["+this.text.substring(c,d)+"]":" "+d;throw ya("lexerr",a,c,this.text);},readNumber:function(){for(var a="",c=this.index;this.index","<=",">="))a=this.binaryFn(a,c.fn,this.relational());return a},additive:function(){for(var a=this.multiplicative(),c;c=this.expect("+","-");)a=this.binaryFn(a,c.fn,this.multiplicative());return a},multiplicative:function(){for(var a=this.unary(),c;c=this.expect("*","/","%");)a=this.binaryFn(a,c.fn,this.unary());return a},unary:function(){var a;return this.expect("+")?this.primary():(a=this.expect("-"))?this.binaryFn(Za.ZERO,a.fn, +this.unary()):(a=this.expect("!"))?this.unaryFn(a.fn,this.unary()):this.primary()},fieldAccess:function(a){var c=this,d=this.expect().text,e=yc(d,this.options,this.text);return t(function(c,d,h){return e(h||a(c,d))},{assign:function(e,g,h){return ob(a(e,h),d,g,c.text,c.options)}})},objectIndex:function(a){var c=this,d=this.expression();this.consume("]");return t(function(e,f){var g=a(e,f),h=d(e,f),n;if(!g)return s;(g=Ya(g[h],c.text))&&(g.then&&c.options.unwrapPromises)&&(n=g,"$$v"in g||(n.$$v=s,n.then(function(a){n.$$v= +a})),g=g.$$v);return g},{assign:function(e,f,g){var h=d(e,g);return Ya(a(e,g),c.text)[h]=f}})},functionCall:function(a,c){var d=[];if(")"!==this.peekToken().text){do d.push(this.expression());while(this.expect(","))}this.consume(")");var e=this;return function(f,g){for(var h=[],n=c?c(f,g):f,k=0;ka.getHours()?c.AMPMS[0]:c.AMPMS[1]},Z:function(a){a=-1*a.getTimezoneOffset();return a=(0<=a?"+":"")+(Nb(Math[0=P&&(c.href||c.name||c.$set("href",""),a.append(T.createComment("IE fix")));if(!c.href&&!c.xlinkHref&&!c.name)return function(a,c){var f="[object SVGAnimatedString]"===Ma.call(c.prop("href"))?"xlink:href":"href";c.on("click",function(a){c.attr(f)||a.preventDefault()})}}}),Pb={};r(ib,function(a,c){if("multiple"!=a){var d=la("ng-"+c);Pb[d]=function(){return{priority:100,link:function(a,f,g){a.$watch(g[d],function(a){g.$set(c,!!a)})}}}}});r(["src","srcset","href"],function(a){var c= +la("ng-"+a);Pb[c]=function(){return{priority:99,link:function(d,e,f){f.$observe(c,function(c){c&&(f.$set(a,c),P&&e.prop(a,f[a]))})}}}});var sb={$addControl:w,$removeControl:w,$setValidity:w,$setDirty:w,$setPristine:w};Jc.$inject=["$element","$attrs","$scope"];var Lc=function(a){return["$timeout",function(c){return{name:"form",restrict:a?"EAC":"E",controller:Jc,compile:function(){return{pre:function(a,e,f,g){if(!f.action){var h=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1};Kc(e[0], +"submit",h);e.on("$destroy",function(){c(function(){Eb(e[0],"submit",h)},0,!1)})}var n=e.parent().controller("form"),k=f.name||f.ngForm;k&&ob(a,k,g,k);if(n)e.on("$destroy",function(){n.$removeControl(g);k&&ob(a,k,s,k);t(g,sb)})}}}}}]},$d=Lc(),ae=Lc(!0),be=/^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/,ce=/^[a-z0-9!#$%&'*+/=?^_`{|}~.-]+@[a-z0-9-]+(\.[a-z0-9-]+)*$/i,de=/^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/,Mc={text:ub,number:function(a,c,d,e,f,g){ub(a,c,d,e,f,g); +e.$parsers.push(function(a){var c=e.$isEmpty(a);if(c||de.test(a))return e.$setValidity("number",!0),""===a?null:c?a:parseFloat(a);e.$setValidity("number",!1);return s});e.$formatters.push(function(a){return e.$isEmpty(a)?"":""+a});d.min&&(a=function(a){var c=parseFloat(d.min);return na(e,"min",e.$isEmpty(a)||a>=c,a)},e.$parsers.push(a),e.$formatters.push(a));d.max&&(a=function(a){var c=parseFloat(d.max);return na(e,"max",e.$isEmpty(a)||a<=c,a)},e.$parsers.push(a),e.$formatters.push(a));e.$formatters.push(function(a){return na(e, +"number",e.$isEmpty(a)||wb(a),a)})},url:function(a,c,d,e,f,g){ub(a,c,d,e,f,g);a=function(a){return na(e,"url",e.$isEmpty(a)||be.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},email:function(a,c,d,e,f,g){ub(a,c,d,e,f,g);a=function(a){return na(e,"email",e.$isEmpty(a)||ce.test(a),a)};e.$formatters.push(a);e.$parsers.push(a)},radio:function(a,c,d,e){x(d.name)&&c.attr("name",$a());c.on("click",function(){c[0].checked&&a.$apply(function(){e.$setViewValue(d.value)})});e.$render=function(){c[0].checked= +d.value==e.$viewValue};d.$observe("value",e.$render)},checkbox:function(a,c,d,e){var f=d.ngTrueValue,g=d.ngFalseValue;D(f)||(f=!0);D(g)||(g=!1);c.on("click",function(){a.$apply(function(){e.$setViewValue(c[0].checked)})});e.$render=function(){c[0].checked=e.$viewValue};e.$isEmpty=function(a){return a!==f};e.$formatters.push(function(a){return a===f});e.$parsers.push(function(a){return a?f:g})},hidden:w,button:w,submit:w,reset:w,file:w},Nc=["$browser","$sniffer",function(a,c){return{restrict:"E",require:"?ngModel", +link:function(d,e,f,g){g&&(Mc[O(f.type)]||Mc.text)(d,e,f,g,c,a)}}}],rb="ng-valid",qb="ng-invalid",Ja="ng-pristine",tb="ng-dirty",ee=["$scope","$exceptionHandler","$attrs","$element","$parse",function(a,c,d,e,f){function g(a,c){c=c?"-"+db(c,"-"):"";e.removeClass((a?qb:rb)+c).addClass((a?rb:qb)+c)}this.$modelValue=this.$viewValue=Number.NaN;this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$name=d.name;var h=f(d.ngModel), +n=h.assign;if(!n)throw E("ngModel")("nonassign",d.ngModel,ga(e));this.$render=w;this.$isEmpty=function(a){return x(a)||""===a||null===a||a!==a};var k=e.inheritedData("$formController")||sb,l=0,m=this.$error={};e.addClass(Ja);g(!0);this.$setValidity=function(a,c){m[a]!==!c&&(c?(m[a]&&l--,l||(g(!0),this.$valid=!0,this.$invalid=!1)):(g(!1),this.$invalid=!0,this.$valid=!1,l++),m[a]=!c,g(c,a),k.$setValidity(a,c,this))};this.$setPristine=function(){this.$dirty=!1;this.$pristine=!0;e.removeClass(tb).addClass(Ja)}; +this.$setViewValue=function(d){this.$viewValue=d;this.$pristine&&(this.$dirty=!0,this.$pristine=!1,e.removeClass(Ja).addClass(tb),k.$setDirty());r(this.$parsers,function(a){d=a(d)});this.$modelValue!==d&&(this.$modelValue=d,n(a,d),r(this.$viewChangeListeners,function(a){try{a()}catch(d){c(d)}}))};var p=this;a.$watch(function(){var c=h(a);if(p.$modelValue!==c){var d=p.$formatters,e=d.length;for(p.$modelValue=c;e--;)c=d[e](c);p.$viewValue!==c&&(p.$viewValue=c,p.$render())}return c})}],fe=function(){return{require:["ngModel", +"^?form"],controller:ee,link:function(a,c,d,e){var f=e[0],g=e[1]||sb;g.$addControl(f);a.$on("$destroy",function(){g.$removeControl(f)})}}},ge=aa({require:"ngModel",link:function(a,c,d,e){e.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Oc=function(){return{require:"?ngModel",link:function(a,c,d,e){if(e){d.required=!0;var f=function(a){if(d.required&&e.$isEmpty(a))e.$setValidity("required",!1);else return e.$setValidity("required",!0),a};e.$formatters.push(f);e.$parsers.unshift(f);d.$observe("required", +function(){f(e.$viewValue)})}}}},he=function(){return{require:"ngModel",link:function(a,c,d,e){var f=(a=/\/(.*)\//.exec(d.ngList))&&RegExp(a[1])||d.ngList||",";e.$parsers.push(function(a){if(!x(a)){var c=[];a&&r(a.split(f),function(a){a&&c.push(da(a))});return c}});e.$formatters.push(function(a){return H(a)?a.join(", "):s});e.$isEmpty=function(a){return!a||!a.length}}}},ie=/^(true|false|\d+)$/,je=function(){return{priority:100,compile:function(a,c){return ie.test(c.ngValue)?function(a,c,f){f.$set("value", +a.$eval(f.ngValue))}:function(a,c,f){a.$watch(f.ngValue,function(a){f.$set("value",a)})}}}},ke=sa(function(a,c,d){c.addClass("ng-binding").data("$binding",d.ngBind);a.$watch(d.ngBind,function(a){c.text(a==s?"":a)})}),le=["$interpolate",function(a){return function(c,d,e){c=a(d.attr(e.$attr.ngBindTemplate));d.addClass("ng-binding").data("$binding",c);e.$observe("ngBindTemplate",function(a){d.text(a)})}}],me=["$sce","$parse",function(a,c){return function(d,e,f){e.addClass("ng-binding").data("$binding", +f.ngBindHtml);var g=c(f.ngBindHtml);d.$watch(function(){return(g(d)||"").toString()},function(c){e.html(a.getTrustedHtml(g(d))||"")})}}],ne=Ob("",!0),oe=Ob("Odd",0),pe=Ob("Even",1),qe=sa({compile:function(a,c){c.$set("ngCloak",s);a.removeClass("ng-cloak")}}),re=[function(){return{scope:!0,controller:"@",priority:500}}],Pc={};r("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var c=la("ng-"+ +a);Pc[c]=["$parse",function(d){return{compile:function(e,f){var g=d(f[c]);return function(c,d,e){d.on(O(a),function(a){c.$apply(function(){g(c,{$event:a})})})}}}}]});var se=["$animate",function(a){return{transclude:"element",priority:600,terminal:!0,restrict:"A",$$tlb:!0,link:function(c,d,e,f,g){var h,n;c.$watch(e.ngIf,function(f){Pa(f)?n||(n=c.$new(),g(n,function(c){c[c.length++]=T.createComment(" end ngIf: "+e.ngIf+" ");h={clone:c};a.enter(c,d.parent(),d)})):(n&&(n.$destroy(),n=null),h&&(a.leave(zb(h.clone)), +h=null))})}}}],te=["$http","$templateCache","$anchorScroll","$animate","$sce",function(a,c,d,e,f){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:Ba.noop,compile:function(g,h){var n=h.ngInclude||h.src,k=h.onload||"",l=h.autoscroll;return function(g,h,q,r,B){var s=0,u,t,z=function(){u&&(u.$destroy(),u=null);t&&(e.leave(t),t=null)};g.$watch(f.parseAsResourceUrl(n),function(f){var n=function(){!v(l)||l&&!g.$eval(l)||d()},q=++s;f?(a.get(f,{cache:c}).success(function(a){if(q=== +s){var c=g.$new();r.template=a;a=B(c,function(a){z();e.enter(a,null,h,n)});u=c;t=a;u.$emit("$includeContentLoaded");g.$eval(k)}}).error(function(){q===s&&z()}),g.$emit("$includeContentRequested")):(z(),r.template=null)})}}}}],ue=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(c,d,e,f){d.html(f.template);a(d.contents())(c)}}}],ve=sa({priority:450,compile:function(){return{pre:function(a,c,d){a.$eval(d.ngInit)}}}}),we=sa({terminal:!0,priority:1E3}),xe=["$locale", +"$interpolate",function(a,c){var d=/{}/g;return{restrict:"EA",link:function(e,f,g){var h=g.count,n=g.$attr.when&&f.attr(g.$attr.when),k=g.offset||0,l=e.$eval(n)||{},m={},p=c.startSymbol(),q=c.endSymbol(),s=/^when(Minus)?(.+)$/;r(g,function(a,c){s.test(c)&&(l[O(c.replace("when","").replace("Minus","-"))]=f.attr(g.$attr[c]))});r(l,function(a,e){m[e]=c(a.replace(d,p+h+"-"+k+q))});e.$watch(function(){var c=parseFloat(e.$eval(h));if(isNaN(c))return"";c in l||(c=a.pluralCat(c-k));return m[c](e,f,!0)},function(a){f.text(a)})}}}], +ye=["$parse","$animate",function(a,c){var d=E("ngRepeat");return{transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,link:function(e,f,g,h,n){var k=g.ngRepeat,l=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),m,p,q,s,t,v,u={$id:Ea};if(!l)throw d("iexp",k);g=l[1];h=l[2];(l=l[3])?(m=a(l),p=function(a,c,d){v&&(u[v]=a);u[t]=c;u.$index=d;return m(e,u)}):(q=function(a,c){return Ea(c)},s=function(a){return a});l=g.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);if(!l)throw d("iidexp", +g);t=l[3]||l[1];v=l[2];var G={};e.$watchCollection(h,function(a){var g,h,l=f[0],m,u={},D,M,w,x,E,J,H=[];if(vb(a))E=a,m=p||q;else{m=p||s;E=[];for(w in a)a.hasOwnProperty(w)&&"$"!=w.charAt(0)&&E.push(w);E.sort()}D=E.length;h=H.length=E.length;for(g=0;gC;)x.pop().element.remove()}for(;y.length>X;)y.pop()[0].element.remove()}var k;if(!(k=t.match(d)))throw He("iexp",t,ga(f));var l=c(k[2]||k[1]),m=k[4]||k[6],n=k[5],p=c(k[3]||""),r=c(k[2]?k[1]:m),z=c(k[7]), +w=k[8]?c(k[8]):null,y=[[{element:f,label:""}]];B&&(a(B)(e),B.removeClass("ng-scope"),B.remove());f.empty();f.on("change",function(){e.$apply(function(){var a,c=z(e)||[],d={},h,k,l,p,t,v,u;if(q)for(k=[],p=0,v=y.length;p@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}'); +//# sourceMappingURL=angular.min.js.map diff --git a/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css b/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css new file mode 100644 index 00000000..abcaa468 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker-bs3.css @@ -0,0 +1,267 @@ +/*! + * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x + * + * Copyright 2013 Dan Grossman ( http://www.dangrossman.info ) + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Built for http://www.improvely.com + */ + +.daterangepicker.dropdown-menu { + max-width: none; + z-index: 3000; +} + +.daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { + float: left; + margin: 4px; +} + +.daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar { + float: right; + margin: 4px; +} + +.daterangepicker .ranges { + width: 160px; + text-align: left; +} + +.daterangepicker .ranges .range_inputs>div { + float: left; +} + +.daterangepicker .ranges .range_inputs>div:nth-child(2) { + padding-left: 11px; +} + +.daterangepicker .calendar { + display: none; + max-width: 270px; +} + +.daterangepicker.show-calendar .calendar { + display: block; +} + +.daterangepicker .calendar.single .calendar-date { + border: none; +} + +.daterangepicker .calendar th, .daterangepicker .calendar td { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; + white-space: nowrap; + text-align: center; + min-width: 32px; +} + +.daterangepicker .daterangepicker_start_input label, +.daterangepicker .daterangepicker_end_input label { + color: #333; + display: block; + font-size: 11px; + font-weight: normal; + height: 20px; + line-height: 20px; + margin-bottom: 2px; + text-shadow: #fff 1px 1px 0px; + text-transform: uppercase; + width: 74px; +} + +.daterangepicker .ranges input { + font-size: 11px; +} + +.daterangepicker .ranges .input-mini { + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; + color: #555; + display: block; + font-size: 11px; + height: 30px; + line-height: 30px; + vertical-align: middle; + margin: 0 0 10px 0; + padding: 0 6px; + width: 74px; +} + +.daterangepicker .ranges ul { + list-style: none; + margin: 0; + padding: 0; +} + +.daterangepicker .ranges li { + font-size: 13px; + background: #f5f5f5; + border: 1px solid #f5f5f5; + color: #08c; + padding: 3px 12px; + margin-bottom: 8px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + cursor: pointer; +} + +.daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { + background: #08c; + border: 1px solid #08c; + color: #fff; +} + +.daterangepicker .calendar-date { + border: 1px solid #ddd; + padding: 4px; + border-radius: 4px; + background: #fff; +} + +.daterangepicker .calendar-time { + text-align: center; + margin: 8px auto 0 auto; + line-height: 30px; +} + +.daterangepicker { + position: absolute; + background: #fff; + top: 100px; + left: 20px; + padding: 4px; + margin-top: 1px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.daterangepicker.opensleft:before { + position: absolute; + top: -7px; + right: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.opensleft:after { + position: absolute; + top: -6px; + right: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker.opensright:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.daterangepicker.opensright:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #fff; + border-left: 6px solid transparent; + content: ''; +} + +.daterangepicker table { + width: 100%; + margin: 0; +} + +.daterangepicker td, .daterangepicker th { + text-align: center; + width: 20px; + height: 20px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + cursor: pointer; + white-space: nowrap; +} + +.daterangepicker td.off { + color: #999; +} + +.daterangepicker td.disabled { + color: #999; +} + +.daterangepicker td.available:hover, .daterangepicker th.available:hover { + background: #eee; +} + +.daterangepicker td.in-range { + background: #ebf4f8; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.daterangepicker td.active, .daterangepicker td.active:hover { + background-color: #357ebd; + border-color: #3071a9; + color: #fff; +} + +.daterangepicker td.week, .daterangepicker th.week { + font-size: 80%; + color: #ccc; +} + +.daterangepicker select.monthselect, .daterangepicker select.yearselect { + font-size: 12px; + padding: 1px; + height: auto; + margin: 0; + cursor: default; +} + +.daterangepicker select.monthselect { + margin-right: 2%; + width: 56%; +} + +.daterangepicker select.yearselect { + width: 40%; +} + +.daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.ampmselect { + width: 50px; + margin-bottom: 0; +} + +.daterangepicker_start_input { + float: left; +} + +.daterangepicker_end_input { + float: left; + padding-left: 11px +} + +.daterangepicker th.month { + width: auto; +} \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js b/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js new file mode 100644 index 00000000..579e8756 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/bootstrap-daterangepicker_1.3.7/daterangepicker.js @@ -0,0 +1,1026 @@ +/** + * @version: 1.3.7 + * @author: Dan Grossman http://www.dangrossman.info/ + * @date: 2014-04-29 + * @copyright: Copyright (c) 2012-2014 Dan Grossman. All rights reserved. + * @license: Licensed under Apache License v2.0. See http://www.apache.org/licenses/LICENSE-2.0 + * @website: http://www.improvely.com/ + */ +!function ($, moment) { + + var DateRangePicker = function (element, options, cb) { + + // by default, the daterangepicker element is placed at the bottom of HTML body + this.parentEl = 'body'; + + //element that triggered the date range picker + this.element = $(element); + + //create the picker HTML object + var DRPTemplate = ''; + + //custom options + if (typeof options !== 'object' || options === null) + options = {}; + + this.parentEl = (typeof options === 'object' && options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); + this.container = $(DRPTemplate).appendTo(this.parentEl); + + this.setOptions(options, cb); + + //apply CSS classes and labels to buttons + var c = this.container; + $.each(this.buttonClasses, function (idx, val) { + c.find('button').addClass(val); + }); + this.container.find('.daterangepicker_start_input label').html(this.locale.fromLabel); + this.container.find('.daterangepicker_end_input label').html(this.locale.toLabel); + if (this.applyClass.length) + this.container.find('.applyBtn').addClass(this.applyClass); + if (this.cancelClass.length) + this.container.find('.cancelBtn').addClass(this.cancelClass); + this.container.find('.applyBtn').html(this.locale.applyLabel); + this.container.find('.cancelBtn').html(this.locale.cancelLabel); + + //event listeners + + this.container.find('.calendar') + .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) + .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) + .on('click.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) + .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.enterDate, this)) + .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) + .on('change.daterangepicker', 'select.yearselect', $.proxy(this.updateMonthYear, this)) + .on('change.daterangepicker', 'select.monthselect', $.proxy(this.updateMonthYear, this)) + .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.ampmselect', $.proxy(this.updateTime, this)); + + this.container.find('.ranges') + .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) + .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) + .on('click.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.showCalendars, this)) + .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) + .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, this)) + .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); + + if (this.element.is('input')) { + this.element.on({ + 'click.daterangepicker': $.proxy(this.show, this), + 'focus.daterangepicker': $.proxy(this.show, this), + 'keyup.daterangepicker': $.proxy(this.updateFromControl, this) + }); + } else { + this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); + } + + }; + + DateRangePicker.prototype = { + + constructor: DateRangePicker, + + setOptions: function(options, callback) { + + this.startDate = moment().startOf('day'); + this.endDate = moment().endOf('day'); + this.minDate = false; + this.maxDate = false; + this.dateLimit = false; + + this.showDropdowns = false; + this.showWeekNumbers = false; + this.timePicker = false; + this.timePickerIncrement = 30; + this.timePicker12Hour = true; + this.singleDatePicker = false; + this.ranges = {}; + + this.opens = 'right'; + if (this.element.hasClass('pull-right')) + this.opens = 'left'; + + this.buttonClasses = ['btn', 'btn-small']; + this.applyClass = 'btn-success'; + this.cancelClass = 'btn-default'; + + this.format = 'MM/DD/YYYY'; + this.separator = ' - '; + + this.locale = { + applyLabel: 'Apply', + cancelLabel: 'Cancel', + fromLabel: 'From', + toLabel: 'To', + weekLabel: 'W', + customRangeLabel: 'Custom Range', + daysOfWeek: moment()._lang._weekdaysMin.slice(), + monthNames: moment()._lang._monthsShort.slice(), + firstDay: 0 + }; + + this.cb = function () { }; + + if (typeof options.format === 'string') + this.format = options.format; + + if (typeof options.separator === 'string') + this.separator = options.separator; + + if (typeof options.startDate === 'string') + this.startDate = moment(options.startDate, this.format); + + if (typeof options.endDate === 'string') + this.endDate = moment(options.endDate, this.format); + + if (typeof options.minDate === 'string') + this.minDate = moment(options.minDate, this.format); + + if (typeof options.maxDate === 'string') + this.maxDate = moment(options.maxDate, this.format); + + if (typeof options.startDate === 'object') + this.startDate = moment(options.startDate); + + if (typeof options.endDate === 'object') + this.endDate = moment(options.endDate); + + if (typeof options.minDate === 'object') + this.minDate = moment(options.minDate); + + if (typeof options.maxDate === 'object') + this.maxDate = moment(options.maxDate); + + if (typeof options.applyClass === 'string') + this.applyClass = options.applyClass; + + if (typeof options.cancelClass === 'string') + this.cancelClass = options.cancelClass; + + if (typeof options.dateLimit === 'object') + this.dateLimit = options.dateLimit; + + // update day names order to firstDay + if (typeof options.locale === 'object') { + + if (typeof options.locale.daysOfWeek === 'object') { + // Create a copy of daysOfWeek to avoid modification of original + // options object for reusability in multiple daterangepicker instances + this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); + } + + if (typeof options.locale.monthNames === 'object') { + this.locale.monthNames = options.locale.monthNames.slice(); + } + + if (typeof options.locale.firstDay === 'number') { + this.locale.firstDay = options.locale.firstDay; + var iterator = options.locale.firstDay; + while (iterator > 0) { + this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); + iterator--; + } + } + + if (typeof options.locale.applyLabel === 'string') { + this.locale.applyLabel = options.locale.applyLabel; + } + + if (typeof options.locale.cancelLabel === 'string') { + this.locale.cancelLabel = options.locale.cancelLabel; + } + + if (typeof options.locale.fromLabel === 'string') { + this.locale.fromLabel = options.locale.fromLabel; + } + + if (typeof options.locale.toLabel === 'string') { + this.locale.toLabel = options.locale.toLabel; + } + + if (typeof options.locale.weekLabel === 'string') { + this.locale.weekLabel = options.locale.weekLabel; + } + + if (typeof options.locale.customRangeLabel === 'string') { + this.locale.customRangeLabel = options.locale.customRangeLabel; + } + } + + if (typeof options.opens === 'string') + this.opens = options.opens; + + if (typeof options.showWeekNumbers === 'boolean') { + this.showWeekNumbers = options.showWeekNumbers; + } + + if (typeof options.buttonClasses === 'string') { + this.buttonClasses = [options.buttonClasses]; + } + + if (typeof options.buttonClasses === 'object') { + this.buttonClasses = options.buttonClasses; + } + + if (typeof options.showDropdowns === 'boolean') { + this.showDropdowns = options.showDropdowns; + } + + if (typeof options.singleDatePicker === 'boolean') { + this.singleDatePicker = options.singleDatePicker; + } + + if (typeof options.timePicker === 'boolean') { + this.timePicker = options.timePicker; + } + + if (typeof options.timePickerIncrement === 'number') { + this.timePickerIncrement = options.timePickerIncrement; + } + + if (typeof options.timePicker12Hour === 'boolean') { + this.timePicker12Hour = options.timePicker12Hour; + } + + var start, end, range; + + //if no start/end dates set, check if an input element contains initial values + if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { + if ($(this.element).is('input[type=text]')) { + var val = $(this.element).val(); + var split = val.split(this.separator); + start = end = null; + if (split.length == 2) { + start = moment(split[0], this.format); + end = moment(split[1], this.format); + } else if (this.singleDatePicker) { + start = moment(val, this.format); + end = moment(val, this.format); + } + if (start !== null && end !== null) { + this.startDate = start; + this.endDate = end; + } + } + } + + if (typeof options.ranges === 'object') { + for (range in options.ranges) { + + start = moment(options.ranges[range][0]); + end = moment(options.ranges[range][1]); + + // If we have a min/max date set, bound this range + // to it, but only if it would otherwise fall + // outside of the min/max. + if (this.minDate && start.isBefore(this.minDate)) + start = moment(this.minDate); + + if (this.maxDate && end.isAfter(this.maxDate)) + end = moment(this.maxDate); + + // If the end of the range is before the minimum (if min is set) OR + // the start of the range is after the max (also if set) don't display this + // range option. + if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) { + continue; + } + + this.ranges[range] = [start, end]; + } + + var list = '
        '; + for (range in this.ranges) { + list += '
      • ' + range + '
      • '; + } + list += '
      • ' + this.locale.customRangeLabel + '
      • '; + list += '
      '; + this.container.find('.ranges ul').remove(); + this.container.find('.ranges').prepend(list); + } + + if (typeof callback === 'function') { + this.cb = callback; + } + + if (!this.timePicker) { + this.startDate = this.startDate.startOf('day'); + this.endDate = this.endDate.endOf('day'); + } + + if (this.singleDatePicker) { + this.opens = 'right'; + this.container.find('.calendar.right').show(); + this.container.find('.calendar.left').hide(); + this.container.find('.ranges').hide(); + if (!this.container.find('.calendar.right').hasClass('single')) + this.container.find('.calendar.right').addClass('single'); + } else { + this.container.find('.calendar.right').removeClass('single'); + this.container.find('.ranges').show(); + } + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + this.oldChosenLabel = this.chosenLabel; + + this.leftCalendar = { + month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute()]), + calendar: [] + }; + + this.rightCalendar = { + month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute()]), + calendar: [] + }; + + if (this.opens == 'right') { + //swap calendar positions + var left = this.container.find('.calendar.left'); + var right = this.container.find('.calendar.right'); + left.removeClass('left').addClass('right'); + right.removeClass('right').addClass('left'); + } + + if (typeof options.ranges === 'undefined' && !this.singleDatePicker) { + this.container.addClass('show-calendar'); + } + + this.container.addClass('opens' + this.opens); + + this.updateView(); + this.updateCalendars(); + + }, + + setStartDate: function(startDate) { + if (typeof startDate === 'string') + this.startDate = moment(startDate, this.format); + + if (typeof startDate === 'object') + this.startDate = moment(startDate); + + if (!this.timePicker) + this.startDate = this.startDate.startOf('day'); + + this.oldStartDate = this.startDate.clone(); + + this.updateView(); + this.updateCalendars(); + }, + + setEndDate: function(endDate) { + if (typeof endDate === 'string') + this.endDate = moment(endDate, this.format); + + if (typeof endDate === 'object') + this.endDate = moment(endDate); + + if (!this.timePicker) + this.endDate = this.endDate.endOf('day'); + + this.oldEndDate = this.endDate.clone(); + + this.updateView(); + this.updateCalendars(); + }, + + updateView: function () { + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); + this.updateFormInputs(); + }, + + updateFormInputs: function () { + this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format)); + + if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) { + this.container.find('button.applyBtn').removeAttr('disabled'); + } else { + this.container.find('button.applyBtn').attr('disabled', 'disabled'); + } + }, + + updateFromControl: function () { + if (!this.element.is('input')) return; + if (!this.element.val().length) return; + + var dateString = this.element.val().split(this.separator), + start = null, + end = null; + + if(dateString.length === 2) { + start = moment(dateString[0], this.format); + end = moment(dateString[1], this.format); + } + + if (this.singleDatePicker || start === null || end === null) { + start = moment(this.element.val(), this.format); + end = start; + } + + if (end.isBefore(start)) return; + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.startDate = start; + this.endDate = end; + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.updateCalendars(); + }, + + notify: function () { + this.updateView(); + this.cb(this.startDate, this.endDate, this.chosenLabel); + }, + + move: function () { + var parentOffset = { top: 0, left: 0 }; + if (!this.parentEl.is('body')) { + parentOffset = { + top: this.parentEl.offset().top - this.parentEl.scrollTop(), + left: this.parentEl.offset().left - this.parentEl.scrollLeft() + }; + } + + if (this.opens == 'left') { + this.container.css({ + top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, + right: $(window).width() - this.element.offset().left - this.element.outerWidth() - parentOffset.left, + left: 'auto' + }); + if (this.container.offset().left < 0) { + this.container.css({ + right: 'auto', + left: 9 + }); + } + } else { + this.container.css({ + top: this.element.offset().top + this.element.outerHeight() - parentOffset.top, + left: this.element.offset().left - parentOffset.left, + right: 'auto' + }); + if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { + this.container.css({ + left: 'auto', + right: 0 + }); + } + } + }, + + toggle: function (e) { + if (this.element.hasClass('active')) { + this.hide(); + } else { + this.show(); + } + }, + + show: function (e) { + this.element.addClass('active'); + this.container.show(); + this.move(); + + // Create a click proxy that is private to this instance of datepicker, for unbinding + this._outsideClickProxy = $.proxy(function (e) { this.outsideClick(e); }, this); + // Bind global datepicker mousedown for hiding and + $(document) + .on('mousedown.daterangepicker', this._outsideClickProxy) + // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them + .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) + // and also close when focus changes to outside the picker (eg. tabbing between controls) + .on('focusin.daterangepicker', this._outsideClickProxy); + + this.element.trigger('show.daterangepicker', this); + }, + + outsideClick: function (e) { + var target = $(e.target); + // if the page is clicked anywhere except within the daterangerpicker/button + // itself then call this.hide() + if ( + target.closest(this.element).length || + target.closest(this.container).length || + target.closest('.calendar-date').length + ) return; + this.hide(); + }, + + hide: function (e) { + $(document) + .off('mousedown.daterangepicker', this._outsideClickProxy) + .off('click.daterangepicker', this._outsideClickProxy) + .off('focusin.daterangepicker', this._outsideClickProxy); + + this.element.removeClass('active'); + this.container.hide(); + + if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) + this.notify(); + + this.oldStartDate = this.startDate.clone(); + this.oldEndDate = this.endDate.clone(); + + this.element.trigger('hide.daterangepicker', this); + }, + + enterRange: function (e) { + // mouse pointer has entered a range label + var label = e.target.innerHTML; + if (label == this.locale.customRangeLabel) { + this.updateView(); + } else { + var dates = this.ranges[label]; + this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format)); + this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format)); + } + }, + + showCalendars: function() { + this.container.addClass('show-calendar'); + this.move(); + }, + + hideCalendars: function() { + this.container.removeClass('show-calendar'); + }, + + updateInputText: function() { + if (this.element.is('input') && !this.singleDatePicker) { + this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)); + } else if (this.element.is('input')) { + this.element.val(this.startDate.format(this.format)); + } + }, + + clickRange: function (e) { + var label = e.target.innerHTML; + this.chosenLabel = label; + if (label == this.locale.customRangeLabel) { + this.showCalendars(); + } else { + var dates = this.ranges[label]; + + this.startDate = dates[0]; + this.endDate = dates[1]; + + if (!this.timePicker) { + this.startDate.startOf('day'); + this.endDate.endOf('day'); + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); + this.updateCalendars(); + + this.updateInputText(); + + this.hideCalendars(); + this.hide(); + this.element.trigger('apply.daterangepicker', this); + } + }, + + clickPrev: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.subtract('month', 1); + } else { + this.rightCalendar.month.subtract('month', 1); + } + this.updateCalendars(); + }, + + clickNext: function (e) { + var cal = $(e.target).parents('.calendar'); + if (cal.hasClass('left')) { + this.leftCalendar.month.add('month', 1); + } else { + this.rightCalendar.month.add('month', 1); + } + this.updateCalendars(); + }, + + enterDate: function (e) { + + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + if (cal.hasClass('left')) { + this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format)); + } else { + this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format)); + } + + }, + + clickDate: function (e) { + var title = $(e.target).attr('data-title'); + var row = title.substr(1, 1); + var col = title.substr(3, 1); + var cal = $(e.target).parents('.calendar'); + + var startDate, endDate; + if (cal.hasClass('left')) { + startDate = this.leftCalendar.calendar[row][col]; + endDate = this.endDate; + if (typeof this.dateLimit === 'object') { + var maxDate = moment(startDate).add(this.dateLimit).startOf('day'); + if (endDate.isAfter(maxDate)) { + endDate = maxDate; + } + } + } else { + startDate = this.startDate; + endDate = this.rightCalendar.calendar[row][col]; + if (typeof this.dateLimit === 'object') { + var minDate = moment(endDate).subtract(this.dateLimit).startOf('day'); + if (startDate.isBefore(minDate)) { + startDate = minDate; + } + } + } + + if (this.singleDatePicker && cal.hasClass('left')) { + endDate = startDate.clone(); + } else if (this.singleDatePicker && cal.hasClass('right')) { + startDate = endDate.clone(); + } + + cal.find('td').removeClass('active'); + + if (startDate.isSame(endDate) || startDate.isBefore(endDate)) { + $(e.target).addClass('active'); + this.startDate = startDate; + this.endDate = endDate; + this.chosenLabel = this.locale.customRangeLabel; + } else if (startDate.isAfter(endDate)) { + $(e.target).addClass('active'); + var difference = this.endDate.diff(this.startDate); + this.startDate = startDate; + this.endDate = moment(startDate).add('ms', difference); + this.chosenLabel = this.locale.customRangeLabel; + } + + this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()); + this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()); + this.updateCalendars(); + + if (!this.timePicker) + endDate.endOf('day'); + + if (this.singleDatePicker) + this.clickApply(); + }, + + clickApply: function (e) { + this.updateInputText(); + this.hide(); + this.element.trigger('apply.daterangepicker', this); + }, + + clickCancel: function (e) { + this.startDate = this.oldStartDate; + this.endDate = this.oldEndDate; + this.chosenLabel = this.oldChosenLabel; + this.updateView(); + this.updateCalendars(); + this.hide(); + this.element.trigger('cancel.daterangepicker', this); + }, + + updateMonthYear: function (e) { + var isLeft = $(e.target).closest('.calendar').hasClass('left'), + leftOrRight = isLeft ? 'left' : 'right', + cal = this.container.find('.calendar.'+leftOrRight); + + // Month must be Number for new moment versions + var month = parseInt(cal.find('.monthselect').val(), 10); + var year = cal.find('.yearselect').val(); + + this[leftOrRight+'Calendar'].month.month(month).year(year); + this.updateCalendars(); + }, + + updateTime: function(e) { + + var cal = $(e.target).closest('.calendar'), + isLeft = cal.hasClass('left'); + + var hour = parseInt(cal.find('.hourselect').val(), 10); + var minute = parseInt(cal.find('.minuteselect').val(), 10); + + if (this.timePicker12Hour) { + var ampm = cal.find('.ampmselect').val(); + if (ampm === 'PM' && hour < 12) + hour += 12; + if (ampm === 'AM' && hour === 12) + hour = 0; + } + + if (isLeft) { + var start = this.startDate.clone(); + start.hour(hour); + start.minute(minute); + this.startDate = start; + this.leftCalendar.month.hour(hour).minute(minute); + } else { + var end = this.endDate.clone(); + end.hour(hour); + end.minute(minute); + this.endDate = end; + this.rightCalendar.month.hour(hour).minute(minute); + } + + this.updateCalendars(); + }, + + updateCalendars: function () { + this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), 'left'); + this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), 'right'); + this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate)); + this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.startDate, this.maxDate)); + + this.container.find('.ranges li').removeClass('active'); + var customRange = true; + var i = 0; + for (var range in this.ranges) { + if (this.timePicker) { + if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') + .addClass('active').html(); + } + } else { + //ignore times when comparing dates if time picker is not enabled + if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { + customRange = false; + this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') + .addClass('active').html(); + } + } + i++; + } + if (customRange) { + this.chosenLabel = this.container.find('.ranges li:last') + .addClass('active').html(); + } + }, + + buildCalendar: function (month, year, hour, minute, side) { + var firstDay = moment([year, month, 1]); + var lastMonth = moment(firstDay).subtract('month', 1).month(); + var lastYear = moment(firstDay).subtract('month', 1).year(); + + var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); + + var dayOfWeek = firstDay.day(); + + var i; + + //initialize a 6 rows x 7 columns array for the calendar + var calendar = []; + for (i = 0; i < 6; i++) { + calendar[i] = []; + } + + //populate the calendar with date objects + var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; + if (startDay > daysInLastMonth) + startDay -= 7; + + if (dayOfWeek == this.locale.firstDay) + startDay = daysInLastMonth - 6; + + var curDate = moment([lastYear, lastMonth, startDay, 12, minute]); + var col, row; + for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add('hour', 24)) { + if (i > 0 && col % 7 === 0) { + col = 0; + row++; + } + calendar[row][col] = curDate.clone().hour(hour); + curDate.hour(12); + } + + return calendar; + }, + + renderDropdowns: function (selected, minDate, maxDate) { + var currentMonth = selected.month(); + var monthHtml = '"; + + var currentYear = selected.year(); + var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); + var minYear = (minDate && minDate.year()) || (currentYear - 50); + var yearHtml = ''; + + return monthHtml + yearHtml; + }, + + renderCalendar: function (calendar, selected, minDate, maxDate) { + + var html = '
      '; + html += ''; + html += ''; + html += ''; + + // add empty cell for week number + if (this.showWeekNumbers) + html += ''; + + if (!minDate || minDate.isBefore(calendar[1][1])) { + html += ''; + } else { + html += ''; + } + + var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); + + if (this.showDropdowns) { + dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate); + } + + html += ''; + if (!maxDate || maxDate.isAfter(calendar[1][1])) { + html += ''; + } else { + html += ''; + } + + html += ''; + html += ''; + + // add week number label + if (this.showWeekNumbers) + html += ''; + + $.each(this.locale.daysOfWeek, function (index, dayOfWeek) { + html += ''; + }); + + html += ''; + html += ''; + html += ''; + + for (var row = 0; row < 6; row++) { + html += ''; + + // add week number + if (this.showWeekNumbers) + html += ''; + + for (var col = 0; col < 7; col++) { + var cname = 'available '; + cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off'; + + if ((minDate && calendar[row][col].isBefore(minDate, 'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) { + cname = ' off disabled '; + } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) { + cname += ' active '; + if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) { + cname += ' start-date '; + } + if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) { + cname += ' end-date '; + } + } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) { + cname += ' in-range '; + if (calendar[row][col].isSame(this.startDate)) { cname += ' start-date '; } + if (calendar[row][col].isSame(this.endDate)) { cname += ' end-date '; } + } + + var title = 'r' + row + 'c' + col; + html += ''; + } + html += ''; + } + + html += ''; + html += '
      ' + dateHtml + '
      ' + this.locale.weekLabel + '' + dayOfWeek + '
      ' + calendar[row][0].week() + '' + calendar[row][col].date() + '
      '; + html += '
      '; + + var i; + if (this.timePicker) { + + html += '
      '; + html += ' : '; + + html += ' '; + + if (this.timePicker12Hour) { + html += ''; + } + + html += '
      '; + + } + + return html; + + }, + + remove: function() { + + this.container.remove(); + this.element.off('.daterangepicker'); + this.element.removeData('daterangepicker'); + + } + + }; + + $.fn.daterangepicker = function (options, cb) { + this.each(function () { + var el = $(this); + if (el.data('daterangepicker')) + el.data('daterangepicker').remove(); + el.data('daterangepicker', new DateRangePicker(el, options, cb)); + }); + return this; + }; + +}(window.jQuery, window.moment); \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css new file mode 100644 index 00000000..a4069929 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css @@ -0,0 +1,347 @@ +/*! + * Bootstrap v3.1.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #2b669a; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #2d6ca2; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #2d6ca2; + border-color: #2b669a; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #357ebd; + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; +} +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%); + background-image: linear-gradient(to bottom, #222 0%, #282828 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #3071a9; + background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); + background-repeat: repeat-x; + border-color: #3278b3; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); + background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css.map b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css.map new file mode 100644 index 00000000..b36fc9a4 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins.less"],"names":[],"mappings":"AAeA;AACA;AACA;AACA;AACA;AACA;EACE,wCAAA;ECoGA,2FAAA;EACQ,mFAAA;;ADhGR,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;AACD,YAAC;AAAD,YAAC;AAAD,YAAC;AAAD,SAAC;AAAD,YAAC;AAAD,WAAC;EC8FD,wDAAA;EACQ,gDAAA;;ADnER,IAAC;AACD,IAAC;EACC,sBAAA;;AAKJ;EC4PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;EAyB2C,yBAAA;EAA2B,kBAAA;;AAvBtE,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAeJ;EC2PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAgBJ;EC0PI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAiBJ;ECyPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,SAAC;AACD,SAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,SAAC;AACD,SAAC;EACC,yBAAA;EACA,qBAAA;;AAkBJ;ECwPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,YAAC;AACD,YAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,YAAC;AACD,YAAC;EACC,yBAAA;EACA,qBAAA;;AAmBJ;ECuPI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EAEA,sHAAA;EAoCF,mEAAA;ED7TA,2BAAA;EACA,qBAAA;;AAEA,WAAC;AACD,WAAC;EACC,yBAAA;EACA,4BAAA;;AAGF,WAAC;AACD,WAAC;EACC,yBAAA;EACA,qBAAA;;AA2BJ;AACA;EC6CE,kDAAA;EACQ,0CAAA;;ADpCV,cAAe,KAAK,IAAG;AACvB,cAAe,KAAK,IAAG;ECmOnB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EDpOF,yBAAA;;AAEF,cAAe,UAAU;AACzB,cAAe,UAAU,IAAG;AAC5B,cAAe,UAAU,IAAG;EC6NxB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED9NF,yBAAA;;AAUF;ECiNI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;EDrPA,kBAAA;ECaA,2FAAA;EACQ,mFAAA;;ADjBV,eAOE,YAAY,UAAU;EC0MpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,wDAAA;EACQ,gDAAA;;ADLV;AACA,WAAY,KAAK;EACf,8CAAA;;AAIF;EC+LI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EAoCF,mEAAA;;ADtOF,eAIE,YAAY,UAAU;EC2LpB,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;EApMF,uDAAA;EACQ,+CAAA;;ADCV,eASE;AATF,eAUE,YAAY,KAAK;EACf,yCAAA;;AAKJ;AACA;AACA;EACE,gBAAA;;AAUF;EACE,6CAAA;EChCA,0FAAA;EACQ,kFAAA;;AD2CV;ECqJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAKF;ECoJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAMF;ECmJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAOF;ECkJI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED5JF,qBAAA;;AAgBF;ECyII,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADlIJ;EC+HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADjIJ;EC8HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADhIJ;EC6HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD/HJ;EC4HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD9HJ;EC2HI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtHJ;EACE,kBAAA;EC/EA,kDAAA;EACQ,0CAAA;;ADiFV,gBAAgB;AAChB,gBAAgB,OAAO;AACvB,gBAAgB,OAAO;EACrB,6BAAA;EC4GE,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED7GF,qBAAA;;AAUF;ECjGE,iDAAA;EACQ,yCAAA;;AD0GV,cAAe;ECsFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADxFJ,cAAe;ECqFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADvFJ,cAAe;ECoFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADtFJ,WAAY;ECmFR,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADrFJ,cAAe;ECkFX,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;ADpFJ,aAAc;ECiFV,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;;AD5EJ;ECyEI,kBAAkB,sDAAlB;EACA,kBAAkB,oDAAlB;EACA,2BAAA;EACA,sHAAA;ED1EF,qBAAA;EC1HA,yFAAA;EACQ,iFAAA","sourcesContent":["\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-bg, 5%); @end-color: darken(@navbar-default-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-bg; @end-color: lighten(@navbar-inverse-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n}\n\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","//\n// Mixins\n// --------------------------------------------------\n\n\n// Utilities\n// -------------------------\n\n// Clearfix\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n// WebKit-style focus\n.tab-focus() {\n // Default\n outline: thin dotted;\n // WebKit\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n\n// Center-align a block level element\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Sizing shortcuts\n.size(@width; @height) {\n width: @width;\n height: @height;\n}\n.square(@size) {\n .size(@size; @size);\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-moz-placeholder { color: @color; // Firefox\n opacity: 1; } // See https://github.com/twbs/bootstrap/pull/11526\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Text overflow\n// Requires inline-block or block for proper styling\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`. Note\n// that we cannot chain the mixins together in Less, so they are repeated.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n\n// CSS3 PROPERTIES\n// --------------------------------------------------\n\n// Single side border-radius\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support the\n// standard `box-shadow` property.\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Transitions\n.transition(@transition) {\n -webkit-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n// Transformations\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n transform: rotate(@degrees);\n}\n.scale(@ratio; @ratio-y...) {\n -webkit-transform: scale(@ratio, @ratio-y);\n -ms-transform: scale(@ratio, @ratio-y); // IE9 only\n transform: scale(@ratio, @ratio-y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n transform: translate(@x, @y);\n}\n.skew(@x; @y) {\n -webkit-transform: skew(@x, @y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n transform: skew(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n.backface-visibility(@visibility){\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// User select\n// For selecting text on the page\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n\n// Resize anything\n.resizable(@direction) {\n resize: @direction; // Options: horizontal, vertical, both\n overflow: auto; // Safari fix\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Opacity\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n\n\n\n// GRADIENTS\n// --------------------------------------------------\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, color-stop(@start-color @start-percent), color-stop(@end-color @end-percent)); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n\n// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n\n\n\n// Retina images\n//\n// Short retina mixin for setting background-image and -size\n\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// COMPONENT MIXINS\n// --------------------------------------------------\n\n// Horizontal dividers\n// -------------------------\n// Dividers (basically an hr) within dropdowns and nav lists\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n// Panels\n// -------------------------\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse .panel-body {\n border-top-color: @border;\n }\n }\n & > .panel-footer {\n + .panel-collapse .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n\n// Alerts\n// -------------------------\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n// Tables\n// -------------------------\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n// List Groups\n// -------------------------\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a& {\n color: @color;\n\n .list-group-item-heading { color: inherit; }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n// Button variants\n// -------------------------\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:hover,\n &:focus,\n &:active,\n &.active,\n .open .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 8%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &:active,\n &.active {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n// -------------------------\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n\n// Pagination\n// -------------------------\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n\n// Labels\n// -------------------------\n.label-variant(@color) {\n background-color: @color;\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n\n// Contextual backgrounds\n// -------------------------\n.bg-variant(@color) {\n background-color: @color;\n a&:hover {\n background-color: darken(@color, 10%);\n }\n}\n\n// Typography\n// -------------------------\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover {\n color: darken(@color, 10%);\n }\n}\n\n// Navbar vertical align\n// -------------------------\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n\n// Progress bars\n// -------------------------\n.progress-bar-variant(@color) {\n background-color: @color;\n .progress-striped & {\n #gradient > .striped();\n }\n}\n\n// Responsive utilities\n// -------------------------\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n\n\n// Grid System\n// -----------\n\n// Centered container element\n.container-fixed() {\n margin-right: auto;\n margin-left: auto;\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: (@gutter / -2);\n margin-right: (@gutter / -2);\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n @media (min-width: @screen-xs-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-push(@columns) {\n @media (min-width: @screen-xs-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-xs-column-pull(@columns) {\n @media (min-width: @screen-xs-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n\n// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) when (@index = 1) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n .box-shadow(@shadow);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-focus-border` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. ``\n// element gets special love because it's special, and that's a fact!\n\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-darker: lighten(#000, 13.5%); // #222\n@gray-dark: lighten(#000, 20%); // #333\n@gray: lighten(#000, 33.5%); // #555\n@gray-light: lighten(#000, 60%); // #999\n@gray-lighter: lighten(#000, 93.5%); // #eee\n\n@brand-primary: #428bca;\n@brand-success: #5cb85c;\n@brand-info: #5bc0de;\n@brand-warning: #f0ad4e;\n@brand-danger: #d9534f;\n\n\n//== Scaffolding\n//\n// ## Settings for some of the most global styles.\n\n//** Background color for ``.\n@body-bg: #fff;\n//** Global text color on ``.\n@text-color: @gray-dark;\n\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif: Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for ``, ``, and `
      `.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the ``.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//-- Iconography\n//\n//## Specify custom locations of the include Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n@icon-font-path:          \"../fonts/\";\n@icon-font-name:          \"glyphicons-halflings-regular\";\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for ``s and ``s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `` background color\n@input-bg:                       #fff;\n//** `` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for ``s\n@input-color:                    @gray;\n//** `` border color\n@input-border:                   #ccc;\n//** `` border radius\n@input-border-radius:            @border-radius-base;\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        @gray-light;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n// Note: Deprecated @dropdown-caret-color as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1010;\n@zindex-tooltip:           1030;\n@zindex-navbar-fixed:      1030;\n@zindex-modal-background:  1040;\n@zindex-modal:             1050;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n// Note: Deprecated @screen-xs and @screen-phone as of v3.0.1\n@screen-xs:                  480px;\n@screen-xs-min:              @screen-xs;\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n// Note: Deprecated @screen-sm and @screen-tablet as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n// Note: Deprecated @screen-md and @screen-desktop as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n// Note: Deprecated @screen-lg and @screen-lg-desktop as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             ((720px + @grid-gutter-width));\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            ((940px + @grid-gutter-width));\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      ((1140px + @grid-gutter-width));\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      @gray-light;\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 @gray-light;\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n@nav-open-link-hover-color:                 #fff;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        #fff;\n@pagination-border:                    #ddd;\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  @gray-lighter;\n@pagination-hover-border:              #ddd;\n\n@pagination-active-color:              #fff;\n@pagination-active-bg:                 @brand-primary;\n@pagination-active-border:             @brand-primary;\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #fff;\n@pagination-disabled-border:           #ddd;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 #fff;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list elements on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list elements\n@list-group-active-color:       @component-active-color;\n//** Background color of active list elements\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n@list-group-link-color:         #555;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n\n\n//== Miscellaneous\n//\n//##\n\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev { display: block; }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: none;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    margin-left: -10px;\n    font-family: serif;\n  }\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      margin-left: -15px;\n      font-size: 30px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 200;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: 14px base font * 85% = about 12px\nsmall,\n.small  { font-size: 85%; }\n\n// Undo browser default styling\ncite    { font-style: normal; }\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// --------------------------------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n@media (min-width: @grid-float-breakpoint) {\n  .dl-horizontal {\n    dt {\n      float: left;\n      width: (@component-offset-horizontal - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @component-offset-horizontal;\n      &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n    }\n  }\n}\n\n// MISC\n// ----\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Quotes\nblockquote:before,\nblockquote:after {\n  content: \"\";\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  white-space: nowrap;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  max-width: 100%;\n  background-color: @table-bg;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    > td,\n    > th {\n      background-color: @table-bg-accent;\n    }\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    > td,\n    > th {\n      background-color: @table-bg-hover;\n    }\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n@media (max-width: @screen-xs-max) {\n  .table-responsive {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    overflow-x: scroll;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n    -webkit-overflow-scrolling: touch;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: -webkit-min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; /* IE8-9 */\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS date input\n//\n// In Mobile Safari, date inputs require a pixel line-height that matches the\n// given height of the input.\n\ninput[type=\"date\"] {\n  line-height: @input-height-base;\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  display: block;\n  min-height: @line-height-computed; // clear the floating input if there is no label text\n  margin-top: 10px;\n  margin-bottom: 10px;\n  padding-left: 20px;\n  label {\n    display: inline;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  float: left;\n  margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"],\n.radio,\n.radio-inline,\n.checkbox,\n.checkbox-inline {\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n.input-lg {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n\n  // Feedback icon (requires .glyphicon classes)\n  .form-control-feedback {\n    position: absolute;\n    top: (@line-height-computed + 5); // Height of the `label` and its margin\n    right: 0;\n    display: block;\n    width: @input-height-base;\n    height: @input-height-base;\n    line-height: @input-height-base;\n    text-align: center;\n  }\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  margin-bottom: 0; // Remove default margin from `p`\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      padding-left: 0;\n      vertical-align: middle;\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      float: none;\n      margin-left: 0;\n    }\n\n    // Validation states\n    //\n    // Reposition the icon because it's now within a grid column and columns have\n    // `position: relative;` on them. Also accounts for the grid gutter padding.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of labels, radios, and checkboxes\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  .form-control-static {\n    padding-top: (@padding-base-vertical + 1);\n  }\n\n  // Only right align form labels here when the columns stop stacking\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    top: 0;\n    right: (@grid-gutter-width / 2);\n  }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: not-allowed;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  cursor: pointer;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n    &:focus {\n      // Remove focus outline when dropdown JS adds it after closing the menu\n      outline: none;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n}\n\n\n// Checkbox and radio options\n[data-toggle=\"buttons\"] > .btn > input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn > input[type=\"checkbox\"] {\n  display: none;\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twitter/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  &.in {\n    display: block;\n  }\n}\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition(height .35s ease);\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n//  Star\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot')\";\n  src: ~\"url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.woff') format('woff')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype')\",\n       ~\"url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg')\";\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro                   { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n}\n// Nuke hover/focus effects\n.dropdown-menu > .disabled > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    .reset-filter();\n    cursor: not-allowed;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn { .input-lg(); }\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn { .input-sm(); }\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    > a {\n      position: relative;\n      display: block;\n      padding: @nav-link-padding;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: not-allowed;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    > a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n     > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n  }\n  > .active {\n    display: block;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  max-height: @navbar-collapse-max-height;\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: none;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right { .pull-right(); }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n\n    // Outdent the form if last child to line up with content down the page\n    &.navbar-right:last-child {\n      margin-right: 0;\n    }\n  }\n}\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: not-allowed;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: not-allowed;\n    }\n  }\n\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  &[href] {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base classes\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n}\n\n// Hover state, but only for links\na.badge {\n  &:hover,\n  &:focus {\n    color: @badge-link-hover-color;\n    text-decoration: none;\n    cursor: pointer;\n  }\n}\n\n// Account for counters in navs\na.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n  color: @badge-active-color;\n  background-color: @badge-active-bg;\n}\n.nav-pills > li > a > .badge {\n  margin-left: 3px;\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding;\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  .container & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding-top:    (@jumbotron-padding * 1.6);\n    padding-bottom: (@jumbotron-padding * 1.6);\n\n    .container & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissable alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable {\n padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n.progress-striped .progress-bar {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n.progress.active .progress-bar {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Media objects\n// Source: http://stubbornella.org/content/?p=497\n// --------------------------------------------------\n\n\n// Common styles\n// -------------------------\n\n// Clear the floats\n.media,\n.media-body {\n  overflow: hidden;\n  zoom: 1;\n}\n\n// Proper spacing between instances of .media\n.media,\n.media .media {\n  margin-top: 15px;\n}\n.media:first-child {\n  margin-top: 0;\n}\n\n// For images and videos, set to block\n.media-object {\n  display: block;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin: 0 0 5px;\n}\n\n\n// Media image alignment\n// -------------------------\n\n.media {\n  > .pull-left {\n    margin-right: 10px;\n  }\n  > .pull-right {\n    margin-left: 10px;\n  }\n}\n\n\n// Media list variation\n// -------------------------\n\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on 
        ,
          , or
          .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n\n // Align badges within list items\n > .badge {\n float: right;\n }\n > .badge + .badge {\n margin-right: 5px;\n }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @list-group-hover-bg;\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: 10px 15px;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table {\n margin-bottom: 0;\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n overflow: hidden; // crop contents when collapsed\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n + .panel-collapse .panel-body {\n border-top: 1px solid @panel-inner-border;\n }\n }\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: auto;\n overflow-y: scroll;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0)}\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: none;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n margin-top: 15px;\n padding: (@modal-inner-padding - 1) @modal-inner-padding @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n visibility: visible;\n font-size: @font-size-small;\n line-height: 1.4;\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n text-decoration: none;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n text-align: left; // Reset given new insertion method\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Overrides for proper insertion\n white-space: normal;\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 18px;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: 5px 5px 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#browsers\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n"]} \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.min.css b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.min.css new file mode 100644 index 00000000..679272d2 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/css/bootstrap.min.css @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.1.1 (http://getbootstrap.com) + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=radio],input[type=checkbox]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=file]:focus,input[type=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=radio],.input-group-addon input[type=checkbox]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#faebcc}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#ebccd1}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.eot b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..4a4ca865d67e86f961bc6e2ef00bffa4e34bb9ed GIT binary patch literal 20335 zcma%iRa9Lu*X_aGIXLtH2X}XOcXxM};>BGK?k>gMi@Uo+afec%&=$Y_zI(@iAMVRd zMzYtMnVHGh`(bBgBrYld0G2WU0R1n+0{)ZW{#ye8Pyh%N;2)-_`hS4`dHjR_o8s?3 z%Kr!aAA=Sk15gC$0aO9906BmJKn0)-&;Wq`d1e4dfc3v(2XF@106hNnKnJJ;tp3?v z|4=i4`#;17p#2YV|JP~t*4IuDO^FK=e+xx$$?LVd`z~aAr@Bit+ z4B+|46aYB=Q+D{L`5%t;Kdt|aZw_GpXL0?v@B%pgd3^uI=KcSkIq3hHHvk~6A@l#d zDHwovCxFWvz!d;sGQ^&}h@CLq(3!MVaFhSyL!rg*&d8F%X_&hML`QYBTiRZ}i=N8C zfX|m2SCm$2B^?XKJ=3POS}r1sVM9Nj*l5q`5#S% zQ}FD^zy1Pj*xUGOm4;*C;l80oktO?~%SdX8H^8@@idBFWyOINSr_!xo{REWRlXgw| z3-(h5XcHaEdPKzyy2-P+Rljn4lR?IelEOtWLiC?_9FW&x@kpuRtfsn*-QLS4EoN{{q0u8pt_^hD_!V);D{hen z-XpV~5QeQTYTIl1+B^5r72`!7FRQQ$Jh74=Gm*OkaIoNUC7!wk7rRZVuVK6urnp@}QDpB~9*S zkVWg8LyXz8-%53>GXb$%*H0(bqkUIN`Oz8g=bse?bAumC8`5XqA+(_y{fV^j(1$BZ za*@mJ(&?Dl2k;8tW}O6OaavJE|17u#1t>M^0!@SDJc2)cLZL`m7!-)74CQUXoksM* z9m|Sjh}@dm-Tnc8<77&TfjT6H{3)kXMM774`D!eA0|(RuQz@iQO(4-7lX|aK*M`Y=f%R{_&<*A? zB(AZUl6JXgz^9c9q7ZW~Lpncpv1I^6O4mGX@3P^Q)?jBgx(f#RD_4y0q5aC_beGG> zn%RbEy_vdx`sL?|Jvlgyxal-}XM^FDQYp|Euiu=%8o(=wic+XSimJ4(Adn3`QH6^D zQ}H@oBN{|Zg^2u|@8c~h7Kv&HCx??xy^J$3{B0{XnlrThDaoQqjXjXHi#b!KIjA7( z$hT;Ah_VP&j)(Z6&(xn;KF3rHsF^A#il?$)q4Pp#sly?|%OmoRG|MiNW3+)?3Wd9= zgbUjzTLX+!G&oYj9P;jnHmT91qKPzxkj@>rsqi|=M5$PfrRCY%E7${xLDZFtYcC%k zorpLj$T65dN+HV@=yRlKSS8W~SMxFkK1~U-XW2@DXcG`4-V)z|605uD4Q{MP10fD5 zc!T#)n57))zXXfg=dwnZuD_`DCJc3cHE6HuA(>36o_neqgoF0pRK0eEc~{rD8%Pfh z@dtE6ovkazKj3fd{)*&tB0YA^1d^^?2oeNyB7u(P+O4$@lCNc~%mb5iP)dLGM|z;x zEkRYM_^U`g%s5jiH=8Q2h zlS%BdC6DaYEWi0UNhnc*zFT$fV`4_VMNU~nH;q(Ld?!#lIvm)K;W_4C(l3+4TZ=QI zD%siB%cY+Y7vMFM_KAg?sxm(^nJsMIV?v|vAS8l;zotv$#Ml-Y!n7|X5Y5C)=TiGZ zQ+=(9%lk0&L&hDtwRD=Ua6wQeS{g2mvwc>^|4$ot-2Hi`z)|V$N{mNAEZC3gw_8%z zq(L3Bcwr2gin62dXM8cG-D-auD7HayLz zJI2|m=8$F?Ko>v@P4{(W5g=}-b$%tJgfywp`6&A96|Zx{9N;1@_>hto7TQf3EIMm+ zJ`;@@4ycXnHM>|iJ?FXkWGc8YuGviO&L*^ajd+vyLIxAAT{isADQQM5S;YP+jAYp7 z3E1Nm1HDd%SXi``NR*so7XidvRPj#BM7A`S{cU%VISQOhrMLr08;N36AYg9}40Ml# zU)GUxQy(D1%P`@`HDaXn&%m8`hOu~_2a`%P{v7w2;KUNhll)N(y4wD#p#{+($uLOB z!X;K=sci1erRm1=Qcx#ja(r=E8*89RNH8`C7T4|#uVRc=Kaf}0Xw)>8g0(4H!ZrK^ zh-Kf(V#NQcMU79on9bk?`U7eI{Nu-CdboLYH-7lJI|7VCob2872$p->3n)-J>N|b% zIn3vzKet~nvHB=bP6rDRV|&&4LL}S7`iu2ok&r8ecw~yUROul?44VSV3;z7qSQWl+y^cX=$j~OQ;o~0+_)5WDRF0^JbuD_umr4Mn$EPEyB-_eog^1*P#Ui}dCDH6-GndXgi$XV2SNHe#HHQoU z`2f{kT*~Y-Gtyd}I#v=*PbShJzp4hgaK>cr++;2GSGr7^2gA_3H1F;=06B{L4@fTs zD?F!vb_51Hnzb3BJlYiI4qZ5fDt|CaKX-N&2aP_DVX`bH*FN93cV*3fPvociz|dFF zDI@_;;4`*j9yW7pmnXjEwqe@BEQw*5Kcl$=zJxCo$}$5>0aU8*UXir zlo6vuHSn81M=rz-M|tYukSa7I2M$#Q-7`8&2-+UvW25@8gOf1VSR}3RdVFr|-&}4T zky0u`XuQc%0#b=LJWu5hm&cbB$Zk2FeYD~v-Cc92u|%sIUh-65dJR zZ3)g?oGWe-H6(Dl5E)k2)Hal?$9R73FM9`l`qB^<^f4kuce&|T)yCo{^=_a`TY*c$ zRRh_284jJjLoW$Wjv_@n$8LbXuW0pZw;g`-3$XUHD0Me!pbdD8z$3+L^KKYOabFdl zZW8&J8yRWfjLh?e7QJEkgl<&QwDnZ2^WwgBH0{AjxI^@Q)51nlGRVgj8j^jL0%{L5 zg~N&QybX0(ldaaot?}x4%vuVeTbZ96fpg*k(_p?a+IFGn!YUuS;~_Z0CLyGFeQ=ow zhS}^5R4dLfu9Q@MFw7c5_Tg`%mq$XF81YXSFD~rt=E6o|lVBQmHpMG(*<)M(E(4f* zifS(;Yjenr?~y*l>F20zQ%mciliU45f-wznJZdw(tS7t6>004*2#X3Ej3pco3fi`a z?|gM_ckVQxZ*D!nTeU+|gbdPEj(!rKUXu)| zkLqUGanZqn25Ek?PHa9%4W|%Ad_2AJ^C4ZsK(9AW?d?fe_y54j#ceCX7%ZMmS`{x=_0fcCjb0L>U_D>5f4kNy zHQQg5@4aYV)6gpTnv`z06M5a}w7=9Zxp`bcn&i(EOAPWj!?Z(2O?^DESnGfRDGcs1 z?IvJ*{LKonl7#robcFc@OJ<~_Nrt1&v@ePe#wEFKMxfTA!AwJm2~n9HG8Q3?YR-Yz z9Qm3kx|c48;)6Kyoo?<`!|@@xwp~u#ofuQm>ip4bLvO_8W)9{2phqI7{WR9NLgJ5S zHO8hXtJ(CY)mUG&o(gGo!3Qk!=#XUS13O&o{vweBJ4o1y<~#&5^$s69ECV9xM}=+2 z3!NJW8%Q`f_Ja)nexErX5!VB@V=TLVghSEjRt5vdJ8zuRg0R+Y>(Wb*7ED)es#R7< zyyj>az=m}1XQ+E7Z@KG=Cs|{!+EejQ_B-7_Z_Y;kETxVVJOayFzr&scDu#RzsdT7?ZD( zjt$GiPqMQDN##jNA(UuHMgjopqE;pkUTep+3YhG2G!BnK?~X#v(Hh{G+w3pu5aBF+5$)Hq);#9CbG zsE7UhKwvg;w*V(0K7kvgnm5CXt2oMK#y!&dqW6^CO`o-9h;rpe8sX@M7vdNHrSI)y z9KlvS+@+-`CzlS3h}P)VbJn)MN&1rZJDgsR=F2FHZMpd&S1VRKi;7W;=|X`v`iwr; z6={w%x(Bj(^(a<%?7PB*S%}>sft}U!!qdscsQgT@3X5WihmLBxuS7?1$@SvvJ3<<| zt}Y%yqH_W&6!_(na-jr#Zv7W*Cu#c6Hqr$o{eMTHmIWfcuI+rsXc1x$ibc)|lxs`| z^lhQp&^b^BTL(xEI!6k8bxom-D8C}+6_a%`?CYjSuFcEh5J1&Y`Z-6Dj-I`%()n$9 zg*b<&Zs^xdC{p2ab~}fxiuobr7XT7pIefDq+B0S-e*#Ncv}xLJi{{yPWu)?Esyu0; z1qsK_FAEg-C+$p0cp*xgs1s4btkM&3lqqeQRpD2eomd(OP0Q@*e&Xas38amh5^boC zOw$(pnvN$4MdoQ_u*a%EGU#34!L8h;hCq2qu>vma`dr@6OJ$uR*Uy0|v+9(q#{vUE z-6#WJn9K=D1b|=3z9t2tlyis<332BeH7r+zY@~b=^WA5yuvSMiyU=H97SQ7PJ=xDq8^5h@!5s)7NwIC(^9c}UqFKh>XnFPu|+L@P;S z3sSA!`G>+GcF}A^nfl|n_2P=oi#0>A$BphJo^niV$39q>jBn7=yG3jodFC|0-)C$R z@AvsPawzRcdI+N@#+XCUhE-bV6R(fb0#L8<{kZo-bBF0d_eb2=Oq%CRy|M%BGBmTi z*(vF=mDqfB)Ffbr1WObL5rtaXXn7h$vMIMyd!!E!)5Fe{yHa{ZKHpGwQ9J-@cQ$OX z8Bux&6WJ%|zF+jJZ&(g-&u~QV-Y_~q?DJ>#3~9WiBeIU_uh)eb{b{VUn_K9kFfYXL z#W?5L8z;XrA?Kc&ua35Hi_uhWghl9)h*)J}%wG+Xnnp2ZOl*YtK3VQxUMfBM+z>E2 zeI`!tBDijjXYxlLEZu7t_T<~!mR0{o>6W*Ejr z6v8z^G$W!dDq*^y$WbyhI)x}-s>tdk0{-;A z91U?k6Rg*%T*U)Uv_PP_}4jhJ6|~ z)$B}m4(d`YtCBcrVbz?cQGo|NhMK(@OnGsU7OAKgUBJLh?E@OO@sfUG8M``oQbcDgDKEy^t6!AhE@HqgSG<3Q{ND7tH!G1 zQFCZgl=Ykxr~0pdq)`n2y3~Y0cvkO5i!CLTAc68-9cOMi2c29BTcg!W5=XzHR68tT zH%o4w$B?>YF0Aq0w*Q@DIf|UyjajcxO2`!Av{p;s2#z_Xfp*{$2fM>65~br|rCyhX zcrN@r4!w~3imlj-eew7qq8d&vtYnSAT9&|&Y&=~}zF5=-5at@Gr1s6~`eBk{nJh+@ z#(=xEI>c6xXU(ucS*a_!ww@WYvo?~@3dBjqAUH~h9mW5q!R#);8l%8+oJnb+-ydqv)LHQJSgY=p%{@~Fk(V6=o{<5fV>)fPWOyXSo|G?G=*~> z?z><)(Ss@lE|vU-2vhORxCM>@LEx4O{!kmzI5 zFUOuOX^BHASj%#FATqS(FnqPTp^|Sq;eg3wKvIzUJ%FNpoCY`^OPv(^>&j{V#RFzE z@3Y)bA(4m_iaS`J&gG(v^)Jth;W$iESCeCBA1#B(N63V{dggoJ%RQn}c>a@^%gazJ zI$Shg5yVpcpnJOOWY^dBUI=3iC>#a1p2NQs|b zgZHukR9HwV8Sgp{#+jN7ZB3DI6~hIHv@&% z=$?K2gzM;xC?K<9N0|-BMSk4bLI)uB*!ugfY0qP3R%y5O?&{Xfzojfbw?zj^P+_;e zRVm>&GsN)=HBH+0BHxJo&ckuL8w0=_w~q6R{ghxeMmsDh;9@n%VFE`Zx%pQglC=A4 zmJFxIgNwqP)8^b#RwBGP+eI;wi}{^pYMTtQ4h21k5DL#G?TZ4VCjrqHlXx z5GWyy1)M+9Im*H1Nb!*p1miCdMHEs>^!0KnPX60;FztLJwN}7vh;E>|7i^aSKwZPp zbmc@;Z{n(|)caxrl1Z94YDTS$mif`TC>B#m4S#$l?uReS>1@v!TRjv$vg^osFiop z3Ec1yBx|_DM8|$B+gdt2+Wo8>VSiOZMk{KxbsETEqXrMe43bz3J;k2|bk1|VfW}}N ziBRxsE0VSSOf}i%^gY0FFMldwBHt78EjW?Hs`TiH)s0WX#E(VMU>!x(pRNEl0?(%d z(09!|c3J9g+xi&)MKNr%Lz~VacC(%gKWoY@ID6_>a>(E=mVmuqrKtH5d$d}xX&NeD z5RiuBXo9`O{xL>+V-49mRc(3kT+>qNP814Xc&F=6k?M%@t6NOb@@_X`d3htI>|zGN z&z3d$7^TV;cV+eyHCzB+pyNz1atbYX3gZfiSjHB<0Ehv&M)7xxzlJu32@Iosx5?qd z-7Ka#WS9+1pr}6b%d2z-ZT+Fzpf`63fy)jTb-|y39hX-WFKTi7kn^+4(;QJI%l!pK ze2L!7r+ad0PfD2bsar6XgD>XWJxwwoHCORf9r0VEIM_qM zCzw=0@8aB8TV{tjzE5zvR&0MR>so`xq~rHSLBuI)mS!Dh1{CI~)~Nb^?^R@Gb*0A1 z=&MnM%PG*qmrKBjp8ZIYS@DFDNwe5Ww=2e65vs{7e0?Ou*xB{?A9P$i{y zM|4xJ3)%!G%8d{u-AC5&>)0?3EeMgln4Yut1`I~s-Cl*~G*Ri1k>5}JY295;&pq@- z#Lm^4Hp$Vz)X?2y^sW@;*ClyG-%gBU|LBB2+bG$zX%YcrI$cSa$$Sdz2EBDDiX$!I z{_-)%I3e)hC3KOBqNUpTOsPtReVV3GD|?sDzlEY;lsV>UYEWf_58h)t*RN0JkrGu0p9p8L{s_RPwvTR zXR9)eJN*RNMO^RZbZOXGNdieWgVSs&xvqTIv}1x>vCDtEk6_WWAVXu?Nu7sREv!;U zh%KMgdA}u72`Xz6{1nx8ud@3we5$9_>x#f2Ci}@h{1$Fh&}3CiF{d z+}gjEHbU-5+06vi&lbqcVU4dKyM_2lgko*2LU$@58M9ER0>@8%8{Q`H zM^pmfKp*!)YkLi|P(GT%H`-^=EmrEUhQ4I?ux{(gb8Cfs3Y;=$r!4-O%2yn10(6sR zU6xmo^&_$SnfCEbTemLPST3#%z3J!5Y}po{ihZicg?6_ADfUcz?o1} zmJxCzhnNT~o!=vhmRTEXGQ4OT$Zvhr5{5Midj2y-p}oGVqRFwQiNxp#2-*sjF6fsF zV6XhhsSL>wR!QmL`QcBPeEpof>)1LNkZE`AL+G5)@6qC>qR! z8+){akxki?kaFfX6i}pXp_`Xlck94~S-?9*q=QqL2z=I4B@Zvi@4?yJho3QIdNI8l z#4QKGd<)2;6Vy;X#e*x_gP*hHWyFFgqukOJH7ndQUKry!7s+}S>|FP?VT3DlK1qQQ zk=oA%rP%@u3Q)BH2;)Li&oL3#M*r$!{Ih zASM=(#VCobo1BhR#*@dO*~PX)#gN9<0l;rNRKG4|p!^Nocw@Iy>-~ZJ?0T#CqSxD+ zevj?m@H}89TT2L<6HsC#BB(?}DykVK9k*1%F~}N9y4KadeB)RvJq;@3pmQntjRuyp zd+bH2w#~~?gnNl>cBMwx5@vUCsl~4k*^~r4aR!EORAjW02r1eGW<}-vIl3BCwVUEw zh(xbpj>h?!;M4gDxV}8^il-Ur;r34S_`LeD#vXa-JKk@`B;%!=m}ILfo6GCRP-vnwGMvS1TCwL(fwPc-To}O1cyV3K?4x z{_{-2*jZ}zOd{hm(Z%1afi9LPcXUtDSf?C9Eh3I80lt-6uc=&~q`FuW) zKHDvFXfegSj8LcxD#zUuFPYuggI{ZvI5 zj|TJPpX&$cTSpufZ23uYl>m#4Uva-%N<10wTI1Mav~)-=p+fo(j6RRxz{*!Z9U-)C z9>Fg)gf&-?LrVVy@(_wx>%nb~#fWvMjZ~3snIE4PjYc%6*#^HD>*h`@M=No(8gEO?tGG;DGL! zIknN6VVIpLepd7%^9kPQ=@m~$#G`d&22uBd7N`xiP7nd~8%zL8zY7$6HJXuC?e(YU zo|ZhfFlXWkh}8`aNOTEuicNS}80_)bI`FU)e}Gw)H(>SGZcAB2IjJ%f(xjS0D3g$f zpKWvE6C}I95gE5ucsGJw!I(^u@Qq2m!}b62JC2|pO%)yPHM(i^a4hL6s!^uhSYDQ( zs6-SU+3-3w$KoVN{lR=H^hVSP#EnRfCNooS9%oP_bri+sHqLwpN!J;gB#HbCT*wP$kPMWfp>3s$!F>BG0nI}(tOBcS z`;|a~gZLF43#h#S#h9K-xNW62tdPsD6m#K0iM?V&GbYaL+Tv1R7X)gj~#SmUb78qLnlqoP^ zSe`gkIP@zojM0&GO=h@|U1Brj_A5+?CK^Vl?qgjE)=Mo|Man|gckYv`pkbSNoKK!l zI{10#kbR9{p%uRJ4wx<2MtMI>or0N#cP<&(WR_(NRzrNObQ6E4VtUzc?fH?Q`SmTe ze9vOyJ~XZ1o3+9UPw0YlgJEIwL%gBxaQO=tjEqDxu@8q>P<_RrX#GyAh7*w=e!%zM zvmm+X4>-{%3kZ>L>`>A9e(Oe^W8*8imEKjvrX~B9Z?mF4pdgAW0GcqQ8K?PWbOtli z6v1wXRcjUM?UkNSiRv~-lG&n=6 z$-Xti>!AZ`H4B7vrP6?>0{7UrywB2v>KcE_pW4LIO&E1X8z-=JL#R3C|YNnMkc!*60bMHvnH<`ilEG%{J&Fe*%+ zjTZG$y6;1$L>`qR_sp}wV!83lNr^{s08V1fY$}RtDBk_ zY{PKqIRP(E+njlJ>;-Ne9DTE9Yc-7W#!7e7F3YVtOg2yK#&M<)w#4K*c(bn^FnHGi zOO53p1ce|18`isRiPy2)Cp&cXWCMewS7U(<3?fr$6<2fP(VAkoOk?Mn;n6cy6eoEN zcTNR*-IloNR3v5#qTkK~&Q92!hff@mt5?U>fQ)(sn9?kZ zoELH=@&o-m=!`QtVP*4!Zq3MI*C)c*169O@A6{Sw1BrU77bX<7)o+B=OKOT3M_qUu z)G%1v*Dw$3!{WTWe}2o~d*W7}{itvohqK!zI4HNk!NALAmrWckmSUmNsWC3}z589I z?(Ph?T0sx*T5P5eOv%MYbRzUJ)6Kn!@@StdaavA^up>Bu#v(VH%nlM5iNgY!YUrMi ze_F{-tA~K?Z+>D_Z`ea`+x(I5S4rc!$&2G#xZi5!P+od8TU36$-U+2lUz(G)^M=`)XHCub}p+?s<^N%UM4vVLX!W z3!0^;2XT5crok6h1={vUZ6hmQ4N20z`>5mfN}W4i2ah$KgcnPPpEs_(#;Q{)27f<( z*y2iflq`qB-OJXu(8w@R=)->-a6|4bNxNMnft?20HkuCy$6$L09kd)G)W4O=9BM|{ z0njynOnyNaTVrFARb&?Wz)KO0c=aeIrmJGdj2T21U*d{=r&%WGB_fB}!Crdq%$!h6 zTYHZU91PZ_u6~E*gTy3XA#JV7W1QF6sjN;@hLE{nCX07QHTpvH15PaG$-!bfNO#d# zLz-yQ&tSY!D@K{1sPCqy(XopWKKD^Su(X0yAdtrAPbwvb;0KzwfBiTWK|Q z=@~d0^<3M_hSR&Ce?AW}16N8iRRYrnJD8B8G!k~7@GQoI<#32mT-zRtY2CpF2f(XA zMU6CkH@0EN1UN@jBxhBao0Y7;t{jc1e4a+0fB6N7b2yPo(8A@@2haBnasAf%nJCjH zql`!qJ9zbokA$A+Li$D^=r%*k928%W0a#oK{oyi-%i#({q!i0)WJ1(aFJgY*$gn{8I=(Ww04qI1{H zye0i*Mr`~uq|h*1yj(Kb6ltw^K@0am&(EmI`#hR*0ct8#{B~3BSz88+3Bzg4k81*^8%KE#*02QR*UK z2M-^JFu#z+ux)Gj9-Ypn7I{$oQ)oL1`l&|nToNk4Tamb^hRS)nuoZIEjHOtFqfhay zZUTan1jXVWhNrTYA$UlLl2*5w4DdkB`Zffs@;~cY=26uyjz?2T9bVi&2sRpcJQEc} zswq*+P- zDN^CmeDw%s_1+%}Im49+!#OjZ;j(Q*hfk#Bm}vcixtLUk-l>q@`BV7ppOrG2W#Z%& zW()~2c*wbgWlG&}uVkUND;LEy@?#C{}77N~WYzz)?Az@B@SyxF&QfwgRVOOn%0aye75&&}>S zzXc$D2{D5sKzp?kZ^aDn`*nF+3|f|e(o$M#yR)s_4THwu&3vi*JPwOBR)%9|cQ^)g z4XHCFEsKY{w1K@z=AIAvPKl3~tb_^UIhBwmBDl`00~fq=Sz&xh<>PA2hJCH!hGwUW zSgtprf2*L$jmE;I<{4F(Ggnc%YAXfr=SqhudnSKgbgU~un2Z{YIR{ZU&6?3OUcSLAaY@eW`eEgpt7 zlUlHem*R=;T?P@87+ei=K*i)c(`M7rgYp~;1v3UAroT0zo2b1J>$(E72e7wJRJ^j+ zfwa{lP}teWV2Cat(t`GRp|FvPh+q_fqDrDbm_Mgv ze11tcDh~Zxw+#nx2(x{He?+>B8}7!V`sarmVDe6{$$s5`AD)NF!*)Lkxhe86X@8YJ zUKj5XynC5Tkh`933miE2XeIrq#2DMX^k7QLZ zL|1DDSCs` zP~b8wgEc_AKuOkS68=kJJcC!LEhv(jc*PJc+JDJEZntc9XnDeon^R1KS8VypEKVS=!F?4_G(KTNE3yww1& z<<4Fsm#(W&-EE|$ep#8R2{KX@^9n+)nbR_CuKu2`y-?j&_Et#qL+_J4;tN=2WAJ?_ z>GAwa1Ld2`rz_J{-N+hUE`7D?$vACB{U+#Df4rK7HY2#|H7ad3`gquCdhAM5`64&^ zml&N+{;t8*A@sURFNd(28=x_y`ZPiZmZ*JTwE@14fXfD|h6GL5)jmGBn&D0L=Vf@m zCfsvhVa?!2*QXbkyXRHMlvIPVI=myUYfFf`Kvx;HNNg+~nfLnniq{U32A~2`%1Vz|wmTEs2e$)WSRz z)ul1TY;;WAQl)z-Kdg2cN`8In{^lIY0O)kQ^I2SoQWf~F>*MJp!pVm!TB9y-tC8z^ zo;bCQ?{j%6p6`I;Hk8t!SYr(BA&>}DrGxg2UYggV|Zk#`Og7%@FQAPviijGoxn3uBn010T08 zQ!nFZtP~|hjSMd!(1+p*Ez!^!t-}`5!O{-R&*GB$6p41JkhO#U#f{uNj#66xGL$#dz~=tSkpT%4i1 zgjkQKiEant8(H)O7-+8ZSoA)7^JvjbKP-NF5#si838FETR9 z{>F}aEty|AxCF?_9K2a!PCD&{mLIaLn~rY9PkVlT{$&jW-^9L(DZPjb!3!(?6gP

          !oRptb@n+ zj;Sj1EzP&rTH|dsUF5T#cGro6G4AR2oYP4A6C$$HZsMhb-}MgVJ|9Df9nr7lJz}vl z148Mpnh9;=>i)2Bv@-|m)b&vQU&MMd0hk@(3OOg^&bfmPD_5YKI;h1GgnmUyKMvNS z*Dl@jFEe{GgQYV82Q5l}U@Y#R&i56es!fO#KF~6>m8^j5_VYi$aL3MIurDD=iV!Y# zw)C$KqzsWw6ml!_bkB58+Pnr)j72yJ19dZ;QpeC@=Ysqc6~m1XlxJ}t=Y?#A9ovZP z4*s&io?KSB=5X_Mq0Qr!nZ-97Pc{p8>NN2hw6L1$?|*wdwE()u@GV+8cRmVu4i|nF z2YCia`{H&dzX+@+F~z3}&2HZ~A$J#(3rizQU8HeGveHLO?>XOiq=P#{F`>io&|}#} z+qQJb#$=b8bg=Ps!{v58DK!Z#EWBz+L4AD9zp%|)i>xTf3e{0+~^1&1o6#K zwr3ZRDa!hJPfU|eB7lm6qeNDi)%|oq=$rtSjhii9m6^WZH{st=9fQ#dhr52sEKcDV z){U(4C-G#*1B4TJGjp`CK?-PIECS&zl`y!FXqtN(X=qEa*gBq3^TFm}Cpj!nLubX7V)$@?A?AU0HyDi|)^#d;oP?m&OB|M4~*^s!BC_{@R=DqVy`) z^iz3jFK^wAHbnd?@;r6FdFZxmHA=CJY>9NY7`vW2a@8_3y<&DFpgBkW@T`=eFK8oO zT(y#eS}lrO`ZBfcPaK>$9u2=+_Mtg1J;2yBN4^5}D8XEx0WdGci3PQk{1UaBgCLjA8J&l$QM)18CRi~T;S54ZH(@Xo~$ZF&Js?~!|%D|ZX{Jj z*pc-L3P~#WkVf!P51DxQ^K}CDD=Y?hNA?;=vpqJIB;E8gGMv4?>|>Zb{znXRL*?)Qk_|}2j?T(SeEif3wmvZ0!0BKWR*&#M-@We+n zd!Y-D_)%BP<+!zHM-WgMA-<|E26O*5#V&wF-H?7K{bi0t!Ja@<#T11p`z7kR9bL^I zxiX|bgk@gG;U~e3#Vwfd>bW+G#e;04x)I0s4A&VgI(Fju_0T|cY>fvK^f~+n#M)-I zKA?@0B{P@33F-*DS_^ETL0XcaOIRdDW5V4B_zY`Nd?M#7>oeG!Z^6Ba-dCk{J;lsy ziiSUhyO+>s{C7)Dns`2Rf*jY`gHkmU5gRa2MLAKjTZu0mAO#oAut#vEzYF_C!?|MG zQb|RYeITrDng~^K9yR@$=Tu)pB6?55gtAr{5~EPTj*pnXeR>Z%m;6GME0_TE(4-rw zME3E8f@iqWlgt=}U9DMBcpA3%b9qbF|E~5M9NWd;*ghbr%TH)&^)5!yC%XZ`v?wJT zr0zUE{g^+XtUw(UkwXI0C z{Oks!jZS1P^C2&m%)dTuRCl66MJ9OSvo;iOkk@*49_fS4UK2sIg}$oN5`T)WV_j~$ z#*y;(_hW2|toQ1WCxQ6-vCr-?6*3i$CB?T(Iy(Uu4B{Jjn3Fs5)HYKiwn<7UMvAhM ztl~cib)k*j3wl0-&k>Du))lCI$!YL3LpY?I>g)lzF_iS&;YrENcF9RH%gj>X+UNtpO7cW z=y9bt%UHUm14b%KvB>fmkT=b_ zigd)xBgK2#{h33=bql4K;;83zkU~UB12jdN28+Nt#W^PWf(SsT=lZwNXYAXwH8p+D z2T-wD1`6V}x`JJU5)g?l{KfbY3U{K*jkF9_;!&pOj7b7b<4O5g2XbEfm_g;#Ldp;i zD-*QR?1x>UX&lEA{7w}jiYCK zu00NA=#@FmB`CEgOPGL>*m* z6L!@dqJzFD(40JE-qoB9C0HFL3|4tOJ91pPVZFhw7eu;Rz0}w$sh&XNz#XOq2TvIr zi{~9k7L7M7L#!M~crc`I6W5)r$aG3}pV7pj%;E`lEP-KW&v?w!L}n}ma35b;S~Q7u zWn6QD1W4v?bv$l;!Bx=gbOuF)QJieN_M$nWNG4939a7d{0~7Bj<(#O7(pw&_f1Hi_ z;$$f3(K$+laQ-ssV9rcZ7sUxH?h(ODxMpu8`~q0R@3V<5ZUR7N0B>X7i^k1P11+>c z0#{3cU70M%f?eOzWe+MNx@4`O6KfNE}>-%Ay*gOP`j%nlT#j2qpj#O3UrUg4^id>oy3kT*kQp^XA&x9M7QbcQ+v;w05OGe_zv}@RU3qi z$Z4ZBchBcVa$fo1DFN}YOT80bTTwDSQdcHnV+giyD-Lt zKm&qZyc%9CTM%PKoN%g{XgsPsNM}kO0}&4>JwWdya=9)5Ash~^0(uV>M^ySibGCwz z5$PN+Ml%p$>JJ^#x6tLs0KGyLupO&M$44kv!@+P4tPv-(Q) znW!s-B&%k8 zp97OXN@#wwog-#6l6D~%M86snd|3)a+4OKr(u$6rle32G24##}>NW&kj7TOs3VXJL zc4+@7K%h<|@DEF@-){fDoU^iaDFf32}t$^lA zpl+iL|J2M+g9i#^{QP|PQi<;e0S?)xbB1g1_`<>Y)*w#P&y}I!c21Uq3LcPcH;4bqI0F zG%ZQswtudr3r3w}tQ`@KXB^ZxMGFdmidyI|W43A#-3$(6N2%hin*4IsSIG5R3xLv0o-OG?OH@C^*jHSMd|)m^=k z8q!UF2K{Nd9S!5tX!S5^0(g18+nY#vy3{(tRE6@P4?zeK<>TM)kmGd_VPnQA7kRXf zk$~)TlH+gOn7m=j2vbKXB-!=9II_qaR7Fbv(Ms=PC#2#w`w#W z=rj4$Sqg431ZfI;P81F=%2aAK&1MMC_yLxuW9PMtShb@O%)R9~IY2N4HjJUXmwXHl z=J7qh5e!n|i23lJ3Aori$qjbqY+@PGGUPbj6mN#$9u42-kWv1HK)Xf*7du4zI&Ap; z+W-ZUfh=WXWVbD>z!yT90&Ktv@`?P+^ljzwm*P~Gn%)O?gB56rc2k8*yqZ4@7nX_L)j_!4bYw280A2s4z^0{)=R3vJz7Qz(N>0jX`Il$M5BbQk_^? zmb=2DwO)gQyg->t3JD)mBx;B)gI6cNIfElwxl5wF%+%+FNg$PFXf~%ubeSK6L2;*k z-ZS~l5;+l-wl6{w7Dyq}{-FV>Nn6E;24mwA6(n)DhTzooXGRi@WQFLUlc&&iO=I^T zivywJNawc^=E=0XFqsVRR01*cO<5HEij|eEmVK8g?IfsAJNmq~EgQff zwRv%UW^p&6vzpem6AVaGtc3Q>G5wiRktPK3ep>JKPbd%NiVnQsT{NC%oJLL-qJ!8- zP-h)BwRyVw&H(-~!h9FwJlK~Tt)s~GW9=N{%H zkHahpK^rHdVncAWv!My;Py*&Okv>@=Pj<^*TyrRLzrxUph})=cnGJ9$3I}j$lr?}= zz=2t)jatn_^K@B=I_NPS=#K1BtCqqQnsGNTQfmt49zY^Or3XLIkcNQ*9`Dm{tm+te zGzr-e8FMH~?kI6@V_qIbW6`2CEQp*Gn9!4LSZEWt8?F-u?T9E8^I{i=*dP+gY2|H` zMGdiKCZIJ#i3pZ4sls`onRd=e0U%n#Ca`${WrC4WU~lwxS=8N0NZz6!0k>0lr7=-Wgf`_F=oh+|pA(=&dOHWYHAe`np>Wv*)f@;~V6i<7s3mijc zZ4@C`gzXJ?yt*=6ewBc>XeQn}>W!UeP|~t^p?bStnK{#S5dlPbxd9>u#Kz1>gvttK zd3?&C7ALU8TXCu$a(pA?no^B&vR|6~ij}sirp*p(@KQZ_I24%eSY5CJm0AN|Z&CLzOTfN7OG#0F=>!FqSk3<=Di4`u1Z0Ib8selOlzIIm3id zjw-_NQX_~=kIB1OdIh4uG&6)a$uAeQ-?@5aMkFz+U%>fER>c2C))6vM$q`s74=$Kg ziBjcvbZ75zzxgoHpoIECg8=M24@g-g`GL-3<#WPqoB05WJPdl z87W0Pv(0o1vBq6^KzM1C(IlMdk&y!2xc`xZBy4 zbk(td%vXIm4b=}{q%u%bFrCz%#{%S}5bPliB~ozxLV*SG38`@jJQSBCAc+;i@e`;N zt0M8yifw!cxT+TeLU39XDrBSe#GhY&)-T|b;$R9NG^AMHI2^Lq9 zN)VG}(M5cuIe|8Czv84=B1p?kNhb&-+kCJ~Cp@^WbcRlQNgg+8V1=ctJWBX)kq0fd zAfF&H0wQim;D^RNLt*)8>Blbt34>^ZniMi^9|qnB%ES;E!kSQ!IK8Y>A1x=m76zre zZ2g#{aC_l);B}ZbGf3Y$5Pf?Ha!#0t3<5F`ED$p<#rl0e5CFtqc!!Oi7M~UH7I8~> zKcNUu8%}Z~Bb?-HK-;xoKCjL8>_&0cLO;{MS&3$vA|)_!KSn*s%ug690fdLcraD7- fD&x8tjE$WbXjs&snU8)|^B;s6yTptcKAzx$Qp3K0 literal 0 HcmV?d00001 diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 00000000..e3e2dc73 --- /dev/null +++ b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.ttf b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..67fa00bf83801d2fa568546b982c80d27f6ef74e GIT binary patch literal 41280 zcmc${2b>$#wLd<0X4JKkMs=IoY9(#guC%-Ix~!LV@5XgawLzwtVoFRi&4B<;Yzzq| z1QHw)z@da0*@PsIyqA!`6G@b6oWOe_b_$P#@)GbXG2Zd-d+unfZAkvV-{LBX3Wc;?Pswd9i3FaAXkSUrx`&zn7GF0_`M^SUUB}0?t9iO6@<@rQX4MYaNTB6W_twTb8q4L*yS58+j!vF z2j3Nh`>lc?ZQXpu)z^G$?&B8=!spQk>+PGb+PGPLztt}YU&eW%aO!9EjS$4lmWxSf0(+a;I;S#pX$!?81r zPxe(ID}q`APM!R3^`f;)g#n@JcY^fY+Km6eDgyYBYd&V!e;1`7xevutA z9r7HC9qK$ZaA-Mx@w`Ku58Zlb*I{&GuRWclsyf4l#;7ri09Ui*6RHTP@wSWT=t=8ZXH=9myY8a)#IAo_0fKca`D z*F~?2UK+h1x;}btbX|01bV+nx^t9+egvQ|i`5yx>jQlJU@$>W=|A&(_6vm%?s-YdZ z;Q!}OV(bZjm;rz1-#tQ;_`j;qrV74A>f+@?>cTDSR3S05S~a&0%~;2e-Lx)tKxMv; z>UNd2#a>sPt?jDVwrIuBoW#0#yDGI^Tpd#fmJh|%fpzVw+(uuGC*n5@{id$Gt`64? z4cEQ9t}YQ*O|3)f+%4<)iFNDnd#1Lkv(9K&&23r(y9;-Z-F4Pkb*g}$v9xK8{LsMY zA#0mgiS=dLRa;x^Cc4QF@cS`UN-jvmR5`U!6_yWe-?)84j5em!#pCPhw)4Fe#va|! zZnVx*=ZWJcj<(n@cz2v_v5abIJ!>cyo0pio;gZ-;tZ<(36Leh_-5IxzZI8{{K6gW6 zdu)4x-!7pFD~8koT#5eCZPkH|w1e-s_?>1Ptd7U)Vh6W_4EWLlv~6{zZD=1ZbGId8 z2P-#E#D*5Ftc$B`-OzS)XhC9oBDQ_O_QVEi33Z3wsXZPV1}}y|p$^c7cTxw?(8S!t zhD+9u?+Ja?*M?4Pzmv$eu#nhpQDe)8rq_KJXZ&sZgaI}%ILH=#(<7WO@OQd+HCi6q zzG5hG9$KFmtiuOO41)3lD~5_fOqg~4V3EZbKGfLxYR$%a-ctNxpiRY5&;@Vp#E_7w zkT-73wkGUcB*ievEJBCIgv|7!MHb)9YG%{FPcKR$HU&+h!zMahw3wx1(~FFb=ajgT z%qfW`HlV-tm%m7{V~3g`k(p2s3i4uku@Dj(1y#tXRXLTFRY#Vo)fv@yP&H*$Z&|fu zwHnqcbawfA;^}-y$tn4eB_4=}ENLa7Skn0dlb+x4dBA$NMe@P+tN3)UA)gG`7`p@g}ksuP_r4esa$Nz(oZ#Y*myhQ zydBZ3YRahfIn`WNYqM$~qdLmPfP*d!c&KGlGHRZ;tf8!hquH$5;L+MytLn+B9c9&> z)%sYg){s}cs-;hDSBj2Uwy&>`sF=@n=M(u{Z@xE|4FyAq?hY~0;1VryOWYj5TSU%f z`^BD|*kB}m6&MwIx%*C_4-Kj)_rGq6J%mIJM#ave| z6W_b;$tSPtXlr}!^3VTT99+%bTYl9u??3I@aP6-itZ}+F;Z~$u6l4`VD`Otmv91d} zER<(S#b#32t`d6j;d0id9}tJcA&h=ofez}MOMLIh@MGecx|6jH@5S#($3Hm!f&3l$ zJD6Q&(h@95us6di-`kyGsRm0GTk_j84vH5XTyyaJs;URwjqa+=zdhYJa8^~?^^8KtwNh&Fei-jtC-6@O7#R52HmK*O{ zb{aZAuyEO0ulKHHb62|T!ydZ}`=7qNxi+xAMLg%B;s5c3YOm_eH`jzt&r4U@9n$wC zpM7|lQe8tUd+7K(@(<((1)oqStP_e*@>*4IMh%tKx(s^5)cTCd4yu8&8t{;8P)(Qv zVE3AU;@u~S9&cl)PcOVYDiH%eQKR|9}_GlobT-NdeEVO-@<}^H#0Y+ z8Q5L)1Y^CPR4l~m!D{tOS)0XjnbmLA4_v#m^vM^Q_j}*d-(&C6IsFf%o!9CIaPl&X zg|#geFV+9@;`eX`hJ?@aA^BN(won6(WNK|j6%Gd{TZs`|W+=eeBozwtMwk^=|gMSwn`IzBM5z3t%CUFVn_xPg)&+-Z}Nm+_k}F^P&%JTTTZ;stRF1+?)Mjd z@9iZ^PjW}`nw`J<%#J^P=9j)n&CF?*>`C{+zjvK zuNOv-VW}N|3CU6jr(;`3FW{u)Z?q=6LBotNQy3JAAabkPmIDEaWZ{fDos*^;yfMJ( zfi(x~V>RAAS`5<>L~AaqQ?lA=oNs!R?p{dTU_il`#v4*K7~%2z>|@S{!3BYEIG}H) z_pxnpX#C#z?d;e^VeztYJHy`@w=?040O^T8t{05-eVK5saD{M-a1YjMP6ciHrCKltrL=JU^%w? z%G&%P`t)e)acuLg*uJ=|U3XVDtKG{fM{{8sGiF08Ye*?QAHB~$=KSRE|D)H310@=Q zQ@pWVr#!_^eBAl$=-)<^As zJhjCaXt;)F)BDM{$J2alXh-S%@f4-CE-W<2@5?O&s9@VPh1%VaGs>!k%%NCOX!q7hU38p|b zovTxd{u+j_eYEZ&L7wLVxj-V2==n%JWNx8UD3m@%8`0O%MTNo`?Y_YEs;F@G1lm<7 z6B|dFie`mXi)&WTk!DpN9@opsy47=}Th&KCR=bk0jD2*^NKaw!Rn)8<*XyrZg3!aP zBWl)*%=02T#&ty@BtHoKp$@D49Dxi+JJ#tozAjnHMJVYQMGK5M)#A~d7;9g-==9M+ zC+sLPnKY*bgA}T+PoUvsAa#550cf*+sDeG+sdP`!3k^+d=n$DPfw7($6FBsXCobH2 zl%02U>xEDJ;>?F$edpDO&Sbv{2MRQk@FosD&zkxl&zG*#jvm#nE9D>W*MI%|7F>mk znUk(EmLpgb1%W{>X`^~fr%;5k(W+UUxg1kH8C5<=T0J^pMJF6Ela21U%bLQaO&%6D zgK<3auK;7Dt%RX3F)~Ql5#33aHxvaxlcG>7)XBT$-NHQKbm2UK)a&JCbx}s`1@%^N z>dh~!^F7)U+zkubO3-P(KsMA2u>BHcpF5E2BUWhiYBd=cmfCW#yk>y{qb^eRN%8a? zI@{~jT2CW}_xYn@Fv={!P(BpIW-dEZ?48L%z4>&$7n?oZ88MY%`Bd7HPGK|A;1YEiG@Keut^O%am$rsLQ0x9U0T7rgScss@?4KCe!Dc zCnPOzoBkzKkurMPR~sJlqu6;PIcA{-F)-Vx|?r? z`d|?X$B)aZ$q&7MOasjecMHWhX;F=^_B*??Sm@K4VoSC+2X&#Y3>A}<3RfGBXENMw zg?V3lkXD^WkCwy`019a$&9s)?Cn=eC2St6RCAO;o}h)=XB2SH>r+jiH(R9}{

          PBK;&Wcg|NX{>QR@W3{K zY;bp3^^^Hp4EgCcp#a7O7KV(e2E!07sKTguG(W~^?4lZ66!OsI#=Iw^QS(LZUvY)|-*On%Um?5>WA zl?50LJ%&XEbBcfmH}zOz=!^;alP6P=Rtc7q@Q=l%gyhRfi2{4}=YdE4KV#1hzuEkL zQ`e!oCxJ!)KmnXWYrzo%_u;5NbadmMK<}VRv{vp06NK?w7^1Q$Tj1RM!76dG8csvB z!8uB~T2M}Lf-thpE(M7RjA_gX6%1j2BB6X0eI$mNZ8{a1K44Q>^W@3P_G84KehO22 zJG-|8&J9&`rg~weKrl1JkCIVq&`ucl7;DHYw@0%Zyc$6}?KFTU+2;?{&=A`cEfAzN zU!jp_g3S-`18T6M@<#h3A_2$=zd4rj5XfwaD;BKizzZu%((a@Bm!J{db@_d4*S%kS z85)uJ6H=aVdJ9w~XjG@unH$c0h>vFo<4HQ6M~DkI2t|eFJmy!hTnt8Ojt6To$AMXy z%Ec-Z9jL;jXKDjiV*u!Qj44=K))MH9htwFwi|JpZJZ~{M?9ff()c#tpX0uYaf>A6l zaV{Qgbe)MnbW#laMf4`G#PjHlIUp%<3ly2&o*d>RpmOTnmY2VHufF-SoA1<)E?~R( z=WgS$I7Euy4Rm(-QH_=+`sBw1ta=csoM*|uG8xBOE~wUwTAd@51j zuy`QZW4sK^2*CTH5tN8z;Mj{$CxYdT<=Hw1#U3GNO1s#SIAVG`KswTTkWM*}C5vDY4%wW!qp-T+P zjiH`H`Pj08wXN8~6_I0Gp}9bcbE~-^4mD3Jt=O_gbB3QV zH@0hfXH~q;wCr?tu*vs1?)CViBPBqx&5q{6GO8C#^wH0-chR_FWDrbUXgQ%zxOyH_!jd8*jbwmGetZ z>mI90oWQ{QRn`etwI7z}UM6U%>aS8Ge=hn7*WU)BCt>J`RFVl82?Fd<+Sqyf4cQeRYe?3g$5AO038R??pu*~f{I-;y@--*Usl#4Re< zL0XHkkYPBDUr**?V_4F#Mn-@8g*jJTGHZ?Tt9?CpKKr#hdN1F8-^loVTRu^_1Pm+j5TO#%nF7n|JOqvwP95V~0xY6*TP0JMx!rzqf3C;CtWMZ5^~0 zfB$CDI*O00kSYqexd!cwb5wk$FblTdB4HV028U~%vtf*Q%f;rdIV3Y`GsSf4V#7cw zCfk?Lv4)H$nsHSE3V9aY)Liqi7Y81?fbh=cWVC3e2(E;^A(2-yY~Y<$WZLA)Y7gE$ zT8E=mZQ+p1K(^Syah8q-KrYPTrn>-c$%9<8=VNnP74)pTvUR)I5b;omxX3DD3l3;dW|5Dauo)5oQzd4%ke=n%?~M z83VJpFzJdbi5`Mmay@YZ(+%OsARvLo1SC=ifx8=s3|(X#g#d^XKyO?vL1Z#q?Zb;5 zA-fy+dO>$`EsG3s{LwJd8U9DwWodXXebC_2=_AG&D82jX5Lrq30g|WU3-n9;qCyE< z1?eqPcW{p*(2a2s325o|LSc9|Aw45lHu+UfTu(L|)=yFP*VE`$m9;=Po8=Y}R!}aM z;WRW529hmKs7+7^%Bl}03PuiYIM^lC*n;I+XCVHGG6`wTL(U9~xvx*FgS6)E49qQ% zC;{JnAPtIzXtlv-0G~aTPufS%E41M&N2w&e_2F_XBhp*Ps!L~{dD73yyf)TNi=pdT zNP@zwBc%)LA(R5GyG`y`07Vhif3$W;Z9geJw zgy{`K@NafEbUml^`&HpcBusC(FOTyw{RZ@<`_@2y18KsYLzqEybJdUOVAyuJKY9E# zy8nLMKS(N6XIC9}f=p~dGDqksgTh&9$ghkW;;y0tOrSfn>_uvl!!@Z%D(&MWjXlLx z7&NiNe`EN*;PWEA7v?n9Fnd|GPcWzL5Jg4N0^J9*27q z7YoDQg7}`yo;_9#7Azd&p?6FG5Qp_rgBBy82SCT5LYo66_9A;R95{9;5N0pvbL5-- zkqE^(jjVfQ!-e3bgNHXsw1b5N%MmuCoqMP$v;wgoMTy5;j9QS;YtRL7CxS8nfe{!6 zYy=iEL9Hy%fV~2X0 z#O3|xh#tG%Z}*6UDbZ(VN9;Z^B|7ZGd+js^n6tA>CGoYbTiF@3mVJ2J=j|?+o!-zl z880I~AS@(>cJRd&JQ@M$a&ty)hnfb@Dh49Udl4-cqa2@%X3*EDM@yqOtz|8Tu0$~m zYE7Tknnsu6jma2wNo#M$UbG=W7NHtfw2m$aG@p0Bqoy_kFC!^NMs$OLQFh2!z+Ix7 zM>z-tp#eb?{XvR;XdvZpTC?;Pp)|W?cP_uOrPRD)YKOzQ8=6vKS83O-lDU7Vzki5< zI&>8&P1d?OJ+0UY_@_0)6vj2XSd1>}KL?^m6nZ%CJqw$-0WX955Z4na7eyyYccvyX z2oy84(4K}4Hj~9e7zP9&q!4U^wJrfm(Z$@1`9i)Pc3E?Oqwg$s=L%125BqXMlQ&{E z>$jY(Us+x6Y;n8Ureeo6gTdamKflqw7Liabz7AKF^yV>dXPvVae))f8uY5-TK6nmu zLi#@DYYY})m#|SN#)#+QW#bcJM;M=$vf9P1p(+nJjE@pf*Lay0t2mY|j1H`cWbB{< zX62)l?7%1mF)+<>Y}EIuEedwkE&~6dBlb|JM0baj?lBR1Nh1-F@yQZtvKvTG?J+hI z&{0KOurbPhb=|i^@dk$zgzj$L^7yjSm)G5T(>afPdhw-uA6jS0HA&OzL*Xj7Wgb&M zlRrD(WVJ}n+-Y0puDW+gX~U{BZY$ilWW@%sA>;t&rE~??y=UgvhIy`es<9(OlyR{j0uR*$h-@{gKz7%1**%k? zlOYRapLB|@$Dc5IS1`Kn&y01wBjCvqRq&F2I@d%%3V$1Q2;S z`7-d2?uP^NVzR_O+)wXPjNWMt!S-8xyPDp`A$lL)3)O{|74C5YGP5#~nRMds7vZ5&8wZ(r^v{u0f2-j0|9Z zip8kJTaaIQyx-V2iuPB)t&iCs->brSvZGsL<3W8K8wA7Ug?@;aj&AC2jc$%R`qBL| zdSvwOCdpe&d%pIK&4rQpkrkD3LrejN4lxDjC1MIN zbgOuL!KFODppd1J+?pdF&NUDdw~~%f^u#*JCbB^gHccU`=Qh4}PL3Uz9NF=4`(x0F z!4s2d^>O=SPR@_sBD`gcXa1h;e}L-8c74pSj2ky(lN<+{$Yqronrf}kB1{D$72{Sr zg21pec7W=O5Y$8JI+^Eu1%a_gQk46_CW(W;L$pl@_}KW$rQ}4Z&r>0#QMlBVns7F0E8Zllg+cxU*K5-Sf8k)>cByD zR+)FVvn&69**9`M`(WL{B4+Zf|eCMz5v#4M2e_>(&f1matzv>$xLYm+}2ysk)hGhn7C0 z(gTPkq8vJcwj0s41jbqohgBWoUbHHi+8U;|T7+t@X8;ywxom{_xz^qxr&GjB+{7?{ z?)snKaO2OeU$Eex`ugk*=bwFb>&zD)xMb4<4;6Q*3Y|V%e7a3;!|_hJy@6~o6q^?%_}agJ3LmN6ZCOp;R)DbTxD_!`^<3T^{|m{t6j{>eFWHUZf zm^jAN4w)_Frm6I$XQV5vUy8DTjRhK9CUnLm-m&`L$(?y3a^Z#NM#AhO{Xt9h{8?*e z^%*@{9vd3z(Stqc5R0b}Wx?3b;V$q0wde}vW?eScuf6D37=90||J(*bzj%*0#>V?H z=Jx0K8Tas8B2mIGC}KU1@v@<#`+~6f>6ol&u{eSF72$P?(XxpM!b9KMW(*efuT1XT z8dfLf@77nq#YUqP(nh*8r}Q=I(+>R)bpG_uk`0L$)=UkOZjMm&65nC&!Fq&!W5aTZ zcq>1=B5*_zBuv5hn#YexXy!64NHIZGAxJb)(FDv#0PQS*H3Cr^_^>gcu0V`%0IMLy zE3x$VIT~8}zWy5U&60Q~YkJu@^0NMG{lLqJ@4%HW6O9e~_IA+N2Pzw0K?h<+AR-Lf zqCJHCVQm}rU?7eIF)rlQz#;T}S| zkDDU0&~e-a63FN^N1Ke`+yL%j{4?%Uxe?v!#GC0gl^a%%-joSNhi=Hx(eq+U;+S&`Fa@@1PE$UPzM*eQ7r>_r@;&9^T|8jHMYXl7SkT z#`hU~qhNt%N5t;oAIpoW!<3=I-ZFS}+!*19z=J>_5q4xuktJ1&?ts^Gq?H}xCMWxbjzPlxD9Qk_L>0cH`(Z+GzVq^oEQf(Ocfzf3 zl6xVHWb97-J`?UiV^o0OOO>0rPUEfUG^EgwDnsl%$$mrV$^zP~Z z#$5T9V3GbNe~riJGKAiyza=jJi~b1P@E39Iu=*Fa0bA5J&+%W#E97g)nn~JNo`oy{ z9Aq2xNB$~K53phNMSkhAfCbt0{@yiFB-)gTmsV4PVs3&S0q9$Ks$mZp(2I6rax6k$S}jQBXCO;9WV$4Id%HV>U6FP06B+x-ED9c3}wu1qy@_{Yz3EU8f7CQ}8fUNcbR4E(RO5=;LRnx%r@Mm`?QTUg1HYU^S40y) zeeE|*g(uehGat~j*M|NAxqDi#LF4-sfg4U49oeo#ClF8fN zP@m|U-Bp)8eNO5wta21vH;!M$8qw^uTTBw-i#gC)&9mpp#UG zqN%=_@C`&|TOw(~H@Yy6KBy4;8WJ5DK73y6A*M_dC@d%3r!u7&X=>)ShtiWn`~@5t z5ix`gxR?cATtL`4sN*==n}>fEyEuqbxxn|McYeCmyJeI2M?b20eqHG^cSY7$U$Llk zfA=e;nvDxfi!QJJIefP_-CtWO`ImokPU(WZ@t0nzd*G%8msS7dC!Jp^Exe@q$3F^P zI=^J_>-bpD=vd5GC2r0Lr8h!5AzEl&li^1(Q#|I&Po9548x4-*aRC!KaWu+rT-3v< zLcbQ=dFN##|2d0|#&wPl-~6|cOK>fpbL0C^b3z}+ho@HhK#{0peK6wI#`<75H^)na zu|7atu~W5v(~h-2-l;!+%7*KS9c#-w^(Rhfb6us)V0^GYF}{%;YOFXEuL!#Hie*!VMmqEGUdkz?-?<3F`puEwF^~KXmeY~n!P2F|69iS2 zekIN>VohjEi$2q68Bc%4?+C)ba@`v6Ne_%^YPw4@&%OIU9;W`EtA2G`>GoHjxzNho zMlZz1*`F9MYs`pmQ4DR7sjiIXuIP9nhJQZ1lz8YimfESme%sqSS?V@@Gb+MV4oEgS zf?de21|cEuly`zIXbBA6xB^>O;lI+r(sYsj8ryptOYhWQyG_Lree*W`HL-_&EWJa2 zZ5t%B5mWgfbT-O8UBc8-Z!+zF*_u-cy!@&^T?ofd-v&S6{ieKMbjhfdVCfC!dz0YTeul6S!&fa^ zer>Z#fhirCi#LAZ?zb*#TX@lxpSzRJ*dE2Hs+EI#Q!~%Kbye1HGlgq%SI1&6 zVfr$}6FBAB@_zs;Ng#@C0oP*Zl+`&NZ90ZxAzstxfPJR+LP>*A^CLw+6f_zeVL<4h z%S4b|m+zPJy<$2T3Z~)n74y(=B9cqCm}#3`VY1Dg8y%cFrO6$0`IoIxOwpj-=9VO@ ztELg9A2!VzaHk&oYA}$V=k_jJY06c#T)42qEjnc@V-8QPH#Ie6adppR-x`cexurc| zPxjA<48EIQzPAux(B|{U+##!j$!353j9Hh@dYY}gtZnrpCX}G~)NA)!qZeHE#7gJ1 zy6(EBP>n~ncPv>G>$n^u=lJ)9o8))p98j>Ch+Uf{P=pNMft$_1P^~FPmF$uAO|~A$NM^was_1 ze0XYKq)Yu@wc~<2x-Pyrx!C6yhnnn7YgetGm&wdqziKUZChyzV&p2mFYg6v5X&1TJ zg5;d3H4E2K%KPdCYp>oq>*DJ5jg2%-K??!2P=Q5KM8j#qmxZF6W-3{tgBgkjReNi{ zJ>x(B^EX1E)vmfbT&nZCCe6kE=2EM^i}>z+4!6_Sy3fPkYxsLDe{baPNqR5hER~W; zm|>tHUK%md$oN9qW1s5i6P|ZCt2{NejmeJ69~-dakjp*cU`K~KP|LuJL~9D4&ang$ zIPWF0RtP*3G6JC=xB?kq`G`mZB99V${*39#&*?9JF1h0It1eF4ANs}f$xZigqGm#o zscsi*N(I|94V}IW+t8Yxbz4VOZLKAF#>UT%kz3jM;qrR|8!xU++Bw{-!2p_onm6Fp-Xb3Bu9Kb9%gx6GDo^8fi4y zLY6et=YUcNDC>&4q{)@63k=`vpW+|B`M=nA*mv|N$l)`4_Pm%JYcRz=JXjEaIoyt5 zH)PR3dnS=f@mc|_gDS>xzCgjF6dc`>QIlNGLa}jVi$NYG8LUPWL^4QG5R{{;wSv=w z2n*1{5wgi_5o`vNWY3V#H&5sT;T$Z&D5p4`RCsQ2h9xX!s==I`1f`xP(Kb*SxQ zN2Wpz<|LIBLexGyi#{H7W98)~s4&ZjaYmXOG*K+|4rQOE%FFX8Jh0MWV|R8T6d%|q zp`_q4nEHr*4jKDcAcy`+VHuAM@714T(hWPF)1ML_-*LkubnveLPKRD51ob6S*>2dm zfB62LHyQ_s-)M{|X2T0z)TpikG{i~H>2WC2ME4j&uuN(sT5R}f{bz_*V!J3H%!r>S zZk|Ro088`nPlB7G1+o7L}Y=BVO;jg9^4^pcHV{O%VwE=gCLp_f8W7KchluZ*2l<8b)v6HRR$)r$3K zsb$5@mt46#ms@`2B{#2NYlyP+BJ#20zZ1SGUnIRjT9bq{_B@OHo~>saemDHj?4jQi zT=si$7SVdH@VfkCnQK>Y6hN<>E6x@Nf2Tj9?~%g8-w|j1oI+2QQY`DNA63>7PL4(4JfOX|%*2>y`#BTc)D*1fwSL`O* zZ!IBiv`+scFGU0d9kr?c2sZ%Kd9)F*zKnD`XhCy@Vgrp=O-^kC?LEju;L*Y4d;v}c zHX+#r6{+!{3ez4Ti%0;Y>;ouETBsgvYv-eqLUE}$6ePk~31yXBVk_e-Djy-NtTUh! zVtJ*@;9g35O>X4W-kLJiDd!L}-1~}Xjd-KsmN25OTEba^VZ~7A@SU-Clk`-z*Y~Ir z!0}@<<*Fc`y; z50@i3geSZnq2yKRb|azH_-)K0#Q#!`hzDb3Al8`Z$a;jukBC&Flae7u9v4f1>_Qk8 zWA})I8!63k+?|e9Q*PPF)FPmPu@3OqHjIxAnh(#7<&~XaO2D*54JQMZlabJf34ts| z&ICDp?d6wQ3u}4#W&I#=IPor|g~7l0*$nK_ZTQW4o?S%ts6E3=LTRJnWZYd7Ckce$ z_R*ifPw^ksfA!K!L}DTcU%%XtdX!%Pf31_as22Df4|YL{5-1Mt@#8LV?bVH7cSwsM z*%0N$)S`&^gH+Dr%jE1agQ%)dRo7S zi|v9jWROy9wfOsBx;-@9$iwK-WC`&gMy##_vMLX&hgVgDR|hrM%pR=;ZOihsX{`m0 zMa_w@I#Of6vi)c#5)d_lx?HjrN_Ez+txl8@Ao+L*1WkzEb7!BSv|qtK`AvPCk9?C7zt zm-Kg>4ptvvr|Z9yR&ck(*YPc~hZlnW7l1!nQSGRwl0}4M3q-U=b0kx%v&Ci}Q{9}T zytwX+QF^F3hhDWIf*4|yTq1eoGv(pIrb%lt2Vgk(LZbjEW-A$TrU)6H=7xoJe(xt{ zx^GzNHGBQ%`0>8-2KUS@iodSbYmF2xd1Tp5f1NtjTg#qsPMJH!(RnF5ClG#y&0BJ_ zKjy0q_!^n-mL>YPoERrJ}@HYGXmgax&nlYmbhyp{dNo3 zAK-5MLkdvfPfHKAKlD)hp{0M`zyHr8+ke`}zJo)5+P9CNez@)M(m(Cr|EHyg+mNnI zYc!2HmifJCX8 zEEhm2LMf3Z=Vf8WR`=14{{x)g!Qk0xTV#6j7}4-7bu#hkr#i1wTB38ASx_d?BdDvT|Cv($dQ}e z_jca*Vml8TZl4b6LP>J%==^@CQs<|PAwjEaM3)nNYO|tN_i27$8O6}_(>S`E2Z}+y z{*>i$*Z|2-n(N#@@_4--J>_)@TxP%Z*5f)H(khK7Zm7zc#*d#G@PI^A%v zq#&91Tb%WBGpAjcXqTd>W5Ac1GzGL{Y2vERE)hb|WRL>13z<;nu2Nkh4JQi1-yy@} zc_nF~L^q4e)BmEUx@ z9X1dQS|A+fpfF7{2^sIuSxqijEWL;coF^3XG}oqJPEE_G0bmML&#c%SAiJx1D#(+= z0T1b=RL_ramu7OZc!9ZSE+kzdt_uRB4#}Y-{_k`W>_M?8=@j5EGh|s1h|+Y*4(O#x z6%3gaOPq4ZHt?p4RaK8R1@vc@?pl1kJL%dSJagsq!5X9G*(`Nxoo=%NP5r5Uzu6ak z+``rnX)alH`KHzSFIG8O)#X9Qn)|#}qcmbAg3^9Sgw$V0e0!|c0?{m(l6X+P?1NfvW;@SFFc>kFd6%d41Ub*|j8>e9|YV-*{2u+h0(4w($QcifKyoLxB9QCXMrgQiF=7vW{eSGiiVM!6{ z6T45pTwHy_Z}yzKM}LPL*zi^RnEjO(S&Fs1RPmubg*JJx>P@LwW|)EqxS=*-A|uoW zH7qEULGuHVq1sbH1r=-+66DBICqIV5v(%}oBvt$n3C@Ox4=uWW{GCheK57z>ecmA6 zV532g>94=|3h8wdY1Ch#k%E>OsnACB9a(CX=sSgsStne=WTlzlu2yZR7X&g9OYl~W z&D=?v1aH#WUfn*>e1{UcW zIL39L@k5E=2dYPLk|vT@1qSxyfqaY#{Epa%@+g0K5Y6*>;R~oBZ&=!Z(U)b^&t#bT z5Vv{_5jzAbVq_o2gz}T6i-8?d23#(a4?cnE3s+xv`yF?G4kA~z1J$f*NOev-}lMFTj~RP~}vfT;+LWIQ6D!#^cJg zIgN6r<`iMgxQ~k_e?FMSn?D%nkn%ZB((CywpfHYi_WaFSXKrB5V70Y+Rj|J=Z0(R* z+Re;#(I+Ae3CYz_<(jM5X2d!?S&s}rN*1j(wIQF+VfL7t>dek2m&+&1N!et#R0qu- zYt$RE*_#tHoeo>H*XgiiR=9m$cWZ6G)jh)<=$9nqEOjwSs+H`D!)s}IL!eMxu(76d}Ac2|qP#^&`&Hb*EOh*{F6D#;`_CW1~$a(c~n25MQ-Zb!({aOIWG zMvL94$knTvXqKJl()t8TQxM^&xC4<Z*{)9zOH75B7y#I+k=={;-X_P1_+_N=*?;io+w;OJ1Vh4qkqPjg=tRY)al z4mBoFSE9SD=DBqYCu(Pz41G)|=$BJaX#jvE=05yCJqNX}KAw}nYg!h2xb@aU)*IEj zB%csw{AAPZ<1z|>qsA$mhP+whjk;59!wN<88~6Mmck>5hhTgYMwh3GlKp^s{NrvE! zV^k8)*fR39DlS!Ipd$I%u&V`4pgL2OMn;PhiVq+a7J0A77D~74kCx=cKoqGW5EX#I z-ep22d?&WPkzyb01V2c-29718EjeO;7-w7xG4#60)2r z`z=AIs;LU0n5A`B&|Fw?)hHTeKq;h!8dx0+Q!?Gcq@o5WH$9+$ma;mnnT%tCGNv^n zkCPA$5RU(G!^^rLR&H} z*b8yumBjTpQrJ;xBW0NS{bjY^!~G`n%lq>4XIbI(*TJhqKP-iWPElO}yNj3A z(E1^Lwf5=IfATOLp0l}qa>j@{icp}nMQ|!4lWUZHE$!3$X|u@)!ch~7mO(*+&aP@U zR-tRG%1@AE_lUl3=;e3jM3}MM-F0X9Z5^j2^cyX6*!6y2s4nI9G!Fl!dqMsT zo5|hTn5y=(v$|(&>a7W#yTxib^VqOuj%b=SMe$s)Y|hF}XEe>z1$OYCm-Y?Rd%9X$ z+vr!%%dAzzctXF%GK+m8=m|BZ=@$oQCi({&8w2!v`5sw$=)8?*{_VJ6na+;S+JE-i zPc_E#)%Y>`6CsOxKKR zaZnY^tD5-2PsSIAqbN@SWP!6cjaArB%XlyZ(-xJQV7bCS&q=%drQ7d0@4|a-doi(g z*1VV2E1uS?<_^xAwKnnOjQ)Y(*&9||=^U8VzrJtb)Gb%#=1)Ig@_h28+irX5lO1PV zI&bd3d@>Z8dfVL7=FYqHjE=fBr}YQVxZgR1(`PA2!pKtW9@A&)jwemls zPF4=+jvo!d7&Bh<9-)k=fRAyunE43^6@;KdJpq_Zl~8Cb5r#RqWA>S653;(!!5vn| z#Rv2o|L0t9M>s!tU~q@UdGP^u2lg|Oa3VjrWAN;A2lPJ>Q-8e0y+*%}U?- z-*dg~Q}TmMJ{#Y%^KY$Jx^m&fC9OCzIH><|fZ8kZJZh>PNEKAV6bH{etq?r0su6Yv zM27McAdWCH*!LP$Uw8!#E^0Eo{7W5z6N_dOoIRuv16SbX+(xWo)LDpoE1CJF=@&fw zuD}j#NZ>M5a`F+9gY=0{o7OHg`^1jHrJ4B9wq=FXoE6hsrAMs2 z3kMpeFV8m>A1Zu)byLk=kJ93=x5zUV{Q1eD6---lzMCy$W*3U04&~3fbCzZ4GTGNQ z^Wwqzi>map%i?RBzOnz)Pdb(?Rn|6b5+mWZ>VVk-K*DRCHr(pHV_+U0fq=0r2p347 zLrnE7VTVAN7wiV8C=u>WM2UGHe;|mDKM=&{s?Zc}qCQ@OzA;;@=G70YBXAg7IR0g! zdKyTZN01chB1Fk*IFt5?QwC>|&~+=%Iij(at{m;SylNY0+kz!cYbWDUP_#BIa-<36 zh+d#2mnz7or{WTTiy=`c1T%GIsm!(@mzsRQ7gsSuAfF0rDwoYdw%5-$) zYp1O_r)j8oZTF)3aG`xpy=i z!Wf~#8(bv7Y(T?paY2HMR!0TqfmJwave|uJPXL+= zGUae1Z<#7>01QUQ%zdg=!I}W0my}vO3!_Q_PK5zAY;iw*C zohlD;OcH$sS%AAhasq&EIP`_6wq9=2aqGh&9$sNZCZkDtHF(7`g?{ zCQGZr-NefnGhMX`&@q&#^MjIqcu)iZhNtcW+Jx4_SB*$+FR!odrScx=lnZMk z`rsh!YM+mf4h2Q?CoZ86U}EZn!daO2!G|h7W@5TuDnLpQ{zS#t!_CMq&lG)zATyMnU8-xDl+#rz&r|`(V-H@X?Y4CZ)2I zys9li;xI@-NMHVd6wQH&wGX5>vRFn4jv2+>r~ES)7!fB(IHHyr<-52QTOm4mlEz;D z-`eXyd)>Uf5HJuvcD_#7z0_WN@MGGGif7~6JlbAr6R1ipKEk&Q9vN#YHJj)QNeD(+ z4Bt4#!nTa%?gCRFV+>{h$5x4Z$ruBAh`4yDC=(-2;9D7q531ykQ9|RR@4fpKN;f6X zJd#h1%tgZ89(&t3@%CwS)Hr9@lt49X0 z7DMjr$G6be&fa^J+Cn+8UwL;zBTHe^m3NJd+3_vaokx!n*$ltm2<`si_VNT@ zqrGVQ$G10BN9nwyEt=5Y0_w2x*1q>B5qx}W3+Tv_|J%0y!?cY{)Yg%4p4e7)gg4e8 zJa}a07!!bBml!;WTGflJlh6~AEpQ3AcHa4E@}@Ev7|o=zzC-d&a9+NW4xL08ie&h`Aa~I z5b*~+T_@y##U@O>-h40O`Wm2X z2^RBf))4D>$YiqFY%Zq*Ri|7wYe@ek`+_K1Y&N%DenJ0Wkw>)n^o9O_!|JXQFGlJ- zLt!_k+iCNdf2sd`jgR<|&t*=xYRqL+lLLctHO5Lg*_3L87!SmCKrB*dhcUIGPtk8@t`e8gva8;$9z=*K^)S_Vk-9~LQM9dJt2mhw#fJydT zbxkB1Yb31~`auGO4g$D&&T0er%#YS89Bms-iBDT#HxTMZeL&Pin&K6cJZqpbo0i@% zl2QHemW2i6#v{G*es<)3{Yir*&RcNf=SCRxhNW*mW@Bsa*PZw4k6=!X&&R0~&fqy- z=m%I6!EjiSNPRaoEYX_Ly3#z?1@6e_kzMI>19nEwP)r<{)$<6!N5rmj zVwUAdjt-o*yhPjy`7V{p@S&^rTy@o+$@wm$#o=`?oxWe4|G3Nhvzl@;WOgS z8vc++*v&}dvqE3sPp9(|fE?s20i0L}45L|P6JZxC6zt=2$kh(dv1&xszDS{sR4tQ= z%ew9QyHbp*5)+%CLKX4th#Vccf9s_CGcwvg_U6c@!9Sj#K6-aJe^^?d#Zc{TCI^>3L)$eK#};^5lU8(CAQC6Ma{B-xcb+k*q$x?=V9rbiGSl^#y(I zZt;$BH~*ggQ*qTp`rHSGr)Dd$SfpdxIA&Xom>`4lK;Ga$q`PC%207V-{MJFbbp<0B zB|9oTq@|<}fi|J>4cKsC!)EbY($V`5+|Pb8)&}X{&wF(Pf(^xg`cItEt4`LA5h_e> z2O?uZg^y_pB7gugJH|C->w)uLmFRANW2Em@_&_Wi*l>WojrM)+UGZBV{)vwVJx>tN zAx)TO<>a;|>~A7UmLxRu4QvLNSxduFx|#T-l;op*^#VJu8p*t;in;O~6BB zgF{MEDxDjlWkp*MH4@13G(-xxE*Ik2>7=bUq^RHFz)^5~DdOKfJR9-Mu!IY{rMLVM zE(DK#9i3{NS>gX zAp(nzkWt`eT%!WW?&VENB9|}3s5EY+Vfs7Q-K>9#S~lm#>)3`H_2l94Eqq;n_qtoq zKn*9?--v*XCoAy>!1+xs(2}0pmjFdaYGW9UL3-3As#wyPl@*%!;Bny22k>d785cf@ zbhYOz1S&lFD9o#Q8jc*kK%$I3rWQSt%9-ULU@es>@j)Ovv6^c{V2vNLV|g4$ zXL=wf^|IoHCNp$|&YN{7?;a!$6zOR_q5{Bq<-UsgOM?B`Z!MU8y zj`jliV55DYnh1*_*N9Ul=MGS0333MFpb}N#`*69e8WjX#fgk0u!zl{xN5w!d|3UJB zB4SehI`l!Z0gcMow~?np3)TXg5E1%O4|@+Onhwc)6+xC z7FJ=ELh(_N9+Z^lW==8H^Uv41Iqd*an* zlYTYr$}6HiQMbY6R`@AVrtgcT|ra4gKTFlLn zVAm!Jb~VSyD#GKBNO|K=J3_)qLx)5&Zzfsk+;K{)AZYEqU=+2r&`sR@%Q=BQbUEh*&PMN|?wt!2zE?C3FDLAZeVcSO!AG?bVgX{2D zv5~70fgOXL+=2M}A}T8LBD2t22{Y%ZK3+e;K$(nD_{dB3fMltLYW$C=)MGVP5L1^+ zQoZI;8$KQi;DI)Afd4&7)cYmxFSOGGaQR|#T?}1jZ2>{2hDDF@Kmum^Vt$MiD&uOy zph4Z^^YnwbvSRY@DxG&;sW3eED|dVac8o{x$dAa6peKSCP;ldiOmCF1YZ%8FBWg zx5IUpOIEgQJhpR-(&c~AXI361(s8?l^8u}InM!>nh-LVJDQ@qyj5bK?m=kKR7Q^$& z)Fx$LsyREriAJFbdAO7MB|J|DwV*2bQKZv@k>L_!Ggxmdgy1!}rVzf?A*1Yr>}CN3 zB#Ob*ip?uhsD8pOb3xpExZfWM`+w*U?_m8q_=dT*u=Vwu&wBh5g_&(OTlRoI=VFB%wwdS<0=0LouDekb3&R@zi zs2TOYQ||Y;%Ds42M?6jCY~jloeJP;;J-y?&^o^S!BSxyu<9R?d?EDX|{tD&*cmJqt zCHu*ECb}P9eynULRZD0xP&&Slas7bi(8xpZ#!B4eFmWgVA)tUs5KTZCLi_`91$>8d z9v;F#pOoi7pTo0hJWcd0Dc%Osn4|pJz4I$rjiEP_-Ge}sQLKji@j#9c;;Si?KkX01 z5=|{!wgM-`er+t(L{X}U*dJAE4ZDq8ZAd;&AU_$3Rv=-5s3ol12LV@5w~8-NzUA=j zttzja#2KDyQGsqmNbIvCbcOE3J7sI^HG~+6;xJ=;;NcJ(4GkQ603k*(Zz;9_cc9geb$EMrfZuz#kq7AcODK)>DIO4|cL z{v4!JwB4it20Uqt(WVodsz17$4)3N?f0O0`)f`I$128a4%mWyX@CzlfRH8A-AN5l~ z1R(ZC+fMV;i1?@6tT<}Ud&mt$_yL~VP?<% z+}oGh29Ig;wr!~shk*M*R&86eX4@(%nKgNiCwRW=Xx}P5LEh_VPbzIi_S)zik0YFd z^rw+I-jHhg2rim1$LTSKm=h=Ii@`(S`FjiGJpj=C5i^|dZ`6_rDyl;ri^DVhcO9nF+`LLxhAJT@1m+zLeY z0h>b<2zo@Y$|ypIb#oMcOfCn5)R7)849424EK9m(yLIYAoY6@u{RUf?;(p=x9tP@vctQN~Bnjo_K^ z5r()@gjJp!RHq1!tDzN~l%m3^N%I9VSd2gDpU2-n{;>R_d>U4gm~a)3a03SJ^{7=8 zsRBnLWqE^CkY$FMMTK;YdS&op6Ziwh*JQ+c7Xu-x*RMrLRrSI^(Hw9*Xl`^+;14?8 zC)karE>|h2*$^;m@ZQ5eXCb}=Mw;U9Bdx$F(L>(=X@eDb=EwzlUk z|NO7T!PRUk`iSv=Z~6ae?P`Ofy3X)@*98F)Q4tXo*AGDD!+rOA0f{J5gTzwXM6lK% zB7zDS!4DdnrY5n}8f(?0CK^qnX%nj!t+B*9Hcf2DwvOo}*0lNPbexRikBsd&X{Y04 zpwGGYS;fSD{K)Q}ecyBLInQ~|-RIuD_uO;dv)26Q9KCTQW$A`@o*9#zva0VXlVYx1 zZnw?!`Ddd?2HpDEm(7w+#(&i~I2kxGJkzWXgRU9djznBB+k?mknBfebfE5X{Uv@3& zy3-6CappF{*s;H_HS@W~jYmIYiTTfP*0QN~x8nZ70>KC4LKk!5#g9%|@tYenS%TZL zz8ig4;uf3l+66*~-Fxw$gAr%xqs`0|JU+pso4nyrFy<%EZUct4 znC^TGRmWb9?}|=$w^T(6Of5yBs+L4w$-{M-yOwkwbfqL#wYbg%Ye%J~SG8pKT`VjV zUv^7X#&}QDj75*d*FAKw(>=`XYB6mvq5Q@E8`~ZnR{9TXJnqKvdNVl@^LicGU);Yh z?gPxiF<#{DdmCsd7njlhxcyz+_jcR|Hj*h4dmWHoYl=Y|5HP#ZiMzI$lK43(1$WC* ziK2gIIEc78&gVMPY(rU7-X75G?!hQM8w;MI9Zb_tHyQzX`g@&lN8K?y#v#v2<~8|Q z#>#Zc8jrGeJ#Jv^gKo;1G{kM)$bsczcE#}TCS#cBCAwu(5ISr%-ZcAPft)a4+W?II zy+}9ZV`;k?UpF8vwk?L=jcrDc1#UO3}Nd`0|~!PSF%2473qo#;)hPu!i9lvI(_opgQ314DKUxtd&-+%t6S(Dg$Prxd5u zr)*7mf7qW=t5dsEFAq-{o;!T^h_n&)Bi0Cz(~5n=(&jUe5e5D=o{LH9u=h)~T$&W_>(1W$dD{hsItX=NtEW zc53$4?2pD*j(>jqYvZqY;yu$mm7X@w4$qAVD<_$T2?zOy>yp?$ur$nYSPU)Q*ntEwk+q94JoAXcP-z=yo*i(46@M=+0 z(axfq(~G?s-cy>ZkLX*z1YfVe-oGP|8F(S+4mJhPhSEceLnp&Y;rj5A@F$U)$jN9% zv^M&5^ipv~@si>##g|J8N;*saQaZD=x%B-R6*FEcOD&sQcBbt5J>Gkso#~ocKl5by z#PaU)zt7q{>tD0GXaBRJw4%OZzkT+457(5oj~MVo5a6gm;NSqisd){vPV*c$()gsn z6_>d2*w9*un4=4xl5e8!Lci@H>VwR+H+4692K%VTSsNupJ>Ck*G3p6cx_n4I5&BK) zL#)ZJRO-pl1Jp-Cucdz8N_WL<_^su2?cA_oL(z)WU2B?KmbJHa6fJ9S#i-48%-Qb3 zl|c*E^=!5}ah32gg3t0|#H=4$1GaiFbAPGT200J;*F!h?SD`1+1Me}b@ix~MF@z2~ zw%qE#>Q!rzdpVAVBFt8;#tH;AIE&wlTEA$`hi@GZVoOoF384k}D^O+u@~?mg`_*hqO74pFS){^GVg0`rcs^C`0lOU?u&~|U2Lo-Yv0LF-c-zuuGv-f|u^6tOX-BUMM z=3RvSy&Avr8vOn(w7LVS#{O12$LEn}AzIvk_L_ZSSmx}L`|S8_e)+JEJlIPSJOeNc zEXKYFAjRQh07s(z!pdFtBU2|f;QKusr!FxbXop%U7$*`Z@o;{XAc>MBLj==};nL6a z?GBd_*55FxH4UAr>3BexA!8&{vSch~`hOUa69KQZ4t% ze2lxUkuS*t`LcXP?uWykg;FbZvPixvi{)#wL>@FAdZa;?p-X?cG|37$rfiXwvPxD< ztF%eGtdWOgt#nAItdsS!K{iU4d|e)vP4W$SM7}AH%C}^*Jcj?2CuEC!Te{^tvQ@q- z+vG{vF5g3U)b}w^c$e&!r{rn*f$WiIn=9Fe1POnxdoavaldekLd772JvZTzchIIW51CGZ^)7R(>h3$*<&fc|*?0ujMyb z+zv~>%J1a&asge!7v)X)16Cq zNZSZVyK+doa!9*!NV{@K8)uGJ?Z!ab_>ja=;;7viq!Ukxr^Hj@De-*7^AXQSJRk9V z#Pbo)M?4?#e8lq+&rdu*@%+T|6VFdPKk@v;^ApccJU{UQ#0wBFK)e9)0>ldtFF?Ei z@dCsP5HCo)An}643lc9#ydd#{#0wHHNW38NLc|LZCq$eOaYDoi5hp~P5OG4p2@@ww zyTZf^6E94>F!92~3llF)yfE=1#ETFwLc9p^BE*XjFG9Qs@gl^F5HCu+DDk4iixMwN zyeRRa#EUw3O5Q7ZujIXYopMV4EBUYFzmoq-{ww*ftO8zVPujIdy|4RNV`LE=^ zlK)EnEBUYFzmoq-{ww*ftO8zVPujIdy|4RNV`Hv+t&3R&ulK)EnEBUYFzmoq- z{ww*ftO8zVPujIXw_e$O?d9UO>y#F|MkoQX7D|xTvy^{Az-Ya>pA%_o2{ww*f ztO8zVPujIdy|4RNV`LE=^lK)EnV@(LhUh-eben*C^B33F^`zzF+C&yytvzO0{|1%B6xsj) literal 0 HcmV?d00001 diff --git a/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.woff b/src/main/resources/static/editor-app/libs/bootstrap_3.1.1/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..8c54182aa5d4d1ab3c9171976b615c1dcb1dc187 GIT binary patch literal 23320 zcmY&6mA1(8T6a0V( z7zzkXUYUXEN9+9I!ap!DFOd#1wlTB=0s{G=z_>rwLFyJd-Ppy62nY!Dzg$rNAC#b> zW_IQ_KN{(eU)_(Nsd6JjiMgTUPb}E#|M~#|A(>mdoBe3JKtOVEKtTU^2nd*oEldqf zfPj=PfBaZ}zy@NZ@n!KN0s$!#{qXEt`TP45!w50c8!{TL10RAG)dniu*zrR^LTrn}O+tRb0xd~0E&>H($0brSGJ*iX z8bUAslphEzmTHiWB72`anLv4VuEY~_ za}WVZu^zT;R-~y&T~BYSiJ>00^O~gpl9q$zHI%Y>Lhsr-MaOrb%y%q|(42pX<4bce z&%S(EIYGx}q8~@4pX*EKdS?h=SI&tEv`GGM8)AScL0;U}brn10v;~p2;1NOn2Um$W z*U=i%VuwBRz@Z11qKr(qgO8vr*&X5{?12dd{6*l`Yp`?k3MDcih%qI+g!qV2n61L{ zS-80y9H-NmrN`sSUC*p$lut-w`?nyb*goYXni_zf3okCBA{zrCwXDq^$DQB5U?DQ* z61o2X9r4;yA!5sN`)f6pe9e8pguH(cK5%0-vMf9zrWWth^A{_9wXmH0nW$}wo9hf@Mt&V*5m2_W0Zac{Bwl*3N0W}7D6V5mO|AbT zMePe7b5d1qntWOB)2(kfH3+1h@`qdCj$7%?Ws`6C=E;z?vBmFy(ZuU>?ZKAjdKnE_$3iyZHlp%_ z77-FteGS2x>7s==RC=EgNc20pi}B5ZYP?<*;Yn$7M)<7;<>9ljc|Q@}q1HAXA>?XX z{-<=FYU*8Yx_bmPn*eq|(6}#S=KV{`|BZ*Xn#BSEOxT0n<2%3UJglMVh`FJxT)N*_o6m(8iH0h%=F{CzZaZ8j3d^x{KT0bRC__^79ko z=tr+cA_{hBgbop+gr}pTjdh4lR9OGJYID{f-h7TdFVsTYrJ)sVL)@`Nes|mRJSCBQ z1vY;D{cTS=MKu(Wy%|e~Iy~QIi?KJEB~oXKHbERbMSWb} zZ$4oLo6Q7!JY7E&nSn99sadal3PMV~{548>MpAHY2H1T`ZcmF;%7p*Gd@)Z2X$V%V z$1bYU`a7{N-&8b(7EKxaD_#{2yNI&{t3rygLIQh8i%wdtQ^A4QWPw@AUkIZjStyRy zt6gfVP}$xz$w}4TO!~910gWc?ujr|I`%rxo*~ZRJj0)|c2kf0tbH}jLi*?h7#a}r#3UcIh%=Rq+9Oy<}9gOY2vy$@K}ixTio-4X=M1@9qI z^=K!qz=h?boc7!Dn&OoiZq*aBh4h7*kXhO z>pcXk->0DSLp`H8gAy`9imj3RrTwYMLn%~ax2R;y6z$S#bv?dXh$n!f{I%|F6CUzH zNglJr&iX(OdhO|M-zijiorLRikL!4b&v<-I;cb2U*9AhJqg6Km0|C@3UPi3VuIeHB zEvJkk^d768V;-U<9n39OEzwHebV z^!;=ohVM{+SKmNmc(fHuOajOg)eZg4gP9Z?_0r_5C&wd<_hxoo_+<48kwZJ{Y3kdj z-euRxbNtS4ORoUDw~*0{d?YbybVf*Z&j3f0Df|p6wtg}#){z60vHIVDYyvXYiqtw5fLstI@;wPh+Bd5ldW?|#AJXDCfR%eUYew_;&(+g6-=ThC?S3>8w7??8cY@rx zXANRWBOACbA6cC_l4+aF!&NSKMmjmK4PZoF7UG%C5 zf)X%cLC&;>^$NdUhi>}OaeOh-03Qt>c;rBMl8FXlh6u#+T;)aNQAM7iYm9MwQAwQ$ zauN?iXC->xfF|9A>Yn3rfOkVpm+8&z?LmtUcZTECdVP6@K8N`=NVn%wvgYT?wv(~@ zRQi1syDn_w+iAw6*B2j_C#*4Oa=3>>HsxLFzfc-lqHiBWPsG=v_Rqfna_4v6=XxDj zbWvX=bCj4jf>-mGLa)^qT)yEMN*AOa6}Y=z5r^W#5+eB*=NMYFLlxp|l;Umkrykmm z>1Pb@=d7ZMXh-p<@vNTD{%C%$y%YYN-VTD)5%>5QvQPlpLYJRSmulc?J zubo~#6g|MIS#tM^y?0~C`jU2#a#T$VEGW;6HZHFWLEd6C6gfhTw6Hw56Q8*V+~VWN z4AL!NdF6?QxaUpsR*ZThZ22BrG(+5-Ud8j`|8n^?HPZ7*MH$Y-GdTEy_<}Ip%UH`% zC_ybkuvZT`(*5-7zTSgt1y-AX_=4Vq{_y1PK|t=n8Jsz8N`x^1R#L(Hf(SZ(R}et= z20=K0`i!{GTB{~I3$HZ!fZ7PE0K3mgrlOj^=HLjmlzB{Q!INjU2`4JhvkVArhWI3g z2BFDRMNusx)0QK>n-{_BPLkO*tH?}~b^*t2 zL|B8@3a#it1GzFLG>-jntCpno1TF0OMs-3&ICPgAm$awK{?_0%(W?W=|3Ym<2B399 z6?sOv=odFeFq-4ZH~dK}*A#W0I_F%hOcy3B(B=(oS9N?rZK6R)u8SFgYl67%j$Vzn zT2com)G;k5ej>5&f(ldAjf;DQ6!5hOSn{C{3@HGgJfyHHbCwb;JWINl)t_@@KmMH+bk8Q`tU&fRBnQ(#)4NSadxDOZI(w zdDV`IZHTev{l3e|YJOjG)!*{Qd3Bbc-oK>W2LbR{;`&r7v=uuYN}Q!j?bR6qQf6%Z zD|U^HaP=Duw&<9^4wcHPM`Vo0d8#?cwduvt)W!CY2}SzBBsBVDmS^qNq)C$4z-w!v zu|}GDNU(nCqGP?m2nGh>so7Y#2jSAF;UD3l zTWTJlAQB4XoWDz=q%Vn+jEY#AwT@9A52;uB*W>Xje?f=`^s2DJ+s}6b zZHctO--vJs(vA6u2D!C~MMV%ZF_OWKERqY*L7bn~pu>emnX~};w>xKsx+HmlModD* zRe7jxvS`Tr6uHz_O`!|yld+VyK0FQd$icoJ&6I5J_C@tYl{!GM>wg8ezB^sMFG{SP z+~tO=8DM|68>>8kL{vLa+9stZVE2&^q(j&WrimlxADG12>h3l$)MnnoG~F+Q9%u&_RYNWV-S zu8Zij1T3udO7yF++y7qK8?@Qy;j&>d29gBr(=CZ4lKGZq^?3#ajS1CkdX7~BF>3+> zYZVG#qpmz`T?l5}q@jYe4}&tAuC*{c-?JynbwY*R0wc+;hotR!1CBsHEV}H{pEV_Q zQbs{v@#pEsI<-g|xh#rQJeXH}di`N|kNqjL$UE~3So5Z0bsl-UTxtBvq=J|gu+RPErd8o zq%Cu)1CPBz7A=EEzAUR|YC=IU9%hvt-M5s$vP}yYbrS8_xEfnDFCI~k&{z?w$lx zkHl$$>l6w9E<=%h&m}p0DcU+fGPM`d($iGo+S3fJhaypcIE2yU{5H<0HCgoFK{GLe zCVD+P9e_etX_H9_t6xc?c?>7@pb;TOf6%r&2oND`VL682Y@H zo9cs|v@$?BZbm;;TeI&1a|hDjryghe`LAHHYtRh=V`G;8&hH=u_R(Y1pv%n=LH^3^ zFkvIs>V~3aP^2c9bjt$HI!&KIsHF;<6GGV<&cs3&h&!7&F_0TJrW*V^F`?h4z4b9P z)shrVOIq;gnBtPE8xy|c?B+5Qhe9v=A{q0$_8i?gn>U-#3cMhdDV#r)gg$jBSHuwk zk}gryawT5)H|i8gP1CW0tGr3sKVvSH=C;mKYmExi&<#lKQbxbVfh72pcQ7oRvXB%= zj1OXzBoz0nqSwe)?dUE|N0dA`Jm0((=&k$p`L1c)=>Mo*a}LJx~+>;2tcjSh+G1pg5Y6PO}pj8+;DLXc4La-kzxi{dPSiJ7 z8JC>pyci_t`xsI3_*zD$W!*$<4tXVP|Lyd;LAI{(?h2Cw%dD@_;lH-jHe9S+i*4E z4mm+=yxP3;fjmRcM+tj5WK$Q-9_(!w&4?Zu{~+v=o|o`vvKeY_m&uw>iUOhrn)3ws&_6vxHpM+hCYx}osCc0Y-Tyq0z_HH?lw9s=QM+-Q{gQx~FocK9j!8!mtbNX&zBR0Xt$l zvErya$XNJ@m2B@ie45(Z(19?S0|j@Eej=zw0gE??YVlwp4LSl7VHUHoo|LraFf00W znbw<}e@IUzes(fu}n<{VdSNo|T`)7axnJ2E3 zGN-K>ywjN_qvqSYS+3(Tift}Ac+Th~V)w~#F13j;D~$iUE^?zyrm7R;K!FVAfwf4+ zgEe5#q65&2_@2P9Xi0@IzKKB$Mr=t77zjDw^ry*`L~i%3hjv^6l}?gMTjnmHPNyRD!RE? zVzeC>gkFuW>V5P|ms&5GT4O@NM-mhCx+a!f0)LQsDAs{!i(cE9Ov8j9Ot~S$SX^Tu zbvv@~cen9fE3YI>r2~|YyQVnWpZ-X~m^M6OE$L`m&MG`G=33X8DprYlBgvrAjN>#) zf7F5}TO}Od#i%Pvr08HxB1L|F7Lms;vt;^z`LYoE^HAlcM$*80N!_Nc@Z0C)>z37! zB*8pC&7s#0b$L(fb6zzb_{hxyz+_iYonkQLn|M^r48oOlXXt>e7{zFo03wLhcxL@> zruxmZD;ZM5U?3RR7ni`br#{#)H87#K@FBbE7!;=-Y}c+8!h3d5JExlz2JatQJ+?rH zEiUGqC0jaoW>(Evnh`H^?>C|E?;wdM>7y!8D4dVkC<+|T0zP?LNZT4#$T22k5m50< zzoALNpZ84Yo=WEiK^k;g##y>nq*73%RqJFJOX%P{Sin)USV69lwgt`-QDJjC{IgNf zBW4`*siNB=F5h|FpHc}mY9&H}jGvvlX!|~~dIc_J`?;(WsSic(jU>39iqS|Q7u!DA zY&kA%G@cdsQv^FWgQ+Nx#A;({7tI>&nigS1N0T`xz+mg6@_{zT%;E%P(``j&bsETN zs(q(bWF8KI1M_eY6S%3}4I-pbgJgDL2EYIzPp(Kd(4_CqWI0N zt8t_kb+H2&h#4kT$#q>Ac%Z2bj@0N+O;y@sWv$8hU9Zv@p#uT7sP~{kG6820-K~jc zzx+zAW+=CEi%kufkYzrAXi1hFg5D^8VfWJSQx~1y>x~0bBV$33&FY`a087m+i@@r# zv~L(PphOgimWm81wL^lXk96(eK$#U=hQ}pu<-Srb@X)RzEK4@vVL9cwNBv&D7`P0@ zqV@&7+T19`yV}oc>o1R%dLPHOtgykfkQ$mBKeZU*==5=O;{`t7RV`&nOFus5HWa@{ zXbhx+TZxRv=(Ko|DZe>7Tjhggvxn2ed0umrYSl8cq1^h1GLxv~Ovi$ld?|yHWQbL0 z!Ivh5s&TPz0K^%VfE05%mJqQKs?A%Hu%Xt@^>Aoa$L6|fp<>G;+%>slePPEnR_yRL zj;yc0lCyoP$Ic|g#bX(o<$00nsg*!S33aGHMx(FL1IZKmm2(3;)8v{BEh zq+0};_3dYnO)g&8rn2p~Esgh&5iy4}Tc`s#l(NQVP*B`-s(Tsgb%=E*x!`vNJk-`k z+fm(7Qcae_0=zlj<0~2F)s}a7tknTT`cdo_)g;9@CX6}Sx(tZ-vBXh9eV`-C^l3uT_&kk_ zy!QGr?i9qmGaJ`03`VTK^)eYd43pD#6!NwJr0B=zjQz5pDVIxqPspfGxc527cKuN} zM+02tzw?((Ojfsh0mh)!EsE8yz$@B*zv5LC{@~DSWie_CKtd_%3$Mw8a()p(IDD|g zE`aGjSXm`BggX|S0Iz8=DQwWq7Y>nH=l2gF6&gHY9=4{U@)*&>a5Lg$i6r`O!H}dD zW;VLr?c@ISTZz-X^w-r)NsJz*7Ik*4Ly0i!Bq{Zd;rF?m8fkO1OM@>WW%j&Gv#v`$ zQmZ$kLeIBScr38Jb@l%c_PQ|;xB~H7qh?jaoofQxl!Mou$divTfpW_5t{jt5n6rPK z!vRqg8v?Nc`M^e6lM(@2!!NA&BnKun1vVjc1z9YJv06oEUF=G;UtEZ%aSas1z8-O2 z9BC#xzszD?1bF!myHOXw5=A=9o9-@Lhm!h0YZ-|@A8@Y(+_Z-DK5aN{$p1>cump2t zD5Y<$oDGvcGH&@I&=`_@&z9%lM_#_W8iyXJa<&`Ydn;~#brX*PwN-j%3hf05d z4E%>Bj9t_c-iGDTJ%p5oMe%gVzvc6bd`PTb9cQF~$q=bA787VjPi04Chi`i>W<+{G zV&FRA7KPur^W&w!IseMOaI{i>RU}bnWQwl$BQA-{N7}-t4=-KVk!vbXQ}zLtKK~Vb zh}Ni+HS~8TjiAhC5SP%}5)++t1N`_`^O*%;^P^`Rj#KY=G1%z*MAySF&MiUH~wJ&BDU^kXcQH6%9!xbzqRA z*C;FT!ttCmLLmGAVU95En90d_(qX5~%fa`pstx}K4cq`D|L4WUM|^?pXIDSM7j{_` z3G3~Fb+5YFcta__mAzP+vqYM1(W%@8)d!*dz-)tf@tMWp!rn*|T0x9DwQmg`{~HF^ z(&{06L_~x$VO)QgY!}xSiz9L|mX(gredtzS?t3cy_RjmTIU(u5dB$Pw+b^CLxKo!Kal-ql57+p#JJ3zg*_!Lh#CTQlhLZaSdUpir$y9?7cH^D{5SFz4E4#R}~cZf9Y7m zo;9Cm&MV)C>%p+!bv-*M+$WJVT;|RqRPchoQ_7BbK-|yWM-<~FecpFY< z*+V%yqBEN@TuW|VvPKxu;wzn6PE#vLx(^m2Npl0_=R`(f{eE#>@hhO=C}MNbxWW_v z>i*?56p5poIt)%$`T(F>Fbvwm_u72fIj{*&-QjYl(EG&}&x2XCp-|gm&6LNw(*^~r z(;e^7)q{$HCsydP(lnZ{CMFoZw`Di*O0teoyeuOUSTp1qVs*`Z9<21;EeAe2nsvN~ zRC6*s$3cgHx807}TdF!K-J0iGN^SO{w>QZ;&Y$k3Kg?6j$YHFGxQg*a{%}-aq4xqy z&jBywOH07(H!X%N)*9k*pouLg-u)|*fP*&bSExgq7b56vts%pZKc$!0Wz)kTr{n^c zH0~1dFP!u<3h8{HY$Lt50id%$jqN@8k8{VALlSz2UVh`a-#R#>zHXSNNR|{7e9pN> z7TX5KSq#wFmVO-1xo)>HN)vR#Rlnv;&}%R75X^KT9xE{?m|>iz_BH-9O;l0+ZPl<= zgateSH#Dy&8cL!Z-sT5hq(D<^FoqY@mUzl=C-x$j>?y7nvAexvXwZ#MsHgqBZp zatbN4V_H3K-L2vU@+EGATIm6Ap`GU7lnAV|6g`8C(61y*zDel%2}VNAy1~`blPHN= zu~bPszDZI*Nw!P&qvtzvpA@&tGdJu;DIn1jLdX; z)t`xZwPI`TdB?s+nt}J71mU}hawwEbPnX$OL8-5nO5zHu%kT?MIW=*XjkB-H;p1>i zcVuPz(G&BP?D09Rzm-PH5sJ;n5|jQEen*(AWy!9%8%FrobT2yz?d&1r2KSS&4>U<6 zI`!cdm9dC1Hqn|R>+xX&B?|~3hd5zh)13!mfVsLczdYF0Z^iL|oZ=M%0c8`h0j{;h z%1hkP*~06j7+rI@eA;#HV5_3yPVSKp^*V2eP_Sfgqg3u-*%?R0LP3RyTYh<}z$74T zm;u}KQ$iP(LarIp;*m~l_iNZU>-f~@+~!>SGMv8xF)qs2Y$b}ymmJp+*51+kk=cjL zmrRQpnwbhoGj^9~t(5N((?x;Acs$~9zAnWpC^CsfbL2PPH_JB*;3Rr>5>gypdKu}@ z_u^!zU-oM)A~Rv>w@^Qe=A>t8Iv^I5(_hL|C*0994Dztje1-tP3-Ei}#z%jPDdt{8 zyj~NQD-NaTJp#iw;$eW^b71W?UD@s5BzgyHwZ@1vXRIB(t^Jc6R_Dv)Hs|F8qoLtu zkC$6KPc3aY4^Z{pf-Y8+AhHwBfE}WYF<334Vo!l}AXb%trV`AC8!T6My>xRvk#pm3 zHHM+JX=1+RLngN;k-3IQ<#A5MJ7DB2=>^LqDb1%kc#Q5A6%d%>IN;UIK4n-`2>D{q z6jHM}#0~z-%3!K9@Y#+aN0N<0nV7!}Yjdma*li{=yZCa;H1McT5{GWCXe?F`+{8IZy5ljQQS zrTFrqEl5LQ6y%wNh;`4Sr5J9RFfaH9Na!?n-MFD%$2Vk4(|tbc=g}P52_RgNSWcn3t)I333gCka0q_DoXC$EE|u?la)3Hi z^Oqsl%8F|h!WfxtA3&}E0KOg)%}(*;8p7JP~oIr7x~qr5ZS zt}-eG#D;|kb-q_a=YwMke!SFlTUXIIIyhgBr@r1$`M=v573zGUZ&Z;ovB#T+9BM0n zr7D53GV;cMPnitw@6~l#XLgD-r1|n4y?bO!UcEc(qc7(MCKr0=6j!>Gfu7UOSM}Wr zrxrvQMB^yRGbu2{3OLrjP=6`>V`nK;{YAu2$`B8FPF$7gZq2ZawtwRV0kK!LeuHJz zBRuR2nG8L&T7&sF(BmF^9-`K%l-a6BxnQhEsSCcMv@ca`7C+N|8~^)`NY6R>9&v-F zrSt9am3)7()aGkIp=6JF|$3I0`=vgS2}W>J>gIe0La)`lZ1P z{l;udc}QmIM(7D`(wZl?Lb}i=W9(rVd}caMm3YX@2^XEe7&6ov>SA_Ul!YAv^tDYe z*R}KK;n3W|(DgTksHFp3@6t-fBvNI)YrjgMY^JK*K9SzP;OKf3rVT zZIRx%tWtOEFkX+LaNh*i3kxphn^$o6AR{?)Vf=48wJF#hmJAL{4=%^PHvR5{s~IP{ zw@K5SuH&}_b#waDN@Dr*1#;8 zj3>L`zy2mj!ymgpko;mUZsF9%+di@q6&^JI&CNM|2-W!Zeqx=@JCWw~Na&^Xr+cBx zD~Z_rhQn8JeQezgl~_%EHY<}DHhMelQ2W>38M}*g^5Ct4+hNyYc-PQrKYdKg5LHHH z5W7c4sF^;~J5~Mpel;s1wg&NA+sZYw=yb=+oocgx@pdsA=k7k;S&^0Ye2PKV+jA=J z%kv8!s;L>%L)sb~z5JD`X-KkMJ5d1~ffCHpybzHPuu8Wkh9i;1AKMAU1s;ZClWgMl z9P`0tCm%NxKJ+&MOk+0dFd)syx<+DEDBOC1G?twC@TmJP@Pf+(*wj=;G#0iQZJ(iJ zhG-xA3G|5*R@}e@#7hh_*PQ0J_Ka#hcc~Q+8mb_($57A2Z^ikOt#!vf@PA|k3?1E5 z^UZ$&A+KqZAMh0`O@?fzgWeM%dCVoQ%|~*CFOh+?GLu=z8cs0Doi&=R*WpzS47aux zHba&$jRt-gFb4(L@D#uGjmM|c$++VCtQCqFUas=KKW6lql}beIi}Ay+xI^LtKc@0l zdkQ#o-z()ZN*r?{x*<KqloOmbT5w&V zwbjn3a$Q(Enfrp$2j4p_eha~MoJ&}&iUWxSZ!8q_P97wWkI`RGWaL1RonK|Uak^P; z{w86F#atZuy~}Jq{ejUdkdpr)fS;-)D&h^{m;kRv&q0P&gY>_Wn_t;WSnIeQ`eb z%#)mE*~XX(4i>^EwvF2`&wtc>49nS`qmL5rVz_@uPo?s)>dW#p*sb5eNQ$qmB5fE7 zIKEk*|9H&Y!}-D4T&BI9rH|YQxZHIugY!WQFWiyQn?n9k3;PL8)U< z#A$~V3iae6z(8e(o%*Jz6x-yjLA3G>j@cDD{8TQFa@~$UQzl;@bJcoH%=3~W6|DQs z(HWs+Dv4k7d(U{^^k~iOA&FEyEHm?ov{QGSJr>~ zNBu!tDZKyZ{}g5cj*I*BSypu7bHuIB>1sJ{JNP717@@1r>7Y4r23)bUfoFRm^)9*) zCp9u|gQ?d{lA>+D7QCSr-=sytp!RCmlefdPbI3o?<*$WGQBXkp!Cmif{c*L*AGg&b z?7DWdx+ZbqK6&wh=w7UbYfJvH%6U0zyA-;}t7CBq?(%dq3th6bFl7)PLYI4xVL;II zyHxo?4$HrM`P6?8Tvl|24X-t54n_i-h0-n0Sl27fDZZL8HpAEcQr6*yVHCb~N7E27 zmK=cCh>pD6WTW;ikgkvgiM7ROCf}QC3cT(BH$oGu-0t^8PgZ6MX?z=8Lz0ne4T4^V z-thAcyiPMh&#zu3J_ES$FBkO~$SuMt-s!u@48@57H?*$e8Pwbi2Yrp3CQGtR8@!yj zUk8vkyy#dDr0sf^D6wod7j5Ylf6w`wCmvcUyN^|w?dyUD_KL31 zE~V1>J!2e)z`E#xwN&7d0=DYa2DB6pQ4$wj;@8aSM@4AZA{vjr3qxAHqrY=7T1`94 z_r7;6x{PXo9hdnJ!N8{tBM9uaKE8=KN-T_n=P(rOra}Vi)`j2v%gIZ{7+g3|lAtj* zB}}a4stt3~a*NENyqPR5c(%njgkzR6v4J&RA53RN_zXRj1VRWa@ngnMMCvLZvQ@+s}}=U?P|DLxeem<(Nuv7p63NlkA7!CE10D3wO$!ANw9 zObXX`YL=R6%2TeGd1?xrLK$VEwP`qN7HPlo`MM}dK3I_H9Mzu;W}$)%JINEGUpF90 z#}mTOLB17SWhL}ZMRGTaFgmU`2O4g(>;@kprlF*Cp)kpy38(i>~14$R3s?6^?3 z(HgVQFov4jM7QWqadph`*vm$aIIXJNNcy|m2$G|ntBgb!GwWC48iMztD|o=(>;15q z{$%3Oyvm9@O`4JoB64cJ6IF%XU*;BiuoJW(Z#j^UH$l#9HR{Mm7GhSUp-f9TbS(>+ z=TBhELjbeJW#KE%-tr3Zh`nd{*Z|1O0F`(MTCf5%G2HfRAaIr0SmvO)Tb5xAR`)IS zDJQ*_aT_PknaBS3@{3I7may&O+zm8(y_ea0+%G2M5N-*A7TFy3Ev_pPhhj93^hy2p zsf~STscg0VHv6)-suJJ_HvfhYQrC_Zn#OPKnOTJx| zt$bef1E2v24uA^CoX;uvbNr#<^;$Bn%#1V#=IB2G9-e7lqg49ji0~i?uStqONO;%fa+^ReCL3RZjio@nXo^g1nNPbwp1HNQV$> z1@gTfZyF)87$l6~%5yxJnEQ+ie9+G%;f-}&?6HbOe(kPIzzE$iqX`vfok4&ai`W-d zwC99WD{QBt=6MXVD;D962#XX?i!3ihIshIg{q>fXgAMys=@kLkS%9d+mfwd@#_C~~ zWK@5#ngAyP8WOs%@7M-tVjQG={`OIT#6O?~USMV}Aqz>h#^!wFb!x$Ak5eY`gw_Il z+T)(XzI$10nIxlz0YQ2v4bhDugbSQ_y@s>>rHp1+Svi2@-tSsqlpIzzPTyUJ4&6Wg z8t%*#w>(z0UiMXQELXctsZ9~k5wCOwHVp$8E;=11PHAtA3;??YDwCu|jO0#YA&u$Y zH5r8Whl=eb)AhDqcB?eTs5~8M?tF{1{8~NvkvAAqv1XpE@W8WAi4NlSL<2eyn*gM< z`9H|9_I|T^m{J0!3b3`LzciFAtd2LRu7s*s_Jsb0!7S+S7aJc*lt;`*gA-fKO8ArY zhA?VR7)jaRX;6nU@n|8Tf?%{mBM3tZ{xr8|dm^KZpSP}F*K>^y1+c#*N_x*PnQV4j zHXXs6C)_oV)=7T8wRg}#7y$*Oxzi|WxACj3t`$g+Hqob;^h}z0MYNO*)*)W%TP2K^ z8+E9AzoFgl+*G|4FIloWVp$TG!&6mGHAR&+;NTh5J^p6y6{5nltCkJrWQ|oU6qW*h zPfOY$qZTp;a(A%n4fddVdJyiB=7!MR^#1%L6Aw9d{;jcxYG!qJqe2pMrVyVhg_AWH zCaVB55F%KKa5^A)lmMTPG=x(hh32&U*SA$xDMyd3{ZPxizi!QSz5K)*82;WGBaTay zHDeWU8ME{rnLTO@q8U-xW(Oe4ST5z)w)yoW?X}$W+~i-yIXAq7T_olt03# zG2Gu}eml^<1&ha=qIj=`nCg>Wm_0+Cwd6oS*LRkQkSgAw;gvpLKW`3noP`D1=r5(` zPz>bAt@<5_%*bgTP#IghY!XJ=NFJ98zDt@(K^*}B$ts!PZjYpvq%tq5kYKLcJ@r)h zpjGeWgspjG$}U5I3;E(wFu-T*ttBj99nkVSJy04B*>3M>M=4CJBW{W+wr zmo8Lbm?dVE#ijL><;n9dCt|#Od|9HFF4#}Y<2rV})IKejs~q4`MWlQNc41Kjp$r;F zAUY8dDHmc{hLF%=Kik+j1W{WEZP4aaE0T_9G2k3)50J+n4@!F~;6Mm#3~zA2!(uNW zD?3~9!k5Ezu$*P; z0Z-5cF&^e2ZT=G7;H2(U6=DL_gI^{}SNj?dg8|^Sxt0p`cq^jwVM;7!Xjm8d4}Ns& zKcd#kpeC&YrVPU?^63<(P>{Ui+6jp;gFDhm^1pecu3C8b+kR_Tdy{IMWKB?1fmzJA zRrWbi2iAWJf`OWX5*Mgp>n7+MnqV+8M&DPEmPa?H%ZJ7^zBIqoh9?*U3kCchz3T<( z{o=DphBZPs)&O&+xL<}PTrSUw@BBJF-j`J7B@go*T)LO-j{0ZZpPSq}+fSEg4@}1L zZ8|B8jgb2gyHh2Popw{~EdhN#pk1m(0#ygca8F4f!i2@Brzr~+t!U)sEME!yD(7c} zHIM`C5Sn4OHuPfASSw^KEK{5G&ZKT-udhQ|yIrv`02n2nEE6 zJaaj=cYtkxDp%*vn;v7!mw#(ERHUI8&%?XwWWwd^?J-?@A*9kw-cvd2{8XJT$}8H$!5 z(CR70IjoaC>DD~Sdvbq8(GW$Ab&QVqs>5qM-s&(pM zPqqe9RFj;kYc-8w?^V+V%7{u54k`7Ve?+hh+r~`oRnKXVB3p_X{b-SP*}HtZ{G!PA zYJH&DPN4_-LI0Qq?XoMhMUDvc#~1H5z9hRdmx!A;m8^?6m~Y-#b1hlP<)Eq8U>?U? zbrG~tojEl{f3~|C?x{5NaaOUOJ;yJ2hOz;`4;z|OgBGHrpdB>_F3<8WI*%OHZMd3j zy2oRMzZ)xk)fy^F3L0R20hg0paZ$rdG{I|!)H%|BW%n4OCnFJO{@5hlKEt@{ZF)bo zm3&_P62l@ToZ9vsZl7rqgY|j&J=M}0aCXo$QWJ`uVjhB(*uS+H^UDM}9(ER4+JpW&Q9Bny4m*?YQ~L|5@IZr?xwVdan$7a%9{gv7nROdai@`14 zG+-^|Z})4_OtE~I#aE~AS0(LCtNXU(!?C{8pLWYD$$@TV2HsDljoVJZ)B}69$9)?5 ziNy=R_Yv5a^;THLpxNLO zy{q2MTR&jkfAcY;d3}8rjNG3Cyi-4GYlGzJkoOXtWoKd{@;N{&Tdn@M?Y}BW7UX`* zGLMt1)|BC45~;O zYEbYSZ2{~+yv)QlkAVg?M_pjZ-!GCpjqn>zMaydQ%*lyE0`=2E_1o>1!sJ380i_My zB})!KN8vNL^sR*WbvXhjt`v!TIljZl+nd*r_Ksa?e3=XQf1O-aR2;mzg<{2Bixzj6 z!AsHN?hb=%ahKw5#bL1GFgQgEgBN$VL0hCa#pd##a~|%x_wD3M@@21YV9+3{YvzBcTXYf<5#f zw@nazWj_=%=H(>O2QSy@P=u8`{8`_bk}x;!P%>I-jlqoScuG}=Yua=oBl+#ICF~F+ znS@$6yzx^4vw5R$n+4Gep@PYrOxf{U!b#0SW0W|~0Cd`pgH+d9 zHF2Y}rq%oV6;IeW|n{J_U0dOcSD`AWh!D^dDYCb*c8^ladlx6e8v=7}U zpGCJ-DErivDK7O9PLYZ!KW$fh`Bl7Ghke)_A2^fB_mP3$@dtVOu4PdD;J9^%pt#r7 z9aUCSF@MAA8f69~*msmp;gomRMsbEyIuir9mRT;mS7@#2U>)4Yq%WOoTL5&hULy8K z>kDnMX|3fn-RNuw(0Sen*8dtIY+Cz>5U7I^6VXeO{2jLdd$q><>Xl&1Vu0p7fs&1| z$PbIJ`zdYzEI~m!7&#%G%tX&h5*}N*sl~^UqaR>nhkNBS8AZM}wh=ZX zrjv;)`|w%_y2#qZAId_YsddV+wJ2*du<$W+5t&FUFZk{rEi3ntr&SUnt|%1C=Jd5_ ze_CF4u9zeMdmT+erqTwwyjqRMS zXmyK_a6D!#O9m>R+q5u*q)F~4F&iq;iKuj7YDjg=gR!K0M@3p&cI+#a>do7bc+EFf zp}{hAArKj;X%SHZ6D9Rz4`|SSmahv#VAGy11cXaX)Mt;d8M1&}1|-hAvZVNiXA6o< z6cfy5!JL;QBlt}Ru*oAMLs~|FY5`ga72TPzIc9tZFpU~37kdem-*}k9(J*PIpJJ^J zsSU)i+YsOesy~Wy%t%w6zMqz(_qC;@@v>^vIJuyqXhxU}irkNHR{VlcZHy_J-_{`! z{(i{Z^`o?+;-T}NH3_eik^=@7nJ{&KH>NC>I8$+d06Es1h|Pqo^o{1;)^}_EW(|57 zyJj+53*y)m6e5F~AR#?Ia_O;t0+cCf@_;lqd9@>cWM%$cNkbgsDZ7Cp`OsmBv5a=TQADA0^??l-fO1^j=fqzmv>$Ik zsF<+b%&B*pk!HX9Wifnau{En>S<+**we#g+tIq++C!fFshl@IZ%_AS&j%yNkj=w#j zV1zL4>BCBv?8m!_A8vU5w_+jRJAUa*K$Sh=>u;o)@%gZm(Hl#>>H9yA=VDeWW`zerl}&-1icy~%Cs2WRZT1JiK;)SUZQ>Vwq?HIZ#4y{7%`Ht@uU9-2mT?U8mz zC94OXy-c}dfYYZ@TnK!7OnYwUnU#=S)k-Tj1Py{Y_*g>!$igUn_8Hg?Yd`YAZ|zO)ET;+xY)CD|&4M8hSGJ5rwlLozN)`xJkphmTWhnkH7R zp|GN?86tSl;KdX2OoQGhRYBxMNYX@MpSn5D7F}DSPf1*q`Ib#*a4Jg@qHh z`7qyVkKaMCcRemWNY651aHvi)Dt;N!*0nRH%gv3csv7=?{>O*|2rMzztJ4FC53iHh~I24S*ZN8u3B45qTO2k zV#a%2-hio? zIFEIohf8EYWRDv0QIK6XdRv9JD+t>+-4?eH^&08HLs(EaIj}>ufdPG-&FK`ox(hP) zSX*Zqbos^?mzT7`kU=2R(_sFto#;e1-jS!3{wMk2OMcoJ>~6zIk%mvT-Jh7Kvbt$B z8|rO?J^g2Xr^H3M{Vu`P<)l*|Vr*E1X<+$j`p8kgt6ScMbN952xjmdzc;`UuBmU19zH1 zdQm<7)we%}!ruutZS5wmd;bx?EJ416t*z8Mi{3Jr!!9It;_W3U$&c}W?2NupfPAbz zaEvS>tF=;!K5Ao~-wL{`AaKW`2vX9W!v);+3Ne%UcVx zb;L=lm)%rYtA=x^cwa@f^IsmG_fHBMF!yLCJ+BFOHR>7stJd)?=Nxz%8iP-Ve6eSZD~t{%G|HvhpWj*; za3=~ov&HyCmD2vW$N+mUE$10$G3&6M?QY&iR^o`>Vh|lw=YCxOOE?w`X@(U<9Y7~6 z)Fcq!<`YOUk`P*#e17Azvnu6Onjf2;iYsll!t!`CbngkGOAaC^m4^RW((d+S-n)L~ zTM!mauKzQ?74*h_S1@6)A_2|}RmHj8#A&~vV*Vg@W*Y<^Q_2%(ZD@hdlKyCe zl)xetJ8!pZ#}qf;Cj>*iNq*>30qx?euIoKYV8uSrbVuX;KB~UnQ#KvGL+w`BNcSS1 z;U~2{1T}vKDOh?GjZqA^@8P+OEsh={qVYmQ$vY&4jYp=IpNGGesr;aBWx6o41JoSQ z(}BH4cv2?sB~?BFm6;E1bvk7aC#n*P%Oi?dG5L^1-hlm5(P&r2+cnG+!{_XV`;L8< zl|p)Pedy^d3gl4Zq{eg%;hsN&VW1 z*YjjpggMwY-|~3Adr8jW^cl@Ov{4xMvHHP;dHlW{U@^uuI}B#!zEBT+oebadmu;(T zo?I5REG^zcKLB?tC^&z^j$_l$2Lu>djULQa(#{(k8C0@jcH@Y5plQC>XSdZR<%2Fn zC1CnY9?x1zI@i^uFuX5uMtLaq!#%??TkQR2I!ifI;x}j8 zfr`BP^Q6sA8vDu}yITqBe`9jn(s4p+U@XAi4YXGwT!~ej6K_%!Fo)U1FJx5?IX7s? znI|z&$~=$$T+LNGw@LY9(K6|S?R%;K9(2@!slJPxmJQWG-*CpPI!DGkfnTM3=U`@k zo*N7*koGrw`pli4^pJpjgSMLFVm&}>!aSM4cPn7hzsL14QkK>UK(EW*q=T~B>6G2r z3kc0PU=Gmf_i1!^$IwY;XsZc*z39uQZd1T0?3v{XK|jR#Tw@inoudHrzw!~8x`ZUL zP>9mhb4GJ95$7l35USY0dK*R}JR4u>ysHdTTaV{r`q%*N4gv7}Dp8PMMD8}ve;U>< zz?5tAj*Jp>e1)7Dm#5|^+uIQ)R zX62|+|J^j_h#O};zES66?fadp5IKr-?2tmw=@pHfATcp)iM6Rfhw?q^hF;g%B>Ngy zio;8u$*OB7`R;LZ8jGhZ+?gbNu(sYscLxZv$G)#thMhWlfXW2Q$W_rJ(Q!NDXH0+x zQ3s->rPUy=JY3Vfy|$uMz(uPW}@g0hNlv$ z8ijAn!zVyZm6Y}Z3dOh3D#DU@xDFGReL@V#ku=QZMao^QT&DAIy!9xSy^UP-`SW&!tYS7JG zFuK6m-6-0VSp-+>X2;maXQ{4IlvcA2;7P8*nSegnv|P;nf$F9NvbhM?*;a6o)S^Gb z(#qjN-*PB$lw~&sFU;|DeLP1Jbw(%3@f$Qif%2~O;`X-ZWzTE(*kP+j%s0<2)Gc{o zZK-afhs+SDT!8Ina4zgiAp9*+$_7H7)cTEKJW8+e^gJKxMz$6cypGY^89fs|HazKi z9n3p~+HR|@$_yMOa9sUnF;{1K)uoFj5JlS{O;LE*{bHusUdI3Tf@H8^QTqikAog%~ zKpdW@gb&u4i17=8{|9yEsYL~NCnUb3#Jq@Qp#7zhik~?7U0OP-<_c7yiHiuw$`g5h z4Dk+W4~Sojj=p;}luTuL6Lg+6F>9i|YRt#X8cuo(eUrk>Z>~;aJ7ZEaCnWA`MdBc) zfcc&Z3TO&v%@gFl5^ijq;B^ zvz8RN(2l6Y91W9g(>MrZChD2F_&#rCv~!t_YmXK2dn;Sfp`KiR*b4t{fjQf3Q%`r#62E zj5SJx>6Fh)rVp`o2&;!MR!DuBI_q1wKrBVwev-|v@UfT;AjKp)rCR(I^k*jgDeg(( zdIc?W4ny#lvCc_WrNwMjR|zJNNMLrso)T%|FFxc4pSXieYJ+Job9`0RJB;*H!b0G7 zyjcJul}ATXgRQD@Yuqc@Nx`3oT8^GKT7Y2wB1^J~i?05JS~|{5gv0O!nY8;jhq0iY zVPoNDo!<0;UZgQ{97H7O8$7r_f}$GyC*2ad(Cb5O_SsS6e2xlbCFI@169mKacNBKf zncO?#D0m>Z?KHU#0TyrHUQLXd?I=E6L`*jy4f(hrAVIealGr`&NqObgCPsaV$ z8;05!V_^4BID!xGSMV_+$cnGE^*&HvV`wNmYWa_4B{2+)8oakTZumHz++1AiUv>v2 z#nF>*L#C+#6)*VlrjjSHLTcbM41+%nJ9?1D{^dNxjG)t8k0`ncWIu@OM^XynqfH0G z=WwG`Md9|NH0e)Y7u}|NWi1mh^%BJSW&Nd4yG7L! zA@u}#ogp?Nh4ArWVO%kyr}loh$H1|nzQ_RWz(EfYHvCCq4=quN)z(Gd%sNZ1qRFGv z^hc>BnG`qrT+|>4Uw)fXDcX!5DHZN5M4oHh9*!Q7CqcvjL}A1_)JxPVR25u2+)p?i^lS|4 zjQzB!bd8Ey${wkDsmttcR2Kpl#CSw_%6N}-o^&?yFDaL)RVk|sp31*snxmUTn+rX1 zuLX`#W=*Z`t%|L_j&!B*r;5=rQZLcp$!;nKg+9Uml|yqxGeC1j^F_la5N8H5Q>wdb z2p1WZcd5uoTc?ikYU3_oEdZ)=wYDl{Dm^PsHT{bw%L~eaR3K8cGL})_vJVJrMQa6D zNmp~5gOA&f#-}&RAC)+jT~aqW16dJJ!<{1SBRwNC-+@s#0J0xpc8U*({ev?ecGPiyM}y+{LPI^Pz?Ji3a8#5efn?b(KWc-fBU|^ znzO>c4x)cqC;rQm)MvF;V?w20k|d9a4=;gCLFjI~FAkIXegCKr4lG7?rbLS=Ln@|L z3$L)>=Fje6xLl#+7Nq=-S)MTw-AEsaotO9R?|`NzO}OzLB(ed{M5IYv+ZmE2)-yjn z2;LdNB6l201nn}Usb78XPvsv(=a!oOv=Mt%G*z0SZdP*I7d0QUxQDKO-T~4G=ztAc z@B5-Vu`Zg*ttfNbRp&NiZ?^jV+^pKthCKh^v*imA8R6#*MAthXKqK*C3<_ro+!3&|sV3VO#qfx35<~sF#wVm#wXr zv7ndFub0-Mm+PsQd81c|xtyG^oTa>+{`$UVUrwz(!b9^**P7>RzFx_3TK;;vTtKm$ zGI}yV@QugpOa4lP@k+wRO1RicT=z;;;7ZanAOryr9S->N5fBdngwX{r(}c7_!*5CkfA>g#46{`oCAdW=8fv-O$1Et7)?S0IJTuYb}cw|G&rE{b=#ln zcJ1qS4CYi+WlZDI*ue}(LFN#t^cb$&^Ceg#i;iA!~bT6jrXc!gwoNoab7xphgg zb%h{ti7#=5-h273_iFgwj`wgXy8!hHIC13FsTn2m{qdX#eajU}YW!4kITQvWO?tT;Vf8g(x{~xTU8MmMO%erSx?CP6!SO0-5{u$k4 zCf4#NV_{_?ECrJF}4UgOzZ`I+?ZFg9Uc||hEIS~1iw|&Yk-GO)NhbQ mX4Rts (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || $active[type]() + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var fallback = type == 'next' ? 'first' : 'last' + var that = this + + if (!$next.length) { + if (!this.options.wrap) return + $next = this.$element.find('.item')[fallback]() + } + + if ($next.hasClass('active')) return this.sliding = false + + var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) + this.$element.trigger(e) + if (e.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + this.$element.one('slid.bs.carousel', function () { + var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) + $nextIndicator && $nextIndicator.addClass('active') + }) + } + + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one($.support.transition.end, function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0) + }) + .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger('slid.bs.carousel') + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + var old = $.fn.carousel + + $.fn.carousel = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { + var $this = $(this), href + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + $target.carousel(options) + + if (slideIndex = $this.attr('data-slide-to')) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + }) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + $carousel.carousel($carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.1.1 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.transitioning = null + + if (this.options.parent) this.$parent = $(this.options.parent) + if (this.options.toggle) this.toggle() + } + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var actives = this.$parent && this.$parent.find('> .panel > .in') + + if (actives && actives.length) { + var hasData = actives.data('bs.collapse') + if (hasData && hasData.transitioning) return + actives.collapse('hide') + hasData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing') + [dimension](0) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in') + [dimension]('auto') + this.transitioning = 0 + this.$element.trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + [dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element + [dimension](this.$element[dimension]()) + [0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse') + .removeClass('in') + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .trigger('hidden.bs.collapse') + .removeClass('collapsing') + .addClass('collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one($.support.transition.end, $.proxy(complete, this)) + .emulateTransitionEnd(350) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + var old = $.fn.collapse + + $.fn.collapse = function (option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && option == 'show') option = !option + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { + var $this = $(this), href + var target = $this.attr('data-target') + || e.preventDefault() + || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 + var $target = $(target) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + var parent = $this.attr('data-parent') + var $parent = parent && $(parent) + + if (!data || !data.transitioning) { + if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') + $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') + } + + $target.collapse(option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.1.1 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2014 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle=dropdown]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $('