Compare commits

246 Commits
Author SHA1 Message Date
mzaxd 884527f55b feat: 集成OnlyOffice转换功能,优化企业标准草稿生成PDF流程
- 新增SysOnlyOfficePdfUtil类,实现文档转PDF功能
- 在ProcessESRevisionEndListener中集成新功能,优化PDF生成逻辑- 添加dom4j依赖,用于解析OnlyOffice返回的XML数据- 修改convertAndSavePdfFile方法,支持从远程URL转换文档为PDF
- 优化docFileTransferPdf方法,提高转换效率并避免重复转换
2024-10-16 15:04:47 +08:00
mzaxd 189c4e4ed8 feat: 为车辆、机器和特殊采购审批流程实体类添加附件和抄送人员字段
- 在 ProcessCarEsApproval、ProcessMachineEsApproval 和 ProcessSpecialEsApproval 三个实体类中
- 新增附件和抄送人员字段,使用 @Dict 注解进行字典转换
- 附件字段关联 sys_oss 表的 fileName 和 id 字段
-抄送人员字段关联 sys_user表的 realname 和 id 字段
2024-10-16 14:50:07 +08:00
sunzheng 88bd382fec Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-10-15 18:11:15 +08:00
sunzheng 4c1e4466dd update:修改法规释疑库 2024-10-15 18:11:06 +08:00
梁琦涛 9c20c91b8f 修改外部对接接口 2024-10-15 18:09:53 +08:00
梁琦涛 90d5ddcf12 修改外部对接接口 2024-10-15 17:37:43 +08:00
sunzheng e92f264edd update:整车型号导入接口添加字典翻译 2024-10-15 17:10:18 +08:00
lijiarao ff5f034818 fix 90669 企业标准计划库--查询后勾选导出,导出的是查询的数据 2024-10-15 17:02:46 +08:00
lijiarao 2d2500ed7e fix 90615 企标年度制修订计划流程-导入的把新增的覆盖了,两个企标并不重复 2024-10-15 16:56:11 +08:00
梁琦涛 1ad70febd5 添加外部对接标准法规信息/文本接口 2024-10-15 16:30:12 +08:00
梁琦涛 8679dfa3b7 添加外部对接标准法规信息/文本接口 2024-10-15 15:59:30 +08:00
梁琦涛 9d73779e64 Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-10-15 15:56:52 +08:00
梁琦涛 ff117e1f5f 添加外部对接标准法规信息/文本接口 2024-10-15 15:56:32 +08:00
sunzheng ad64e1ebb5 update:整车型号导入校验 2024-10-15 15:49:38 +08:00
lijiarao 2edadf4361 fix 90666 企业标准计划库--菜单名称、导出文件名称需调整 2024-10-15 15:25:39 +08:00
梁琦涛 992365a4e8 新法规导入流程修改日期为可维护 2024-10-15 14:53:10 +08:00
mzaxd 5f7fdf0667 fix: 设置审核任务通过标志
在处理审核任务时,除了设置任务为未开放外,还应当设置一个通过标志。此变更确保在任务被处理后,相关系统或用户可以明确知道该任务已经通过审核。
2024-10-15 11:00:09 +08:00
mzaxd 6425a30388 feat: 在会签节点驳回时同步更新 OPEN 变量
在 EsRevisionServiceImpl 类中,增加了一个额外的流程变量设置。当会签节点被驳回时,除了设置 PASS 变量外,还会设置 OPEN 变量。这确保了流程控制系统能够正确响应会签节点的驳回操作,进而可能影响其他节点的状态更新。
2024-10-15 10:46:25 +08:00
mzaxd b05d16db20 feat: 增加专业模块字段3 2024-10-15 09:51:36 +08:00
mzaxd bc74493135 feat: 增加专业模块字段2 2024-10-15 09:44:45 +08:00
mzaxd 6ab7f09320 feat: 增加专业模块字段 2024-10-14 17:24:06 +08:00
mzaxd 90e803fae6 feat: 制修订流程第二个节点支持驳回 2024-10-14 17:14:57 +08:00
mzaxd 15cfc5e3ca feat: 优化保存草稿返回信息
将保存草稿的返回信息从"ResultCommon.OK"更改为"操作成功",使用户能够更清楚地了解操作结果。
2024-10-14 16:02:49 +08:00
mzaxd 86dca29a44 feat: 在查询中增加专业化模块筛选条件
- 在LawsConformityAssessmentLibraryServiceImpl和LawsEvaluationNotMetLibraryServiceImpl中,分别为conformity和non-conformity查询添加了专业化模块(specialized_module)的筛选条件。
- 这个修改使得用户可以根据专业化模块进行更精确的查询,提高了系统的筛选功能和用户体验。
2024-10-14 16:00:40 +08:00
mzaxd ee58781ef2 feat: 法规符合性排查流程相关实体和数据库表增加专业模块字段
- 在LawsConformityAssessmentLibraryDetail、LawsEnterpriseStandard和LawsEvaluationNotMetLibrary实体类中添加specializedModule字段,用于表示专业模块
- 在数据库的process_standard_compliance_check_detail、laws_evaluation_not_met_library和laws_conformity_assessment_library_detail表中添加相应的specialized_module列
- 更新了测试阶段.sql文件,增加了相关数据库字段的修改语句
2024-10-14 15:42:54 +08:00
mzaxd 165ada1a24 feat: 保存草稿的时候返回draftId 2024-10-14 15:24:15 +08:00
mzaxd 1d255901d2 feat: 保存草稿的时候删除draftId的那条数据 2024-10-14 15:16:52 +08:00
lijiarao 380aad3fae update 导出文件增加密级 2024-10-14 15:03:11 +08:00
mzaxd af16e32228 feat: 四个流程结束后的入库相关处理
- 移除了 ProcessCarEsApprovalEndListener、ProcessESRevisionEndListener、ProcessMachineEsApprovalEndListener 和 ProcessSpecialEsApprovalEndListener 类中的多余代码
- 删除了不再使用的 import 语句
- 将流程实例 ID 的获取和业务数据的查询逻辑简化
- 统一了不同审批类型结束后的处理逻辑,主要是发布企业标准
- 调整了企业标准的状态为“目前有效”
2024-10-14 11:59:07 +08:00
梁琦涛 3bf0b349c9 添加外部接口对接 2024-10-14 11:30:30 +08:00
梁琦涛 515c490d06 修改根据根据零件号获取关键零部件名称接口 2024-10-14 11:16:25 +08:00
梁琦涛 b943309642 Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-10-14 11:16:12 +08:00
mzaxd b6a32a3da4 fix: 修复三个审批流程发起报错问题
修改了CarEsApprovalServiceImpl、MachineEsApprovalServiceImpl和SpecialEsApprovalServiceImpl中的用户信息处理逻辑。将MAIN_DRAFT_USER的值从userInfoMap复制到result映射中,而不是直接在userInfoMap中进行操作,优化了多选人员转换为List并放入map的处理流程。
2024-10-14 10:46:39 +08:00
梁琦涛 2d65f23679 修改根据根据零件号获取关键零部件名称接口 2024-10-14 10:35:43 +08:00
mzaxd f90925250e feat: 新增测试工具类和测试用例
- 添加 AuthRequestUtil 类,用于处理登录和获取认证 token- 新增 MachineEsApprovalControllerTest 类,用于测试 MachineEsApproval相关接口
- 在 JeroSystemSingleApplication 中添加相关配置和依赖
2024-10-14 10:30:19 +08:00
mzaxd fdb9a748d4 style: 删除冗余方法并简化receiveFile方法参数
删除了冗余的receiveFileBefore方法,简化了新的receiveFile方法的参数列表。现在,receiveFile方法只接受fileId和fileNm两个参数,这将使得代码更加清晰和易于维护。
2024-10-14 10:29:00 +08:00
mzaxd 8a7c62a932 ci: 企标管理新增制修订类型字段并调整相关权限和字典- 在 LawsEnterpriseStandard 实体类中添加 revisionType 字段,用于表示制修订类型
- 在数据库中新增 esp_revision_type 字典,用于企标计划的制修订类型
- 为企标管理表新增制修订类型字段
-调整前端权限,新增查看征求意见的权限
- 修改字典管理,更新企标计划的字典配置
2024-10-14 10:28:03 +08:00
sunzheng 710fa7ca23 update:修改社团管理验收问题 2024-10-12 18:53:38 +08:00
mzaxd 433e03723a feat: 优化查询效率并增加用户模糊查询功能
重构了 EsRevisionAdviceService 的 adviceList 方法,通过分离用户查询逻辑,避免了直接使用 createUserId 进行模糊查询可能导致的效率低下问题。新增了用户模糊查询功能,能够在不牺牲性能的情况下,根据 createUserId 检索对应的用户并获取其 id 列表,再进行精确查询。这一改动改善了代码的可维护性,并增强了查询功能。
2024-10-12 17:50:07 +08:00
fengchenchen d9bbc140d9 Merge branch 'master' into SecondStage 2024-10-12 17:31:34 +08:00
梁琦涛 a641540e4d 添加零件信息定时任务同步 2024-10-12 16:41:07 +08:00
mzaxd bd30ab964d feat: 新增企业标准征求意见列表功能
- 在 EsRevisionAdviceService 接口中添加 adviceList 方法,用于获取征求意见列表
- 实现 EsRevisionAdviceServiceImpl 中的 adviceList 方法,实现列表查询逻辑
- 在 LawsEnterpriseController 中添加 adviceList 接口,提供前端访问
- 该功能允许按标准 ID、批次号、创建用户 ID 和处理意见进行查询,并支持分页
2024-10-12 16:39:59 +08:00
mzaxd 111db69735 fix: 解决onlyoffice一进去就报错 2024-10-12 16:11:25 +08:00
mzaxd 1d74832ae0 feat: 在线编辑启用SpireDoc纵向页面设置和罗马数字页码
此代码更改启用了SpireDoc库的纵向页面设置和罗马数字页码功能。通过设置PageOrientation.Portrait,文档的每一页都被设置为纵向。此外,还为文档的每一页设置了罗马数字样式的页码。此更改仅在文档处理模块中生效,不影响其他功能。
2024-10-12 15:28:13 +08:00
mzaxd 7a06e8d99e feat: 新增 CurrentUserUtil 工具类,用于获取和绑定当前用户信息
- 添加 CurrentUserUtil 类,实现获取当前用户信息的功能
- 提供获取用户 ID、用户名、真实姓名、部门和角色的方法- 实现绑定临时用户和清理当前线程用户信息的方法
- 用于解决在多线程环境下正确获取当前用户信息的问题
2024-10-12 15:22:54 +08:00
mzaxd 3766cfe8ab Revert "feat: 在线编辑将文件接收接口改为GET请求方式并添加参数注解"
This reverts commit 0dac72f35c.
2024-10-12 15:15:54 +08:00
mzaxd 0dac72f35c feat: 在线编辑将文件接收接口改为GET请求方式并添加参数注解 2024-10-12 14:56:36 +08:00
mzaxd dbc80ed443 feat: 修正返回文件信息的类型
根据最新需求,/obtainLastFile接口现在返回OSSFile对象而不是id。这提供了更多文件信息,而不仅仅是文件ID。
2024-10-12 14:44:53 +08:00
mzaxd 8b31296940 doc: 在README文档中添加树形组织架构导入校验与Id转换的详细说明和示例代码 2024-10-12 14:25:51 +08:00
mzaxd 9207930efd feat: 在线编辑根据id获取最新版本的文件信息 2024-10-12 14:15:41 +08:00
mzaxd 1ba4b22318 feat: 在线编辑根据id获取最新版本的文件信息 2024-10-12 14:12:04 +08:00
梁琦涛 53d4cf6fa3 添加零件信息-分页列表查询接口 2024-10-12 10:38:10 +08:00
梁琦涛 56404b3610 完善关键零部件型号库 2024-10-11 17:52:56 +08:00
梁琦涛 e679eb07de 完善关键零部件型号库 2024-10-11 16:37:52 +08:00
lijiarao 76fca0b7fe add 定时任务 企标计划更新项目状态为逾期 2024-10-11 16:28:17 +08:00
梁琦涛 66d7e385e6 修改通过条款号获取最新拆分的条款排序 2024-10-11 16:27:23 +08:00
梁琦涛 d1c75efb17 关键零部件绑定关系管理添加责任部门验证 2024-10-11 16:19:21 +08:00
梁琦涛 32f9f50e3f Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-10-11 15:32:27 +08:00
梁琦涛 e31591c4c6 完善导入通知 2024-10-11 15:32:12 +08:00
lijiarao e73a23cfb7 update 企标计划变更流程 导入判断企标编号是否重复 2024-10-11 15:21:01 +08:00
梁琦涛 865a3b9cc0 完善导入通知 2024-10-11 15:05:35 +08:00
梁琦涛 b061776fb9 完善导入通知 2024-10-11 15:02:51 +08:00
梁琦涛 68bf81895b 完善关键零部件型号申请流程 2024-10-11 11:51:24 +08:00
lijiarao 9e26f7a727 update 企标计划变更流程 2024-10-11 11:41:37 +08:00
lijiarao ddc6f04bd1 update 企标计划变更流程 2024-10-11 09:14:27 +08:00
lijiarao 3f0ba155ac add 企标计划变更流程关联标准-通过processId删除 2024-10-10 18:00:35 +08:00
lijiarao 540340b2fa update 企标计划变更流程关联标准-分页列表查询 2024-10-10 17:57:48 +08:00
fengchenchen c58fb3ae44 Merge branch 'master' into SecondStage 2024-10-10 17:43:19 +08:00
梁琦涛 40c829600d 关键零部件型号库-列表查询添加翻译 2024-10-10 17:32:57 +08:00
lijiarao 24e4a37699 update 企标计划变更流程关联标准-提交 2024-10-10 17:01:33 +08:00
lijiarao 43e34a9991 update 企标计划变更流程关联标准-授权人审批 2024-10-10 16:29:39 +08:00
lijiarao b5225ae796 update 企标计划变更流程关联标准-分页列表查询 2024-10-10 16:24:54 +08:00
梁琦涛 7169129168 完善关键零部件型号申请流程确认生成接口 2024-10-10 16:11:41 +08:00
mzaxd ae0a635edc feat: 整车企业标准报批流程 2024-10-10 15:53:35 +08:00
mzaxd 2f742b6a5a feat: 整机企业标准报批流程 2024-10-10 15:46:53 +08:00
lijiarao c0085d7a83 update 企标计划流程 导入时判断部门的层级 2024-10-10 15:39:43 +08:00
梁琦涛 6991d75ba5 完善关键零部件型号库 2024-10-10 15:33:06 +08:00
mzaxd a54c74218e fix: 专业技术企业标准报批流程基类 2024-10-10 14:57:57 +08:00
mzaxd 42ff75b3ea feat: 专业技术企业标准报批流程 2024-10-10 14:50:37 +08:00
lijiarao 05b4cce7c6 update 企标计划变更流程 导入 2024-10-10 14:25:01 +08:00
lijiarao 209b93a0f3 update 企标计划变更流程 导入 2024-10-10 14:20:08 +08:00
梁琦涛 63829e2bc9 完善新法规导入流程 2024-10-10 14:08:21 +08:00
梁琦涛 9f87893556 修改关键零部件绑定关系管理 2024-10-10 13:54:14 +08:00
mzaxd 718af5bfe7 perf: 企标外标导入部门验证优化 2024-10-10 13:42:21 +08:00
梁琦涛 f2c9e15023 修改关键零部件型号库-替换 2024-10-10 11:59:41 +08:00
mzaxd 726815123e feat: 在线编辑文件接收改为后端主动下载 2024-10-10 10:30:31 +08:00
sunzheng ee647da320 update:修改社团管理导出全部压缩包的层级 2024-10-10 10:23:52 +08:00
梁琦涛 2225925ed8 完善关键零部件型号申请流程 2024-10-10 10:18:14 +08:00
mzaxd bc42bfbbe1 feat: 在线编辑文件接收改为后端主动下载 2024-10-10 10:14:30 +08:00
梁琦涛 cd39e13752 完善关键零部件型号申请流程 2024-10-09 18:51:50 +08:00
梁琦涛 e01672d80d 添加导入通知功能 2024-10-09 18:41:49 +08:00
梁琦涛 bd49556fcb 完善关键零部件型号申请流程 2024-10-09 18:17:10 +08:00
梁琦涛 0bcc348998 验证条款是否存在修改 2024-10-09 18:09:55 +08:00
sunzheng 19ff0e7493 update:修改法规释疑库查询详情 2024-10-09 17:54:57 +08:00
lijiarao 5792b75fe2 update 企标计划变更流程关联标准-分页列表查询 2024-10-09 17:20:33 +08:00
mzaxd e1112bd3e5 feat: 在线编辑文件加载方式改为手动解码 2024-10-09 16:12:28 +08:00
mzaxd 9ebe71d162 feat: 在线编辑文件加载方式改为URI 2024-10-09 15:53:04 +08:00
梁琦涛 947b075ae0 完善关键零部件型号申请流程 2024-10-09 15:32:23 +08:00
mzaxd 2d3e0e46a8 fix: 在线编辑修订报错 2024-10-09 14:29:11 +08:00
梁琦涛 87c049f1bc 完善关键零部件型号申请流程 2024-10-09 14:25:12 +08:00
lijiarao b38c242af7 update 第二阶段.sql 2024-10-09 14:02:14 +08:00
lijiarao 184adcdcbc update 企标计划变更流程表-查询流程信息 2024-10-09 14:01:45 +08:00
梁琦涛 10bcaeafad 完善关键零部件型号申请流程 2024-10-09 14:00:01 +08:00
mzaxd 75436cf57b feat: 在线编辑文件相关 2024-10-09 12:02:32 +08:00
梁琦涛 6e92938904 完善关键零部件型号申请流程 2024-10-09 11:45:34 +08:00
mzaxd 481579bbb1 feat: 在线编辑文件改为文件服务器存储 2024-10-09 11:16:12 +08:00
梁琦涛 dd13201ce3 完善关键零部件型号申请流程 2024-10-09 10:57:23 +08:00
mzaxd d5804ef698 fix: 外来标准库多线程排序问题 2024-10-09 09:56:33 +08:00
梁琦涛 0147632684 确认生成添加重复验证 2024-10-09 09:45:22 +08:00
sunzheng 8653321788 update:修改法规释疑库查询单个接口 2024-10-09 09:42:03 +08:00
sunzheng 50c6f600fb Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-10-08 19:32:02 +08:00
sunzheng 14003fdb5b update:法规释疑库提交前校验 2024-10-08 19:31:46 +08:00
梁琦涛 6b30ad461c 关键零部件型号申请流程修改 2024-10-08 18:47:50 +08:00
梁琦涛 384645ae57 关键零部件型号库编辑与新增修改 2024-10-08 18:44:35 +08:00
梁琦涛 16d80d927e 添加问题新增校验 2024-10-08 18:29:29 +08:00
梁琦涛 3efe9f4bb7 添加问题新增校验 2024-10-08 18:10:55 +08:00
梁琦涛 bf9be359d4 添加问题新增校验 2024-10-08 18:08:19 +08:00
梁琦涛 203aff8f53 添加名称 2024-10-08 18:05:43 +08:00
梁琦涛 c9ef94a1a1 添加标准id 2024-10-08 18:04:09 +08:00
mzaxd 80fa1b61f0 feat: 征求意见流程结束后生成征求意见稿 2024-10-08 17:14:13 +08:00
梁琦涛 9e6431824a 添加问题新增添加选择条款分页列表 2024-10-08 16:25:38 +08:00
lijiarao c820aa73d9 update 企标计划变更流程 2024-10-08 16:14:10 +08:00
lijiarao b2f1f61b88 update 企业标准年度制修订计划导入导出 改用模板 2024-10-08 16:09:33 +08:00
lijiarao 2808c5e97a update 导出改用旧版本HSSF 2024-10-08 16:08:57 +08:00
梁琦涛 f7e187832d 添加生产厂家列表接口 2024-10-08 14:48:47 +08:00
梁琦涛 5009c6ec2d 添加确认生成接口 2024-10-08 14:28:38 +08:00
梁琦涛 10713b9a16 添加确认生成接口 2024-10-08 14:26:48 +08:00
mzaxd 90872761d8 feat: 征求意见流程汇总意见节点显示所有意见 2024-10-08 13:51:10 +08:00
梁琦涛 4049bfea09 修改导出导入excel类型 2024-10-08 11:59:02 +08:00
梁琦涛 5d3a7fda8a Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-10-08 11:53:59 +08:00
梁琦涛 821aa7baa9 修改关键零部件型号申请流程 2024-10-08 11:53:54 +08:00
mzaxd cfcc6584f7 fix: 征求意见流程转办问题 2024-10-08 11:40:25 +08:00
梁琦涛 959d938ae0 修改根据零件号获取关键零部件名称 2024-10-08 11:38:43 +08:00
mzaxd ca05394a9e fix: 征求意见轮数一直为1 2024-10-08 11:20:15 +08:00
mzaxd d9694f1e72 fix: 派号标准号重复问题 2024-10-08 11:09:42 +08:00
lijiarao 63c2d71ce5 add 企标计划变更流程 2024-10-08 10:15:40 +08:00
lijiarao 99d28de428 add 企标计划变更流程 2024-10-08 10:08:22 +08:00
fengchenchen fc8aa97318 Merge branch 'master' into SecondStage
# Conflicts:
#	db/update/测试阶段.sql
2024-10-08 09:31:07 +08:00
梁琦涛 d4c0f18c38 完善关键零部件型号库申请流程 2024-09-30 16:45:11 +08:00
梁琦涛 411cc512cd 完善关键零部件型号库申请流程 2024-09-30 16:40:42 +08:00
梁琦涛 9388f41187 完善关键零部件型号库申请流程 2024-09-30 16:15:59 +08:00
梁琦涛 89100425bb 完善关键零部件型号库 2024-09-30 10:12:31 +08:00
梁琦涛 7cf884f6de 完善关键零部件型号库 2024-09-29 19:27:03 +08:00
梁琦涛 d588f3d193 添加关键零部件型号申请流程 2024-09-29 18:22:11 +08:00
sunzheng 2a29683266 add:新增国际整车型号管控库和流程相关代码 2024-09-29 17:58:27 +08:00
lijiarao eef5b81d3c add 企标计划变更流程 基础代码 2024-09-29 17:16:07 +08:00
mzaxd 4e3345eea5 feat: 处理意见提出人和意见反馈日期 2024-09-29 17:05:03 +08:00
mzaxd b7d9f98b4a feat: 制修订流程自动完成定时任务 2024-09-29 17:05:02 +08:00
梁琦涛 a70e1b28fb 完善关键零部件型号库功能 2024-09-29 15:53:23 +08:00
mzaxd d4a64978b7 fix: 默认轮数 2024-09-29 15:39:33 +08:00
mzaxd 4dd8e46ec6 fix: 发消息找不到主起草人 2024-09-29 15:09:15 +08:00
lijiarao 9fa7d5d7af update 文档拆分的表格 单元格合并判断 2024-09-29 11:38:10 +08:00
lijiarao 3cb464d714 add update 年度制修订计划流程 提交时保存快照 2024-09-29 09:37:23 +08:00
lijiarao b71646c8a1 add /sys/user/pageDecrypt 取消脱敏的用户分页查询 2024-09-29 09:26:54 +08:00
sunzheng b76031bb1a update:国内整车型号和库新增导出接口;调整替换接口; 2024-09-27 18:10:08 +08:00
lijiarao 7ac917122e update 年度制修订计划流程 转办处理 2024-09-27 18:06:16 +08:00
lijiarao 2e0d2a1892 update 年度制修订计划流程 完成时 推送计划到企标计划模块 2024-09-27 17:15:30 +08:00
lijiarao a360b6a37a update 年度制修订计划流程 联调 2024-09-27 15:29:19 +08:00
梁琦涛 59949d4d6a 修改关键零部件型号库 2024-09-27 15:15:38 +08:00
sunzheng 58c0e4f4aa update:法规释疑库按id查询返回标准列表和条款列表 2024-09-27 14:54:53 +08:00
梁琦涛 0888b7faec 关键零部件型号库 2024-09-27 14:37:43 +08:00
lijiarao a75be11588 update 年度制修订计划流程 联调 2024-09-27 14:23:55 +08:00
lijiarao 22df26da16 update 年度制修订计划流程 完成时 推送计划到企标计划模块 2024-09-27 13:49:44 +08:00
mzaxd b40eabe610 fix: 制修订流程最后一个节点判断标准编号是否重复 2024-09-27 11:07:53 +08:00
mzaxd baa03931fb fix: 制修订流程没有存上流程实例ID 2024-09-27 10:52:31 +08:00
lijiarao 0374e7c890 update 年度制修订计划流程 增加快照 2024-09-27 10:48:30 +08:00
lijiarao af0b232a25 update 年度制修订计划流程关联标准 查询报错 2024-09-27 10:45:41 +08:00
mzaxd 5893182257 fix: 制修订流程没有存上流程实例ID 2024-09-27 10:36:33 +08:00
mzaxd 25aec2d125 feat: 外标多选负责人 2024-09-27 10:00:17 +08:00
梁琦涛 b11235d06a 添加同步关键零部件数据定时任务 2024-09-27 09:52:34 +08:00
梁琦涛 f5e5d88fc2 修改关键零部件绑定关系管理 2024-09-26 20:08:40 +08:00
sunzheng 4948bb491b update:完善国内整车型号流程和国内整车型号管控库 2024-09-26 16:28:31 +08:00
lijiarao 0f760583af update 年度制修订计划流程 条款列表翻译 2024-09-26 16:16:17 +08:00
梁琦涛 452bbf6778 关键零部件数据修改 2024-09-26 16:06:20 +08:00
lijiarao bcf4e8f935 update 登录后解密邮箱 2024-09-26 16:02:46 +08:00
lijiarao cb8e93361a update 年度制修订计划流程启动时,补充人员信息 2024-09-26 14:54:01 +08:00
梁琦涛 552205b37d 添加同步关键零部件数据 2024-09-26 11:29:35 +08:00
lijiarao c1f43075f0 add 年度制修订计划流程-查询流程信息 2024-09-26 11:26:02 +08:00
sunzheng fb3559aadb update:法规释疑库保存前校验(未具体实现) 2024-09-26 10:04:32 +08:00
梁琦涛 7c116ee80f Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-09-25 18:14:40 +08:00
梁琦涛 2e6c7d9627 完善关键零部件绑定关系管理 2024-09-25 18:14:27 +08:00
sunzheng 0575126734 add:国内整车型号和VIN前八位管控流程相关代码 2024-09-25 18:13:52 +08:00
lijiarao 5dd2159c9e update 年度制修订计划流程 发起流程 2024-09-25 17:10:29 +08:00
梁琦涛 ee8ec76b20 关键零部件绑定关系管理添加权限 2024-09-25 16:04:27 +08:00
梁琦涛 91bea54fe9 关键零部件绑定关系管理完善导入 2024-09-25 15:55:13 +08:00
lijiarao adf47c2494 add 年度制修订计划流程 基础代码 2024-09-25 15:18:25 +08:00
mzaxd 3046d65bf6 ci: 调整企标制修订流程意见相关字段 2024-09-25 15:07:03 +08:00
mzaxd cc6628faf2 ci: 调整企标制修订流程相关参数 2024-09-25 14:58:08 +08:00
mzaxd d8c8f85581 ci: 调整企标制修订流程相关参数 2024-09-25 14:54:41 +08:00
sunzheng 4df7f65417 Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-09-25 14:49:01 +08:00
sunzheng 5cb38987d5 update:法规释疑库保存/发布前添加标准号和条款号的校验(部分完成,差调用) 2024-09-25 14:48:14 +08:00
梁琦涛 b1b4670aaa 关键零部件绑定关系管理完善 2024-09-25 14:46:20 +08:00
梁琦涛 29baf0811a 关键零部件绑定关系管理完善 2024-09-25 13:42:51 +08:00
梁琦涛 ae1d6ab3ff 关键零部件绑定关系管理完善 2024-09-25 12:02:40 +08:00
mzaxd ac8c178349 ci: 调整接口文档名 2024-09-25 10:56:46 +08:00
mzaxd da71f32611 feat: 企标制修订流程最后一个节点判断标准编号是否重复 2024-09-25 10:34:48 +08:00
mzaxd e09bdb82e9 feat: 企标制修订流程结束企标状态为征求意见 2024-09-25 10:34:48 +08:00
sunzheng 89b9d15549 add:国内整车型号及VIN库部分代码;法规释疑库代码 2024-09-24 17:40:30 +08:00
lijiarao c1101e098e add 年度制修订计划流程 基础代码 2024-09-24 17:13:49 +08:00
lijiarao f07004ae35 add 年度制修订计划流程 基础代码 2024-09-24 17:13:32 +08:00
lijiarao 8b2365ebbc update 标准征求意见详情代码 2024-09-24 16:23:38 +08:00
mzaxd ec9bdc4942 feat: 企标制修订流程转换为动态字段 2024-09-24 14:40:52 +08:00
mzaxd 54dce5847a feat: 企标制修订流程流程流转相关代码 2024-09-24 14:40:52 +08:00
梁琦涛 8ff06e4c27 添加关键零部件绑定关系管理功能 2024-09-24 14:26:42 +08:00
lijiarao 4600d0f1f9 update 标准征求意见代码 2024-09-24 11:49:48 +08:00
mzaxd d6945b2825 fix: 企标制修订流程删除无用引入 2024-09-24 09:26:51 +08:00
sunzheng 8068617f77 update:完善社团导入验证 2024-09-23 18:15:02 +08:00
mzaxd b3d37f0dfc fix: 企标制修订征求意见流程更改企标计划 2024-09-23 16:57:59 +08:00
mzaxd e4d0e6b601 feat: 企标制修订征求意见流程初步准备 2024-09-23 16:56:38 +08:00
mzaxd a7516d5b95 feat: 在线编辑调整 无用代码删除 2024-09-23 16:54:30 +08:00
mzaxd 2446a51741 ci: 在线编辑调整1 2024-09-23 16:54:30 +08:00
sunzheng 0bd92a76eb update:补充导入前的表头校验 2024-09-23 11:33:20 +08:00
sunzheng 0427e9fa22 update:添加导入前的表头校验 2024-09-23 11:26:53 +08:00
sunzheng e43f3546d1 update:新增支付信息,工作组文件导入导出;修改导出全部;修改会议导入 2024-09-23 09:20:06 +08:00
fengchenchen 80b1cbcf85 Merge branch 'master' into SecondStage 2024-09-20 18:56:01 +08:00
lijiarao 239b126fc1 add 标准征求意见 swagger 2024-09-20 15:56:16 +08:00
lijiarao c7e3825e97 add 企标计划-分页列表查询无权限 2024-09-20 15:34:02 +08:00
lijiarao e3b222a6e3 add 标准征求意见 基础代码 2024-09-20 15:24:18 +08:00
sunzheng d960f2d482 add:新增企标废止发布流程 2024-09-19 17:53:12 +08:00
lijiarao 63b077a99a add 更新企标计划接口 2024-09-19 17:01:12 +08:00
sunzheng 4e24874fd3 update:修改用户名的字段返回值 2024-09-19 16:18:48 +08:00
lijiarao 1a658915f5 update 调整企标计划字段 2024-09-19 15:56:31 +08:00
sunzheng ea54febf1b update:下载模板,导入前验证是否有修改或新增社团信息的权限 2024-09-19 15:19:01 +08:00
lijiarao 07e059d34c update 调整企标计划字段 2024-09-19 14:39:25 +08:00
lijiarao ad65960303 update 文档拆分处理表格中的公式 2024-09-19 14:22:04 +08:00
sunzheng eca5251c66 update:修改参会信息的导入为接收一个压缩包 2024-09-19 13:59:03 +08:00
fengchenchen e70bf5ce52 Merge remote-tracking branch 'origin/SecondStage' into SecondStage 2024-09-19 11:43:45 +08:00
lijiarao 3c8bbf3725 add 企标计划 基础代码 2024-09-18 17:46:44 +08:00
sunzheng 1114e00ac3 update:社团管理导入结果添加翻译 2024-09-18 17:30:41 +08:00
fengchenchen 112258f333 Merge branch 'master' into SecondStage 2024-09-18 16:43:11 +08:00
lijiarao 029806d50f add 第二阶段.sql 2024-09-18 10:42:22 +08:00
sunzheng 7f2db3b7a7 update:新增社团添加唯一性校验;添加参会信息导入接口了;修改模板 2024-09-14 18:20:18 +08:00
sunzheng 14818f4854 add:社团管理,入团信息,会议信息,在研信息导出模板;
update:社团管理,入团信息,在研信息导入接口
2024-09-13 18:17:12 +08:00
sunzheng 1c8005c218 update:修改公司参与标准导出,去掉标题 2024-09-12 15:11:28 +08:00
sunzheng 9947fc2299 update:修改社团管理导出,按sheet页导出不同信息 2024-09-12 15:03:05 +08:00
sunzheng a8bf4a69b3 update:完善公司参与统计模块 2024-09-11 17:09:50 +08:00
sunzheng 787534b5c7 update:完善社团管理导入接口 2024-09-11 15:26:12 +08:00
sunzheng 15adf50290 add:社团管理-导入 2024-09-10 18:53:34 +08:00
sunzheng 30d183558e update:修改社团管理导入的请求方式为get 2024-09-10 15:15:15 +08:00
sunzheng 6a7a2a84a6 update:修改代码社团管理左侧查询树 2024-09-10 15:05:45 +08:00
sunzheng d03b4d165e update:修改代码;添加权限 2024-09-10 11:01:16 +08:00
sunzheng 3d7284736c add:社团管理相关代码 2024-09-09 18:16:19 +08:00
mzaxd 76ba22d25d style: 删除无用代码 2024-09-09 18:03:28 +08:00
mzaxd 81a1ddf772 style: 删除无用代码 2024-09-09 17:54:15 +08:00
mzaxd aace29fd2f feat: 企标复审相关基础代码 2024-09-09 17:42:15 +08:00
mzaxd ba9a30638f feat: 在线编辑模板管理相关基础文件 2024-09-09 17:42:14 +08:00
421 changed files with 26172 additions and 8045 deletions
+28
View File
@@ -130,3 +130,31 @@ QueryWrapper<?> queryWrapper = QueryGenerator.initQueryWrapper(?, req.getParamet
- 模板位置: src/main/resources/jero/code-template
- 文件配置路径: jero-boot/jero-boot-single-startup/src/main/resources/jero/jero_config.properties
#### 四、特殊注意事项
##### 1、树形组织架构导入校验问题
> 树形组织架构导入校验与Id转换可使用ImportUtil.class下的指定方法
```java
// 准备部门校验的数据
List<SysDepart> departList = sysDepartService.list();
Map<String, List<SysDepart>> sysDeaprtMap = departList.stream()
.collect(Collectors.groupingBy(SysDepart::getDepartName));
Map<String, String> sysDepartPathMap = SysDepart.buildPaths(departList);
// 相关校验转换逻辑
/**
* cellValue为需要校验的单元格中的内容
*/
if (!this.multiOrgValid(cellValue, sysDepartMap, sysDepartPathMap)) {
// TODO 校验失败,执行报错提示逻辑
} else {
// 校验成功 将部门名称转换为id
cellValue = this.convertMultiOrgId(cellValue, sysDepartMap, sysDepartPathMap);
}
```
- 为避免每次校验都重复准备部门相关数据,可将准备数据逻辑放入循环外,只执行一次
- 校验逻辑:如果部门名称唯一,则不需要填写全路径也可成功转换,如果出现重名,则必须填写全路径才能转换
+17
View File
@@ -532,6 +532,10 @@ CREATE INDEX pnl_idx_user_id ON process_node_link(`user_id`);
ALTER TABLE laws_document_split ADD PRIMARY KEY (id);
-- 2024-09-20 责任人改为多选弹窗
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `parent_id`, `item_text`, `en_name`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `is_tag_dict`, `is_read_only`, `attribute_type`, `del_flag`, `stat_node`, `en_base`) VALUES ('1694639979913162755', '1493098515761917954', '0', '多选用户弹框', 'Multiple selection a user', '19', '', 1, 1, 'admin', '2023-08-24 17:17:11', 'admin', '2023-08-24 17:41:25', NULL, 0, NULL, '0', NULL, NULL);
update laws_tag set field_show_type = '19' where db_field_txt = '责任人'
-- 2024-09-24 外来标准库增加 关联部门 字段长度
ALTER TABLE `laws_domestic_standard`
MODIFY COLUMN `associate_dept` text NULL COMMENT '关联部门';
@@ -585,3 +589,16 @@ INSERT INTO `sys_permission`(`id`, `parent_id`, `name`, `url`, `component`, `com
'897f89d79014d7fe019014d7fe2e0000', '修改清单版本', NULL, NULL, NULL, NULL, 2, 'marketStandard:editVersion', '1',
9.00, 0, NULL, 1, 1, 0, 0, NULL, 'ldq', '2024-10-10 11:57:57', 'ldq', '2024-10-10 11:58:06', 0, 0, '1', 0,
'Modify list version', NULL, NULL);
-- 20241014 修改驾驶位置修改成左/右舵
UPDATE `sys_dict` SET `dict_name` = '左/右舵' WHERE `id` = '1806891070589480961';
-- 20241014 法规符合性排查流程增加专业模块字段
ALTER TABLE `process_standard_compliance_check`
ADD COLUMN `specialized_module` varchar(36) NULL DEFAULT NULL COMMENT '专业模块';
ALTER TABLE `laws_evaluation_not_met_library`
ADD COLUMN `specialized_module` varchar(36) NULL DEFAULT NULL COMMENT '专业模块';
ALTER TABLE `laws_conformity_assessment_library_detail`
ADD COLUMN `specialized_module` varchar(36) NULL DEFAULT NULL COMMENT '专业模块';
+323
View File
@@ -0,0 +1,323 @@
create table laws_enterprise_standard_plan
(
id varchar(36) not null comment '主键id',
revision_type varchar(50) comment '制修订类别',
project_type varchar(50) comment '项目类型',
standard_id varchar(50) comment '标准id',
standard_number varchar(200) comment '标准编号',
standard_name varchar(200) comment '标准名称',
main_drafting_user varchar(50) comment '起草人',
depart_id varchar(50) comment '所在部门id',
professional_module varchar(30) comment '专业模块',
draft_complete_date datetime comment '初稿完成日期',
draft_complete_flag tinyint default 0 comment '初稿完成标识',
plan_archiving_date datetime comment '计划归档日期',
plan_archiving_flag tinyint default 0 comment '计划归档标识',
have_english_version varchar(50) comment '是否有英文版',
committee varchar(500) comment '所属技术委员会',
actual_archiving_date datetime comment '实际归档日期',
project_status varchar(50) default 1 comment '项目状态',
plan_status varchar(50) default 1 comment '计划状态',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag tinyint comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table laws_enterprise_standard_plan
comment '企标计划';
create table laws_standard_solicit_opinions
(
id varchar(36) not null comment '主键id',
standard_id varchar(36) not null comment '标准id',
standard_number varchar(200) comment '标准编号',
standard_name varchar(200) comment '标准名称',
applicable_market varchar(4) comment '适用市场',
start_time datetime comment '开始日期',
end_time datetime comment '截止日期',
number varchar(500) comment '征求意见反馈单编号',
file varchar(500) comment '意见反馈表',
process_complete_time datetime comment '流程完成日期',
create_by varchar(36) comment '创建人id',
create_time datetime comment '创建时间',
update_by varchar(36) comment '修改人id',
update_time datetime comment '修改时间',
org_code varchar(30) comment '部门code',
del_flag varchar(4) comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table laws_standard_solicit_opinions
comment '标准征求意见';
create table laws_standard_solicit_opinions_term
(
id varchar(36) not null comment '主键id',
solicit_opinions_id varchar(36) comment '征求意见id',
proposer_id varchar(36) comment '法规工程师',
professional_module varchar(30) comment '专业模块',
term_id varchar(36) comment '条款id',
term_num varchar(200) comment '标准编号/条款号',
term_name varchar(200) comment '标准名称/条款内容',
translation varchar(200) comment '译文',
before_modify varchar(500) comment '修改前',
after_modify varchar(500) comment '修改后',
reason varchar(500) comment '修改理由',
feedback_person_id varchar(500) comment '反馈人id',
feedback_person varchar(500) comment '反馈人',
feedback_opinion varchar(10) comment '反馈意见',
create_by varchar(36) comment '创建人id',
create_time datetime comment '创建时间',
update_by varchar(36) comment '修改人id',
update_time datetime comment '修改时间',
org_code varchar(30) comment '部门code',
primary key (id, solicit_opinions_id)
);
alter table laws_standard_solicit_opinions_term
comment '标准征求意见条款关联表';
create table process_annual_init
(
id varchar(36) not null comment '主键id',
depart_manager varchar(500) comment '部门经理',
standard_depart_handler varchar(36) comment '法规部门处理人id',
standard_depart_manager varchar(36) comment '法规部门经理id',
senior_manager varchar(500) comment '高级经理',
chief_inspector varchar(500) comment '总监',
authorized_person varchar(500) comment '授权人id',
file varchar(500) comment '附件',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag varchar(4) comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table process_annual_init
comment '年度制修订计划流程';
create table process_annual_init_link
(
id varchar(36) not null comment '主键id',
process_id varchar(36) comment '流程主表id',
revision_type varchar(50) comment '制修订类别',
standard_id varchar(50) comment '标准id',
standard_number varchar(200) comment '标准编号',
standard_name varchar(200) comment '标准名称',
main_drafting_user varchar(50) comment '起草人',
depart_id varchar(50) comment '所在部门id',
professional_module varchar(30) comment '专业模块',
draft_complete_date datetime comment '初稿完成日期',
plan_archiving_date datetime comment '计划归档日期',
have_english_version varchar(50) comment '是否有英文版',
committee varchar(500) comment '所属技术委员会',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag tinyint comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table process_annual_init_link
comment '年度制修订计划流程关联标准';
create table process_plan_change
(
id varchar(36) not null comment '主键id',
change_type varchar(1) comment '变更类型',
depart_manager varchar(500) comment '部门经理',
standard_depart_handler varchar(36) comment '法规部门处理人id',
standard_depart_manager varchar(36) comment '法规部门经理id',
senior_manager varchar(500) comment '高级经理',
chief_inspector varchar(500) comment '总监',
authorized_person varchar(500) comment '授权人',
file varchar(500) comment '附件',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag varchar(4) comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table process_plan_change
comment '企标计划变更流程';
create table process_plan_change_link
(
id varchar(36) not null comment '主键id'
primary key,
process_id varchar(36) null comment '流程主表id',
revision_type varchar(50) null comment '制修订类别',
plan_id varchar(36) null comment '企标计划id',
standard_id varchar(50) null comment '标准id',
standard_number varchar(200) null comment '标准编号',
standard_name varchar(200) null comment '标准名称',
main_drafting_user varchar(50) null comment '起草人',
drafting_user_new varchar(50) null comment '新起草人',
depart_id varchar(50) null comment '所在部门id',
depart_id_new varchar(50) null comment '新所在部门id',
professional_module varchar(30) null comment '专业模块',
draft_complete_date datetime null comment '初稿完成日期',
plan_archiving_date datetime null comment '计划归档日期',
draft_complete_date_change datetime null comment '初稿完成日期变更后',
plan_archiving_date_change datetime null comment '计划归档日期变更后',
have_english_version varchar(50) null comment '是否有英文版',
committee varchar(500) null comment '所属技术委员会',
change_reason varchar(500) null comment '变更原因',
create_by varchar(36) null comment '创建人',
create_time datetime null comment '创建时间',
update_by varchar(36) null comment '更新人',
update_time datetime null comment '更新时间',
org_code varchar(64) null comment '所属部门',
del_flag tinyint null comment '删除状态(0-正常,1-删除)'
);
alter table process_plan_change_link
comment '企标计划变更流程关联标准';
create table process_standard_solicit_opinions
(
id varchar(36) not null comment '主键id',
standard_id varchar(50) comment '标准id',
standard_number varchar(200) comment '标准编号',
standard_name varchar(200) comment '标准名称',
standard_text varchar(50) comment '标准文本',
applicable_market varchar(4) comment '适用市场',
end_time datetime comment '截止日期',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag varchar(4) comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table process_standard_solicit_opinions
comment '标准征求意见流程';
create table process_standard_solicit_opinions_term
(
id varchar(36) not null comment '主键id',
process_id varchar(36) comment '流程主表id',
professional_module varchar(30) comment '专业模块',
term_id varchar(36) comment '条款id',
term_num varchar(200) comment '标准编号/条款号',
term_name varchar(200) comment '标准名称/条款内容',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag varchar(4) comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table process_standard_solicit_opinions_term
comment '标准征求意见流程关联条款';
create table process_standard_solicit_opinions_user
(
id varchar(36) not null comment '主键id',
process_id varchar(36) comment '流程主表id',
term_id varchar(36) comment '流程条款表id',
parent_execution_id varchar(36) comment '父执行实例流id',
standard_professional_person varchar(36) comment '法规专业负责人',
depart_manager varchar(36) comment '部门经理',
depart_senior_manager varchar(36) comment '部门高级经理',
before_modify varchar(500) comment '修改前',
after_modify varchar(500) comment '修改后',
reason varchar(500) comment '修改理由',
feedback_opinion varchar(10) comment '反馈意见',
create_by varchar(36) comment '创建人',
create_time datetime comment '创建时间',
update_by varchar(36) comment '更新人',
update_time datetime comment '更新时间',
org_code varchar(64) comment '所属部门',
del_flag varchar(4) comment '删除状态(0-正常,1-删除)',
primary key (id)
);
alter table process_standard_solicit_opinions_user
comment '标准征求意见流程关联用户';
-- 企标计划-计划状态
INSERT INTO sys_dict (id, dict_name, dict_code, description, del_flag, create_by, create_time, is_tag_dict,
is_read_only)
VALUES ('1836301517254893569', '企标计划-计划状态', 'esp_plan_status',
'新增:新增计划入库 延期:初稿完成日期和计划归档日期延期 取消:计划取消 如走到初稿、征求意见流程了,计划不允许取消', 0, 'cheryrsm', '2024-09-18 15:09:33', 0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1836301610292944898', '1836301517254893569', '新增', '1', '', 1, 1, 'cheryrsm', '2024-09-18 15:09:55', 0, 0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1836301637493006338', '1836301517254893569', '延期', '2', '', 2, 1, 'cheryrsm', '2024-09-18 15:10:01', 0, 0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1836301659982864385', '1836301517254893569', '取消', '3', '', 3, 1, 'cheryrsm', '2024-09-18 15:10:07', 0, 0, 0);
-- 企标状态增加 征求意见 --
INSERT INTO `sys_dict_item` (`id`, `dict_id`, `parent_id`, `item_text`, `en_name`, `item_value`, `description`, `sort_order`, `status`, `create_by`, `create_time`, `update_by`, `update_time`, `is_tag_dict`, `is_read_only`, `attribute_type`, `del_flag`, `stat_node`, `en_base`) VALUES ('1696811980113661954', '1696811542077329409', NULL, '征求意见', 'Seek For Opinions', '2', '征求意见', 2, 1, 'admin', '2023-08-30 17:07:56', NULL, NULL, 1, 1, NULL, '0', NULL, NULL);
-- 企标计划变更-变更类型
INSERT INTO sys_dict (id, dict_name, dict_code, description, del_flag, create_by, create_time, is_tag_dict,
is_read_only)
VALUES ('1843464136587796482', '企标计划变更-变更类型', 'espc_change_type', '新增,取消,延期,人员变更', 0, 'cheryrsm', '2024-10-08 09:31:14',
0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, en_name, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1843464372399955969', '1843464136587796482', '新增', 'add', '1', '', 1, 1, 'cheryrsm', '2024-10-08 09:32:10', 0,
0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, en_name, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1843464482533990401', '1843464136587796482', '取消', 'cancel', '2', '', 2, 1, 'cheryrsm', '2024-10-08 09:32:37',
0, 0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, en_name, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1843464553690357761', '1843464136587796482', '延期', 'delay', '3', '', 3, 1, 'cheryrsm', '2024-10-08 09:32:54',
0, 0, 0);
INSERT INTO sys_dict_item (id, dict_id, item_text, en_name, item_value, description, sort_order, `status`, create_by,
create_time, is_tag_dict, is_read_only, del_flag)
VALUES ('1843464714877460481', '1843464136587796482', '人员变更', 'Person change', '4', '', 4, 1, 'cheryrsm',
'2024-10-08 09:33:32', 0, 0, 0);
-- 部署模板后 需要更新顺序
update process_model_node set sort = 1 where process_key = 'process-plan-change' and xml_node_id = 'qcrfq';
update process_model_node set sort = 2 where process_key = 'process-plan-change' and xml_node_id = 'bmjlsp';
update process_model_node set sort = 3 where process_key = 'process-plan-change' and xml_node_id = 'fgbmclrsp';
update process_model_node set sort = 4 where process_key = 'process-plan-change' and xml_node_id = 'fgbmjlsp';
update process_model_node set sort = 5 where process_key = 'process-plan-change' and xml_node_id = 'gjjlsp';
update process_model_node set sort = 6 where process_key = 'process-plan-change' and xml_node_id = 'zjsp';
update process_model_node set sort = 7 where process_key = 'process-plan-change' and xml_node_id = 'sqrsp';
update process_model_node set sort = 1 where process_key = 'process-annual-init' and xml_node_id = 'qcrfq';
update process_model_node set sort = 2 where process_key = 'process-annual-init' and xml_node_id = 'bmjlsp';
update process_model_node set sort = 3 where process_key = 'process-annual-init' and xml_node_id = 'fgbmclrsp';
update process_model_node set sort = 4 where process_key = 'process-annual-init' and xml_node_id = 'fgbmjlsp';
update process_model_node set sort = 5 where process_key = 'process-annual-init' and xml_node_id = 'gjjlsp';
update process_model_node set sort = 6 where process_key = 'process-annual-init' and xml_node_id = 'zjsp';
update process_model_node set sort = 7 where process_key = 'process-annual-init' and xml_node_id = 'sqrsp';
-- 文件表新增字段
ALTER TABLE `oss_file`
ADD COLUMN `onl_id` varchar(36) NULL COMMENT 'onlyOffice关联Id 每次在线编辑生成一个 历史版本均用' AFTER `bind_id`;
-- 添加查看征求意见按钮权限
INSERT INTO sys_permission (id, parent_id, name, menu_en, perms, perms_type, sort_no, menu_type, is_leaf, is_route, keep_alive, create_by, del_flag, hidden, create_time, status, always_show, internal_or_external) VALUES ('8989f8bc927fe66001927fe660fb0000', '1700076061557874690', '查看征求意见', 'View for comments', 'enterpriseStandard:adviceList', '1', 3.0, 2, true, true, false, 'chh', 0, false, '2024-10-12 16:44:17', '1', false, false);
-- 修改修订类型字典
UPDATE `laws_chery_dev`.`sys_dict` SET `dict_name` = '企标计划-制修订类型', `dict_en_name` = NULL, `dict_code` = 'esp_revision_type', `description` = '', `del_flag` = 0, `create_by` = 'ldq', `create_time` = '2024-09-05 09:32:49', `update_by` = NULL, `update_time` = NULL, `type` = NULL, `is_tag_dict` = 1, `is_read_only` = 0, `attribute_type` = '1', `order_num` = 35 WHERE `id` = '1831505732815413250';
-- 企标新增制修订类型字段
INSERT INTO `laws_tag` (`id`, `table_name`, `db_field_name`, `db_field_en_name`, `db_field_txt`, `order_num`, `db_field_name_old`, `db_is_key`, `db_is_null`, `db_type`, `db_length`, `db_point_length`, `db_default_val`, `dict_field`, `dict_table`, `dict_text`, `field_show_type`, `field_href`, `field_length`, `field_valid_type`, `field_must_input`, `field_extend_json`, `field_default_value`, `is_show_form_create`, `is_query`, `is_show_form`, `is_show_list`, `is_read_only`, `query_mode`, `main_table`, `main_field`, `update_by`, `update_time`, `create_time`, `create_by`, `converter`, `query_def_val`, `query_dict_text`, `query_dict_field`, `query_dict_table`, `query_show_type`, `query_config_flag`, `query_valid_type`, `query_must_input`, `sort_flag`, `show_area`, `is_show_laws_list`, `is_show_search`, `del_flag`, `is_model`, `dict_id`, `home_search_context_order`, `home_search_file_order`, `dict_field_search`, `dict_table_search`, `dict_text_search`, `usable_range`, `tree_first_href`, `import_sort`) VALUES ('1845652446329446401', 'laws_enterprise_standard', 'zhi4_xiu1_ding4_lei4_xing2', 'Revision Type', '制修订类型', 29, 'zhi4_xiu1_ding4_lei4_xing2', 0, 1, 'String', 100, NULL, NULL, 'esp_revision_type', NULL, NULL, '10', NULL, NULL, NULL, '0', NULL, NULL, 0, 0, 1, 0, 0, NULL, NULL, NULL, NULL, NULL, '2024-10-14 10:26:48', 'chh', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, '0', '1694631025451048961', NULL, 0, 0, '3', '1831505732815413250', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
@@ -351,4 +351,13 @@ public interface ISysBaseAPI extends CommonAPI {
List<DictModel> loadDictItemByKeyword(String dictCode, String keyword, Integer pageSize);
String translateByDictMap(Map<String, String> dictMap, String keys);
Map<String, String> getDepNamesByUserIds(List<String> userIdList);
/**
* 根据部门Id查询,当前和下级所有部门IDS
* @param departId
* @return
*/
List<String> getSubDepIdsByDepId(String departId);
}
@@ -219,4 +219,11 @@ public class ResultCommon {
public static final String TREE_NODE_EXISTS = "tree.node.exists";
// 当前节点下存在子集
public static final String NODE_EXIST_SUBSETS = "node.exist.subsets";
// 社团名称不能重复
public static final String CLUB_ALREADY_EXISTS = "club.already.exists";
// 根节点不能删除
public static final String ROOT_NODE_CANNOT_BE_DELETE = "root.node.cannot.be.delete"; // 根节点不能编辑
}
@@ -302,7 +302,10 @@ public class DictAspect {
String[] arr = dictCode.split(",");
String table = arr[0];
String text = arr[1];
String code = arr[2];
for (int i = 2; i < arr.length - 1; i++) {
text += "," + arr[i];
}
String code = arr[arr.length - 1];
String values = String.join(",", needTranslDataTable);
log.info("translateDictFromTableByKeys.dictCode:" + dictCode);
log.info("translateDictFromTableByKeys.values:" + values);
@@ -259,7 +259,11 @@ public class TranslationAspect {
continue; //跳过循环
}
if (!StringUtils.isEmpty(table) && StrUtil.isNotBlank(text)) {
tmpValue = commonAPI.queryTableDictTextByKey(table, text, code, k.trim());
if ("sys_user".equals(table)&&"realname".equals(text)&&"id".equals(code)){
tmpValue = commonAPI.translateUserRealNameFromTable(k.trim());
}else {
tmpValue = commonAPI.queryTableDictTextByKey(table, text, code, k.trim());
}
} else {
List<SysDictItemCore> listNew = listDict.stream()
.filter(o -> Objects.equals(o.getDictCode(), code) &&
@@ -0,0 +1,33 @@
package com.jero.common.system.base.config;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.jeecgframework.poi.excel.export.styler.ExcelExportStylerDefaultImpl;
/**
* 自定义excel导出格式,让标题左对齐
*/
public class JeroCustomExcelExportStyler extends ExcelExportStylerDefaultImpl {
public JeroCustomExcelExportStyler(Workbook workbook) {
super(workbook);
}
// 设置标题的左对齐样式
@Override
public HSSFCellStyle getHeaderStyle(short color) {
HSSFCellStyle headerStyle = (HSSFCellStyle) super.getHeaderStyle(color); // 确保 getHeaderStyle 返回的是 HSSFCellStyle
headerStyle.setAlignment(HorizontalAlignment.LEFT); // 左对齐
// 将 workbook 转换为 HSSFWorkbook,以便创建 HSSFFont
if (workbook instanceof HSSFWorkbook) {
HSSFWorkbook hssfWorkbook = (HSSFWorkbook) workbook;
HSSFFont font = hssfWorkbook.createFont(); // 创建 HSSFFont
font.setFontHeightInPoints((short) 10); // 设置字体大小为10
headerStyle.setFont(font); // 将字体设置到样式中
}
return headerStyle;
}
}
@@ -5,12 +5,15 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.common.api.vo.Result;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.base.config.JeroCustomExcelExportStyler;
import com.jero.common.system.query.QueryGenerator;
import com.jero.common.system.vo.LoginUser;
import com.jero.common.util.oConvertUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.shiro.SecurityUtils;
import org.jeecgframework.poi.excel.ExcelImportCheckUtil;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
@@ -97,12 +100,15 @@ public class JeroController<T, S extends IService<T>> {
// Step.3 AutoPoi 导出Excel
ModelAndView mv = new ModelAndView(new JeecgEntityExcelView());
//此处设置的filename无效 ,前端会重更新设置一下
mv.addObject(NormalExcelConstants.FILE_NAME, title);
mv.addObject(NormalExcelConstants.CLASS, clazz);
ExportParams exportParams=new ExportParams(title, title);
ExportParams exportParams = new ExportParams();
exportParams.setTitle("密级:核心商密□普通商密□内部资料■外部公开□");
exportParams.setType(ExcelType.HSSF);
exportParams.setSheetName(title);
exportParams.setStyle(JeroCustomExcelExportStyler.class); // 使用自定义的样式
// 导出xlsx
exportParams.setType(ExcelType.XSSF);
exportParams.setImageBasePath(upLoadPath);
mv.addObject(NormalExcelConstants.PARAMS,exportParams);
mv.addObject(NormalExcelConstants.DATA_LIST, object);
return mv;
@@ -224,4 +230,56 @@ public class JeroController<T, S extends IService<T>> {
}
return Result.error("文件导入失败!");
}
/**
* 通过excel获取导入数据
*
* @param request
* @return
*/
protected List<T> getExcelData(HttpServletRequest request, Class<T> clazz) {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
// 获取上传文件对象
MultipartFile file = entity.getValue();
//校验文件名
String originalFilename = file.getOriginalFilename();
if (originalFilename != null) {
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
if (!".xlsx".equals(substring)&&!".xls".equals(substring)) {
throw new JeroBootException("文件类型错误:" + "请上传.xlsx或.xls文件!");
}
} else {
throw new JeroBootException("文件错误:" + "文件名丢失,请上传正确的文件!");
}
ImportParams params = new ImportParams();
params.setSheetNum(1);
params.setTitleRows(1);
params.setHeadRows(1);
try {
//导入Excel格式校验,看匹配的字段文本概率
Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), clazz, params);
if (t == null) {
throw new JeroBootException("导入数据为空!");
}
if(!t){
throw new JeroBootException("文件格式有误,请下载模板后上传 ");
}
return ExcelImportUtil.importExcel(file.getInputStream(), clazz, params);
} catch (Exception e) {
if(Objects.isNull(e.getMessage())){
throw new JeroBootException("文件导入失败:请填写内容标题!");
}
log.error("文件导入失败:",e);
throw new JeroBootException("文件导入失败:" + e.getMessage());
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
throw new JeroBootException("文件导入失败!");
}
}
+6
View File
@@ -83,6 +83,12 @@
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
@@ -84,16 +84,12 @@ public class OSSFileController {
OSSFile file = ossFileService.getById(id);
LambdaQueryWrapper<OSSFile> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OSSFile::getBindId, id);
OSSFile pdfFile = ossFileService.getOne(queryWrapper);
if (file == null) {
return Result.error("未找到对应实体");
}
else {
result.setResult(file);
result.setSuccess(true);
if (pdfFile != null) {
file.setPdfId(pdfFile.getId());
}
}
return result;
}
@@ -62,6 +62,9 @@ public class OSSFile extends JeroEntity {
@ApiModelProperty(value = "docx文件对应的pdf文件 使用此字段绑定docx的版本")
private String bindId;
@ApiModelProperty(value = "onlyOffice关联Id 每次在线编辑生成一个")
private String onlId;
@TableField(exist = false)
@ApiModelProperty(value = "PDF版本对应的文件Id")
private String pdfId;
@@ -6,6 +6,7 @@ import com.jero.modules.oss.entity.OSSFile;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@@ -33,4 +34,5 @@ public interface IOSSFileService extends IService<OSSFile> {
Result<OSSFile> commonUpload(MultipartFile file, String bizPath);
void downloadAndViewWithWaterMark(String id, HttpServletResponse response);
}
@@ -1,5 +1,6 @@
package com.jero.modules.oss.service.impl;
import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.vo.Result;
@@ -8,6 +9,7 @@ import com.jero.common.constant.enums.LanguageEnum;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.vo.LoginUser;
import com.jero.common.util.CommonUtils;
import com.jero.common.util.IntekeyUtils;
import com.jero.common.util.MinioUtil;
import com.jero.common.util.oConvertUtils;
import com.jero.common.util.obs.ObsBootUtil;
@@ -16,16 +18,25 @@ import com.jero.modules.oss.entity.OSSFile;
import com.jero.modules.oss.mapper.OSSFileMapper;
import com.jero.modules.oss.service.IOSSFileService;
import com.jero.modules.system.util.MyStringUtils;
import com.jero.modules.system.util.SysWaterMarkUtil;
import me.zhyd.oauth.utils.UuidUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.ContentType;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;
import java.util.*;
@Service("ossFileService")
@@ -49,6 +60,11 @@ public class OSSFileServiceImpl extends ServiceImpl<OSSFileMapper, OSSFile> impl
@Value(value = "${jero.splitUrl}")
private String splitUrl;
@Resource
private SysWaterMarkUtil sysWaterMarkUtil;
private static final String FILE_VIEW_ERROR = "预览文件失败";
@Override
public void upload(MultipartFile multipartFile) throws IOException {
String fileName = multipartFile.getOriginalFilename();
@@ -349,7 +365,6 @@ public class OSSFileServiceImpl extends ServiceImpl<OSSFileMapper, OSSFile> impl
@Override
public Result<OSSFile> outUpload(HttpServletRequest request) {
Result<OSSFile> result = new Result<>();
String savePath = "";
String bizPath = request.getParameter("biz");
//sys/common/upload接口存在任意文件上传漏洞
@@ -405,4 +420,94 @@ public class OSSFileServiceImpl extends ServiceImpl<OSSFileMapper, OSSFile> impl
}
return result;
}
@Override
public void downloadAndViewWithWaterMark(@PathVariable String id, HttpServletResponse response) {
// 查询数据表数据是否存在
LambdaQueryWrapper<OSSFile> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(OSSFile::getId, id);
OSSFile ossFile = this.getOne(queryWrapper);
if (null == ossFile) {
throw new JeroBootException("文件不存在..");
}
String fileUrl = ossFile.getUrl();
// minio 下载
// 通过MinioUtil查询时 只需要桶后面的路径
String minioUrl = MinioUtil.getMinioUrl();
// Linux/unix 系统下文件路径分隔符为"/" 获取minio与存储桶的路径
minioUrl = minioUrl + MinioUtil.getBucketName() + "/";
String url = fileUrl.replace(minioUrl, "");
// 文件名称
String fileName = ossFile.getFileName();
response.addHeader("Content-Disposition", "attachment;fileName=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
// 设置强制下载不打开
response.setContentType("application/force-download");
// 然后在您的controller方法中:
InputStream watermarkedInputStream = null;
if (CommonConstant.UPLOAD_TYPE_MINIO.equals(uploadType)) {
try (InputStream inputStream = MinioUtil.getMinioFile(MinioUtil.getBucketName(), url);
OutputStream outputStream = response.getOutputStream()
) {
byte[] buf = new byte[1024];
int len;
if (inputStream == null) {
return;
}
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
response.flushBuffer();
} catch (Exception e) {
log.error(e.getMessage());
response.setStatus(404);
}
}else if(CommonConstant.UPLOAD_TYPE_OBS.equals(uploadType)) {
// 华为云 下载
if ("pdf".equalsIgnoreCase(FileUtil.extName(fileName))) {
try (InputStream originalInputStream = ObsBootUtil.getOssFile(fileUrl);
OutputStream outputStream = response.getOutputStream()) {
if (originalInputStream == null) {
return;
}
MultipartFile mFile = new MockMultipartFile(fileName, fileName,
ContentType.APPLICATION_OCTET_STREAM.toString(), originalInputStream);
InputStream inputStream = IntekeyUtils.getInputStreamByDecryptFile(mFile);
watermarkedInputStream = sysWaterMarkUtil.addWatermarkToPdf(inputStream);
byte[] buf = new byte[1024];
int len;
while ((len = watermarkedInputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
response.flushBuffer();
} catch (Exception e) {
log.error("error:",e);
response.setStatus(404);
}finally {
try {
if (watermarkedInputStream != null){
watermarkedInputStream.close();
}
} catch (IOException e) {
log.error(e.getMessage());
}
}
} else {
try (InputStream inputStream = ObsBootUtil.getOssFile(fileUrl);
OutputStream outputStream = response.getOutputStream()
) {
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
response.flushBuffer();
} catch (Exception e) {
log.error(FILE_VIEW_ERROR + e.getMessage());
response.setStatus(404);
}
}
}
}
}
@@ -181,7 +181,70 @@ public class SysUserController {
return result;
}
/**
* 获取用户列表数据
* @param user
* @param pageNo
* @param pageSize
* @param req
* @return
*/
@ApiOperationSupport(order = 1)
@ApiOperation(value="用户列表查询", notes="用户列表查询")
@PermissionData(pageComponent = "system/UserList")
@GetMapping("/pageDecrypt")
public Result<IPage<SysUser>> queryPageListDecrypt(SysUser user,
@RequestParam(name="departId", required = false) String departId,
@RequestParam(name="roleId", required = false) String roleId,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) {
Result<IPage<SysUser>> result = new Result<>();
// 处理手机号和邮箱,进行对应加密
Map<String, String[]> parameterMap = req.getParameterMap();
String groupId = req.getParameter("groupId");
this.sysUserService.encryptReqMapData(parameterMap);
user.setEmail(this.sysUserService.proceedEmailEncrypt(user.getEmail()));
user.setPhone(this.sysUserService.proceedPhoneEncrypt(user.getPhone()));
QueryWrapper<SysUser> queryWrapper = QueryGenerator.initQueryWrapper(user, parameterMap);
Page<SysUser> page = new Page<>(pageNo, pageSize);
List<String> subDepIds = null;
if (StrUtil.isNotEmpty(departId)){
subDepIds = sysDepartService.getSubDepIdsByDepId(departId);
}
if (StringUtils.isNotBlank(user.getRealnameOrUsername())){
queryWrapper.and(aw -> aw.like("realname", user.getRealnameOrUsername())
.or().like("username", user.getRealnameOrUsername()));
}
IPage<SysUser> pageList;
try {
pageList = sysUserService.queryPageDecrypt(page, subDepIds, roleId, groupId, queryWrapper);
}catch (Exception e){
log.error("操作异常:" + e.getMessage());
return Result.error(MessageUtils.getMessage(ResultCommon.ERROR));
}
//批量查询用户的所属部门
//step.1 先拿到全部的 useids
List<String> userIds = pageList.getRecords().stream().map(SysUser::getId).collect(Collectors.toList());
if(userIds!=null && !userIds.isEmpty()){
//step.2 通过 useids,一次性查询用户的所属部门名字
Map<String,String> useDepNames = sysUserService.getDepNamesByUserIds(userIds);
//step.3 通过 useids,一次性查询用户的角色名字
Map<String,String> useRoleNames = sysUserService.getRoleNamesByUserIds(userIds);
//step.4 遍历赋值
pageList.getRecords().forEach(item->{
item.setOrgCodeTxt(useDepNames.get(item.getId()));
item.setRoleTxt(useRoleNames.get(item.getId()));
});
}
result.setSuccess(true);
result.setResult(pageList);
SysUserController.log.info(pageList.toString());
return result;
}
/**
* 获取用户列表数据
* @param user
@@ -37,6 +37,13 @@ public interface ISysUserService extends IService<SysUser> {
* @return
*/
IPage<SysUser> queryPage(Page<SysUser> page, List<String> subDepIds, String roleId, String groupId, QueryWrapper<SysUser> queryWrapper);
/**
* 分页查询用户,可支持组织机构检索
* @param page
* @param queryWrapper
* @return
*/
IPage<SysUser> queryPageDecrypt(Page<SysUser> page, List<String> subDepIds, String roleId, String groupId, QueryWrapper<SysUser> queryWrapper);
/**
* 查询用户id
@@ -701,6 +701,7 @@ public class LoginServiceImpl implements ILoginService {
String departIds_dicText = this.translateDictValue("id", "depart_name", "sys_depart", departIds, null);
sysUser.setDepartIds_dicText(departIds_dicText);
}
sysUser.setEmail(PasswordUtil.decrypt(sysUser.getEmail()));
obj.put("token", token);
obj.put(USER_INFO, sysUser);
obj.put("sysAllDictItems", sysDictService.queryAllDictItems());
@@ -77,6 +77,8 @@ public class SysBaseApiImpl implements ISysBaseAPI {
private SysUserRoleMapper sysUserRoleMapper;
@Autowired
private ISysDepartService sysDepartService;
@Resource
private ISysUserService sysUserService;
@Autowired
private ISysDictService sysDictService;
@Resource
@@ -1194,6 +1196,16 @@ public class SysBaseApiImpl implements ISysBaseAPI {
return String.join(",",resultList);
}
@Override
public Map<String, String> getDepNamesByUserIds(List<String> userIdList) {
return sysUserService.getDepNamesByUserIds(userIdList);
}
@Override
public List<String> getSubDepIdsByDepId(String departId) {
return sysDepartService.getSubDepIdsByDepId(departId);
}
@Override
public Map<String, List<DictModel>> translateManyDict(String dictCodes, String keys) {
List<String> dictCodeList = Arrays.asList(dictCodes.split(","));
@@ -90,6 +90,17 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
return sysUserIPage;
}
@Override
public IPage<SysUser> queryPageDecrypt(Page<SysUser> page, List<String> subDepIds, String roleId, String groupId, QueryWrapper<SysUser> queryWrapper) {
IPage<SysUser> sysUserIPage = this.userMapper.queryPage(page, subDepIds, roleId, groupId, queryWrapper);
sysUserIPage.getRecords().forEach(user -> {
// 对手机号、邮箱进行解密处理
user.setEmail(proceedEmailDecrypt(user.getEmail()));
user.setPhone(proceedPhoneDecrypt(user.getPhone()));
});
return sysUserIPage;
}
@Override
public List<String> queryList(List<String> subDepIds, String roleId, String groupId, QueryWrapper<SysUser> queryWrapper){
return this.userMapper.queryList(subDepIds, roleId, groupId, queryWrapper);
@@ -0,0 +1,238 @@
package com.jero.modules.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.common.exception.JeroBootException;
import com.jero.common.util.CommonUtils;
import com.jero.common.util.IntekeyUtils;
import com.jero.common.util.MinioUtil;
import com.jero.common.util.oConvertUtils;
import com.jero.modules.oss.entity.OSSFile;
import com.jero.modules.oss.service.IOSSFileService;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author: Mzaxd
* @Date: 2024/4/25 9:08
*/
@Slf4j
@Component
public class SysOnlyOfficePdfUtil {
@Resource
private IOSSFileService ossFileService;
@Value("${file.downloadUrl}")
private String downloadFileUrl;
@Value("${onlyoffice.toUrl}")
private String onlyOfficeUrl;
@Value("${onlyoffice.transferPDfUrl}")
private String transferPDfUrl;
@Value(value = "${jero.uploadType}")
private String uploadType;
@Value("#{'${download.enable}'}")
private boolean enable;
@Value("${file.path}")
private String filePath;//文件存储路径
private static final int TIMEOUT = 60000; // 通用超时设置
@SneakyThrows
public void convertAndSavePdfFile(String fileName, String originFileId, String onlineFilePath) {
String key = UUID.randomUUID().toString();
log.info("转换的请求参数:onlyOfficeUrl:{}, filePdfName:{}, key:{}, originFileId:{}, onlineFilePath:{}", onlyOfficeUrl, fileName, key, originFileId, onlineFilePath);
// 获取onlyOffice转换后文件的url
String fileUrl = convertFile(fileName, key, onlineFilePath);
log.info("文件转换后PDF的URL: {}", fileUrl);
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
// 根据url获取转换后的文件
fetchAndSaveFile(httpClient, fileName, fileUrl, originFileId);
} // 自动关闭httpClient
}
private CloseableHttpClient createHttpClient() {
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(TIMEOUT)
.setConnectionRequestTimeout(TIMEOUT)
.setConnectTimeout(TIMEOUT)
.build();
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
return httpClientBuilder.setDefaultRequestConfig(requestConfig).build();
}
@SneakyThrows
private String convertFile(String fileName, String key, String onlineFilePath) {
Map<String, Object> parameters = new HashMap<>();
parameters.put("async", false);
parameters.put("filetype", "docx");
parameters.put("key", key);
parameters.put("outputtype", "pdf");
parameters.put("title", fileName + ".pdf");
parameters.put("url", downloadFileUrl + onlineFilePath);
log.info("转换文件参数: {}", parameters);
JSONObject requestJson = new JSONObject(parameters);
String data = requestJson.toString();
try (CloseableHttpClient httpClient = createHttpClient()) {
String url = "http://" + onlyOfficeUrl + transferPDfUrl;
log.info("访问onlyOfficeUrl{}", url);
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new StringEntity(data, "UTF-8"));
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
return handleResponse(response);
}
}
}
@SneakyThrows
private void fetchAndSaveFile(CloseableHttpClient httpClient, String fileName, String fileUrl, String originFileId) {
String pdfFileName = fileName + ".pdf";
HttpGet get = new HttpGet(fileUrl);
try (CloseableHttpResponse response = httpClient.execute(get)) {
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
throw new JeroBootException("Failed to fetch the file: " + response);
}
HttpEntity entity = response.getEntity();
if (entity != null) {
try (InputStream content = entity.getContent()) {
MultipartFile file = new MockMultipartFile(pdfFileName, pdfFileName, ContentType.APPLICATION_OCTET_STREAM.toString(), content);
// 保存文件逻辑
String savePath = CommonUtils.upload(file, "convert", uploadType);
if (oConvertUtils.isNotEmpty(savePath)) {
// 如果有的话,删除原来的pdf版本
LambdaQueryWrapper<OSSFile> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(OSSFile::getBindId, originFileId);
ossFileService.remove(lambdaQueryWrapper);
// 上传成功 进行数据库存储
OSSFile ossFile = new OSSFile();
// 文件名
ossFile.setFileName(pdfFileName);
ossFile.setUrl(savePath);
ossFile.setBindId(originFileId);
ossFileService.save(ossFile);
}
}
}
}
}
@SneakyThrows
private String handleResponse(CloseableHttpResponse response) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String responseData = EntityUtils.toString(entity, "UTF-8");
return analysisXML(responseData);
}
return null;
}
@SneakyThrows
public static String analysisXML(String xmlString) {
log.info("OnlyOffice返回xmlString:{}", xmlString);
Document document = DocumentHelper.parseText(xmlString);
Element root = document.getRootElement();
return root.elementText("FileUrl").replaceAll("&amp;", "&");
}
public List<OSSFile> docFileTransferPdf(String fileIds) {
List<OSSFile> resultList = new ArrayList<>();
// 获取所有需要生成pdf版本的文件
// 先获取所有有url的文件记录
LambdaQueryWrapper<OSSFile> ossWrapper = new LambdaQueryWrapper<>();
ossWrapper.in(StrUtil.isNotBlank(fileIds), OSSFile::getId, Arrays.asList(fileIds.split(",")));
ossWrapper.isNotNull(OSSFile::getUrl);
List<OSSFile> ossFileList = ossFileService.list(ossWrapper);
if (CollUtil.isEmpty(ossFileList)) {
return null;
}
// 筛选出后缀为doc或docx的文件
List<OSSFile> docFileList = ossFileList.stream()
.filter(o -> o.getUrl().endsWith("doc") || o.getUrl().endsWith("docx"))
.collect(Collectors.toList());
// 筛选出已经转换过的pdf文件
Map<String, List<OSSFile>> alreadyTransferFileMap = ossFileList.stream()
.filter(o -> StrUtil.isNotBlank(o.getBindId()))
.collect(Collectors.groupingBy(OSSFile::getBindId));
for (OSSFile ossFile : docFileList){
List<OSSFile> existPdfFileList = alreadyTransferFileMap.get(ossFile.getId());
// 已经转换过的不再重复转换
if (CollUtil.isNotEmpty(existPdfFileList)) {
continue;
}
String docFileName = ossFile.getFileName();
log.info("开始处理文件名为 {} 的文件转换工作", docFileName);
// 根据文件url获取文件
InputStream isDecrypt;
try (InputStream is = MinioUtil.download(ossFile.getUrl())) {
isDecrypt = is;
// 文件解密
if (enable) {
isDecrypt = IntekeyUtils.autoDecryptInputStreamFile(isDecrypt, ossFile.getFileName());
}
// 转换为pdf
String pdfFileName = docFileName.substring(0, docFileName.lastIndexOf("."));
String targetPath = "convert/" + ossFile.getFileName();
File targetFile = new File(filePath + targetPath);
try (OutputStream outputStream = Files.newOutputStream(targetFile.toPath())) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = isDecrypt.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
} catch (IOException e) {
log.error("文件写入失败:" + e.getMessage());
}
this.convertAndSavePdfFile(pdfFileName, ossFile.getId(), targetPath);
// 将下载到本地的文件删除
FileUtil.del(targetFile);
log.info("文件名为 {} 的文件转换成功", docFileName);
resultList.add(ossFile);
} catch (Exception e) {
log.error("文件名为 {} 的文件转换失败,失败原因{}", docFileName, e.getMessage());
}
}
return resultList;
}
}
@@ -0,0 +1,25 @@
package com.jero.modules.docking.api.constans;
public class ApiConstants {
private ApiConstants(){}
/**
* 生效
*/
public static final String STATUS_1 = "1";
/**
* 作废
*/
public static final String STATUS_2 = "2";
/**
* 奇瑞型号
*/
public static final String FORM_TYPE1 = "1";
/**
* 是
*/
public static final String PART_YES = "1";
}
@@ -0,0 +1,49 @@
package com.jero.modules.docking.api.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.jero.common.api.vo.Result;
import com.jero.modules.docking.api.service.ILawsSysApiInfoService;
import com.jero.modules.docking.api.vo.StandardData;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
@Api(tags = "外部对接-提供对外接口")
@RestController
@RequestMapping("/api")
@Slf4j
public class LawsSysApiInfoController {
@Resource
private ILawsSysApiInfoService lawsSysApiInfoService;
/**
* 分页列表
* @return
*/
@PostMapping("/getStandardDataPage")
public Result<IPage<StandardData>> getStandardDataPage(@RequestBody StandardData standardData,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
return lawsSysApiInfoService.getStandardDataPage(standardData,pageNo,pageSize,req);
}
/**
* 列表
* @return
*/
@PostMapping("/getStandardDataList")
public Result<List<StandardData>> getStandardDataList(@RequestBody StandardData standardData,HttpServletRequest req) {
return lawsSysApiInfoService.getStandardDataList(standardData,req);
}
}
@@ -0,0 +1,47 @@
package com.jero.modules.docking.api.entity;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 系统对接信息
*
* @TableName laws_sys_api_info
*/
@TableName(value ="laws_sys_api_info")
@Data
public class LawsSysApiInfo implements Serializable {
/**
* 主键
*/
@ApiModelProperty(value = "主键")
private String id;
/**
* 系统中文名称
*/
@ApiModelProperty(value = "系统中文名称")
private String sysName;
/**
* 系统唯一标识
*/
@ApiModelProperty(value = "系统唯一标识")
private String sysCode;
/**
* 系统的key值
*/
@ApiModelProperty(value = "系统的key值")
private String appKey;
/**
* 系统对应秘钥
*/
@ApiModelProperty(value = "系统对应秘钥")
private String secret;
/**
* IP白名单
*/
@ApiModelProperty(value = "IP白名单")
private String ip;
}
@@ -0,0 +1,30 @@
package com.jero.modules.docking.api.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jero.modules.docking.api.entity.LawsSysApiInfo;
import com.jero.modules.docking.api.vo.StandardData;
import com.jero.modules.laws.part.entity.LawsPartType;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface LawsSysApiInfoMapper extends BaseMapper<LawsSysApiInfo> {
IPage<StandardData> getStandardData(Page<StandardData> page,
@Param(Constants.WRAPPER) QueryWrapper<StandardData> queryWrapper,
@Param("foreignStandardReturnUrl") String foreignStandardReturnUrl,
@Param("enterpriseStandardReturnUrl")String enterpriseStandardReturnUrl);
List<StandardData> getStandardData(@Param(Constants.WRAPPER) QueryWrapper<StandardData> queryWrapper,
@Param("foreignStandardReturnUrl") String foreignStandardReturnUrl,
@Param("enterpriseStandardReturnUrl")String enterpriseStandardReturnUrl);
}
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jero.modules.docking.api.mapper.LawsSysApiInfoMapper">
<select id="getStandardData" resultType="com.jero.modules.docking.api.vo.StandardData">
select * from (
select standard_number, standard_name, '1' as resource_type, concat(#{foreignStandardReturnUrl},id) as returnUrl
from laws_domestic_standard where del_flag = 0
union all
select standard_number, standard_name, '2' as resource_type, concat(#{enterpriseStandardReturnUrl},id) as returnUrl
from laws_enterprise_standard where del_flag = 0
) a
${ew.customSqlSegment}
</select>
</mapper>
@@ -0,0 +1,20 @@
package com.jero.modules.docking.api.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.common.api.vo.Result;
import com.jero.modules.docking.api.entity.LawsSysApiInfo;
import com.jero.modules.docking.api.vo.StandardData;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;
public interface ILawsSysApiInfoService extends IService<LawsSysApiInfo> {
Result<IPage<StandardData>> getStandardDataPage(StandardData standardData,Integer pageNo,Integer pageSize,
HttpServletRequest req);
Result<List<StandardData>> getStandardDataList(StandardData standardData,HttpServletRequest req);
}
@@ -0,0 +1,123 @@
package com.jero.modules.docking.api.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.vo.Result;
import com.jero.common.system.query.QueryGenerator;
import com.jero.modules.docking.api.entity.LawsSysApiInfo;
import com.jero.modules.docking.api.mapper.LawsSysApiInfoMapper;
import com.jero.modules.docking.api.service.ILawsSysApiInfoService;
import com.jero.modules.docking.api.vo.StandardData;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.laws.home.common.LawsHomeSearchCommon;
import com.jero.modules.laws.home.mapper.LawsHomeSearchMapper;
import com.jero.modules.laws.part.entity.LawsPartType;
import com.jero.modules.system.service.ISysDictService;
import com.jero.modules.tag.enums.TableNameEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
@Service
@Slf4j
public class LawsSysApiInfoServiceImpl extends ServiceImpl<LawsSysApiInfoMapper, LawsSysApiInfo>
implements ILawsSysApiInfoService {
@Resource
private LawsSysApiInfoMapper lawsSysApiInfoMapper;
@Value("api.enterprise_standard_return_url")
private String enterpriseStandardReturnUrl;
@Value("api.foreign_standard_return_url")
private String foreignStandardReturnUrl;
@Override
public Result<IPage<StandardData>> getStandardDataPage(StandardData standardData,Integer pageNo,Integer pageSize,
HttpServletRequest req) {
String msg = checkSysInfo(standardData.getAppKey(),standardData.getSecret(),req);
if(!StringUtils.isEmpty(msg)){
return Result.error(msg);
}
QueryWrapper<StandardData> queryWrapper = new QueryWrapper<>();
queryWrapper.like(!StringUtils.isEmpty(standardData.getStandardNumber()),"standard_number",standardData.getStandardNumber());
queryWrapper.like(!StringUtils.isEmpty(standardData.getStandardName()),"standard_name",standardData.getStandardName());
queryWrapper.eq(!StringUtils.isEmpty(standardData.getResourceType()),"resource_type",standardData.getResourceType());
queryWrapper.orderByDesc("create_time");
Page<StandardData> page = new Page<>(pageNo, pageSize);
return Result.OK(lawsSysApiInfoMapper.getStandardData(page,queryWrapper, foreignStandardReturnUrl, enterpriseStandardReturnUrl));
}
@Override
public Result<List<StandardData>> getStandardDataList(StandardData standardData,HttpServletRequest req) {
String msg = checkSysInfo(standardData.getAppKey(),standardData.getSecret(),req);
if(!StringUtils.isEmpty(msg)){
return Result.error(msg);
}
QueryWrapper<StandardData> queryWrapper = new QueryWrapper<>();
queryWrapper.like(!StringUtils.isEmpty(standardData.getStandardNumber()),"standard_number",standardData.getStandardNumber());
queryWrapper.like(!StringUtils.isEmpty(standardData.getStandardName()),"standard_name",standardData.getStandardName());
queryWrapper.eq(!StringUtils.isEmpty(standardData.getResourceType()),"resource_type",standardData.getResourceType());
queryWrapper.orderByDesc("create_time");
return Result.OK(lawsSysApiInfoMapper.getStandardData(queryWrapper, foreignStandardReturnUrl, enterpriseStandardReturnUrl));
}
public String checkSysInfo(String appKey,String secret,HttpServletRequest req){
if(StringUtils.isEmpty(appKey) || StringUtils.isEmpty(secret)){
return "参数异常";
}
LambdaQueryWrapper<LawsSysApiInfo> query = new LambdaQueryWrapper<>();
query.eq(LawsSysApiInfo::getAppKey,appKey);
query.eq(LawsSysApiInfo::getSecret,secret);
LawsSysApiInfo lawsSysApiInfo = getOne(query,false);
if(Objects.isNull(lawsSysApiInfo)){
return "非法请求";
}
if(!StringUtils.isEmpty(lawsSysApiInfo.getIp())
&& !Arrays.asList(lawsSysApiInfo.getIp().split(",")).contains(getClientIp(req))){
return "非法请求";
}
return null;
}
private String getClientIp(HttpServletRequest request) {
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ipAddress == null || ipAddress.isEmpty() || "unknown".equalsIgnoreCase(ipAddress)) {
ipAddress = request.getRemoteAddr();
}
// 如果X-Forwarded-For有多层代理,取第一个IP作为客户端真实IP
if (ipAddress != null && ipAddress.contains(",")) {
ipAddress = ipAddress.split(",")[0];
}
return ipAddress;
}
}
@@ -0,0 +1,47 @@
package com.jero.modules.docking.api.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.io.Serializable;
/**
* @author lqt
* @version 1.0
* @date 2024/10/15 16:15
*/
@Data
public class StandardData implements Serializable {
/**
* 标准编号
*/
private String standardNumber;
/**
* 标准名称
*/
private String standardName;
/**
* 标准类型1:外标 2:企标
*/
private String resourceType;
/**
* 详情页跳转url
*/
private String returnUrl;
/**
*
*/
@JsonIgnore
private String id;
/**
* key
*/
@JsonIgnore
private String appKey;
/**
* secret
*/
@JsonIgnore
private String secret;
}
@@ -11,7 +11,6 @@ import com.jero.modules.onlyoffice.utils.OnlyOfficePdfUtil;
import com.jero.modules.oss.entity.OSSFile;
import com.jero.modules.oss.service.IOSSFileService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -22,4 +22,38 @@ public class ActivitiCommon {
* 未处理
*/
public static final int COMMIT_FLAG3 = 3;
/**
* 起草人
*/
public static final String MAIN_DRAFT_USER = "mainDraftUser";
/**
* 审批人一
*/
public static final String USER_ONE_List = "userOneList";
/**
* 审批人二
*/
public static final String USER_TWO_List = "userTwoList";
/**
* 审批人三
*/
public static final String USER_THREE_List = "userThreeList";
/**
* 审批人四
*/
public static final String USER_FOUR_List = "userFourList";
/**
* 审批人五
*/
public static final String USER_FIVE_List = "userFiveList";
/**
* 审批人六
*/
public static final String USER_SIX_List = "userSixList";
/**
* 审批人七
*/
public static final String USER_SEVEN_List = "userSevenList";
}
@@ -282,8 +282,8 @@ public class WorkCenterController {
@ApiOperation(value="保存", notes="保存")
@PostMapping("/save")
public Result<?> save(@Validated @RequestBody ProcessInfoVO processInfoVO) {
processHandleService.saveToDraft(processInfoVO, UserUtils.getUserId());
return Result.OK();
String draftId = processHandleService.saveToDraft(processInfoVO, UserUtils.getUserId());
return Result.OK("操作成功", draftId);
}
@AutoLog(value = "删除草稿")
@@ -15,6 +15,17 @@ public enum ProcessTypeEnum {
STANDARD_INTERPRET("标准解读流程", 2, "com.jero.modules.activiti.process.standardinterpret.service.impl.StandardInterpretFlow", "/workCenter/StandardInterpretationProcess", "/workCenter/StandardInterpretationProcess"),
STANDARD_COMPLIANCE_CHECK("法规符合性排查流程", 3, "com.jero.modules.activiti.process.standardComplianceCheck.service.StandardComplianceCheckFlow", "/workCenter/RegulatoryComplianceCheckProcess", "/workCenter/RegulatoryComplianceCheckProcess"),
MARKET_STANDARD_PUBLISH("市场清单发布流程", 4, "com.jero.modules.activiti.process.ms.service.impl.ProcessMarketStandardReleaseServiceImpl", "/workCenter/MarketListReleaseProcess", "/workCenter/MarketListReleaseProcess"),
ENTERPRISE_STANDARD_ABOLISH_PUBLISH("企标废止发布流程", 5, "com.jero.modules.activiti.process.abolish.service.impl.ProcessAbolishReleaseServiceImpl", "/workCenter/AbolishReleaseProcess", "/workCenter/AbolishReleaseProcess"),
ES_REVISION_ADVICE("企业标准制修订及征求意见流程", 6, "com.jero.modules.activiti.process.esRevisionAdvice.service.impl.EsRevisionServiceImpl","/workCenter/EsRevisionAndConsultationProcess","/workCenter/EsRevisionAndConsultationProcess"),
ANNUAL_INIT("企业标准年度制修订计划流程", 7, "com.jero.modules.activiti.process.annualinit.service.ProcessAnnualInitService","/workCenter/ESAnnualRevisionPlanProcess","/workCenter/ESAnnualRevisionPlanProcess"),
DOMESTIC_VEHICLE_CONTROL_PUBLISH("国内整车型号和VIN前八位管控流程", 8, "com.jero.modules.activiti.process.vehicledomestic.service.impl.ProcessVehicleDomesticReleaseServiceImpl","/workCenter/VehicleDomesticReleaseProcess","/workCenter/VehicleDomesticReleaseProcess"),
PLAN_CHANGE("企业标准计划变更流程", 9, "com.jero.modules.activiti.process.planchange.service.ProcessPlanChangeService","/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow","/workCenter/enterpriseStandardRevision"),
INTERNATIONAL_VEHICLE_CONTROL_PUBLISH("国际整车型号和VIN前八位管控流程", 10, "com.jero.modules.activiti.process.vehicleinternational.service.impl.ProcessVehicleDomesticReleaseServiceImpl","/workCenter/VehicleInternationalReleaseProcess","/workCenter/VehicleInternationalReleaseProcess"),
PART_TYPE_APPLY("关键零部件型号申请流程", 11, "com.jero.modules.activiti.process.part.service.impl.ProcessPartTypeApplyServiceImpl","/workCenter/KeyComponentModelRequestProcess","/workCenter/KeyComponentModelRequestProcess"),
SPECIAL_ES_APPROVAL("专业技术企业标准报批流程", 12, "com.jero.modules.activiti.process.specialEsApproval.service.impl.specialEsApprovalServiceImpl", "/workCenter/specialEsApproval/specialEsApprovalFlow","/workCenter/specialEsApprovalFlow"),
MACHINE_ES_APPROVAL("产品标准-整车企业标准报批流程", 13, "com.jero.modules.activiti.process.machineEsApproval.service.impl.machineEsApprovalServiceImpl", "/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow","/workCenter/enterpriseStandardRevision"),
CAR_ES_APPROVAL("产品标准-整机企业标准报批流程", 14, "com.jero.modules.activiti.process.carEsApproval.service.impl.carEsApprovalServiceImpl", "/workCenter/enterpriseStandardRevision/enterpriseStandardRevisionFlow","/workCenter/enterpriseStandardRevision"),
ES_RECHECK("企标复审流程", 15, "com.jero.modules.activiti.process.esRecheck.service.impl.esRecheckServiceImpl", "/workCenter/enterpriseStandardRecheck/enterpriseStandardRecheckFlow","/workCenter/enterpriseStandardRecheck")
;
private final String name;
@@ -0,0 +1,84 @@
package com.jero.modules.activiti.process.abolish.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.abolish.entity.ProcessAbolishRelease;
import com.jero.modules.activiti.process.abolish.service.IProcessAbolishReleaseService;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* <p>
* 企标废止发布流程 前端控制器
* </p>
*
* @author sz
* @since 2024-09-05
*/
@Slf4j
@Api(tags = "企标废止发布流程")
@RestController
@RequestMapping("/process/abolishRelease")
public class ProcessAbolishReleaseController {
@Resource
private IProcessAbolishReleaseService processAbolishReleaseService;
@Resource
private ActFlowCommonService actFlowCommonService;
@AutoLog(value = "企标废止发布流程-发起流程")
@ApiOperation(value = "企标废止发布流程-发起流程", notes = "企标废止发布流程-发起流程")
@PostMapping(value = "/start")
public Result<T> startProcess(@Validated @RequestBody ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
processAbolishReleaseService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "企标废止发布流程-同意")
@ApiOperation(value = "企标废止发布流程-同意", notes = "企标废止发布流程-同意")
@PostMapping("/agree")
public Result<T> agree(@Validated @RequestBody ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
processAbolishReleaseService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "企标废止发布流程-驳回")
@ApiOperation(value = "企标废止发布流程-驳回", notes = "企标废止发布流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@Validated @RequestBody ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
processAbolishReleaseService.approveTask(processInfoVO, false);
return Result.OK();
}
@AutoLog(value = "企标废止发布流程-提交")
@ApiOperation(value = "企标废止发布流程-提交", notes = "企标废止发布流程-提交")
@PostMapping("/submit")
public Result<T> submit(@Validated @RequestBody ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
processAbolishReleaseService.submit(processInfoVO);
return Result.OK();
}
@AutoLog(value = "企标废止发布流程-办理")
@ApiOperation(value="企标废止发布流程-办理", notes="企标废止发布流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.ENTERPRISE_STANDARD_ABOLISH_PUBLISH);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(processAbolishReleaseService.getHandleData(taskId));
}
}
@@ -0,0 +1,77 @@
package com.jero.modules.activiti.process.abolish.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableId;
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;
/**
* <p>
* 企标废止发布流程
* </p>
*
* @author sz
* @since 2024-09-05
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("process_abolish_release")
@ApiModel(value="ProcessAbolishRelease对象", description="企标废止发布流程")
public class ProcessAbolishRelease implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键ID")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@ApiModelProperty(value = "流程实例Id")
private String processInstanceId;
@ApiModelProperty(value = "标准编号")
private String standardNumber;
@ApiModelProperty(value = "标准名称")
private String standardName;
@ApiModelProperty(value = "起草人")
private String drafter;
@ApiModelProperty(value = "主起草部门")
private String drafterDepart;
@ApiModelProperty(value = "关联部门")
private String relatedDepart;
@ApiModelProperty(value = "废止理由")
private String abolishReason;
@ApiModelProperty(value = "附件文件id")
private String fileIds;
@ApiModelProperty(value = "0表示未删除,1表示删除")
private Integer delFlag;
@ApiModelProperty(value = "创建人")
private String createBy;
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "更新人")
private String updateBy;
@ApiModelProperty(value = "更新时间")
private Date updateTime;
}
@@ -0,0 +1,54 @@
package com.jero.modules.activiti.process.abolish.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.jero.modules.activiti.process.abolish.entity.ProcessAbolishRelease;
import com.jero.modules.activiti.process.abolish.service.IProcessAbolishReleaseService;
import com.jero.modules.activiti.process.common.enums.StandardStateEnum;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService;
import com.jero.modules.tag.enums.TableNameEnum;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author: Mzaxd
* @Date: 2023/10/10 14:14
*/
@Slf4j
@Component("ProcessESAbolishEndListener")
public class ProcessESAbolishEndListener implements ExecutionListener {
@Resource
private ILawsEnterpriseStandardService esService;
@Resource
private IProcessAbolishReleaseService processAbolishReleaseService;
/**
* 企标废止流程结束之后需要把标准状态设为废止
* @param delegateExecution
*/
@Override
public void notify(DelegateExecution delegateExecution) {
log.info("企标废止流程结束 监听执行器开始执行");
// 找到流程实例Id
String processInstanceId = delegateExecution.getProcessInstanceId();
LambdaQueryWrapper<ProcessAbolishRelease> abolishLambdaQueryWrapper = new LambdaQueryWrapper<>();
abolishLambdaQueryWrapper.eq(ProcessAbolishRelease::getProcessInstanceId, processInstanceId);
ProcessAbolishRelease abolish = processAbolishReleaseService.getOne(abolishLambdaQueryWrapper);
String standNo = abolish.getStandardNumber();
LambdaQueryWrapper<LawsEnterpriseStandard> esWrapper = new LambdaQueryWrapper<>();
esWrapper.eq(LawsEnterpriseStandard::getStandardNumber, standNo);
LawsEnterpriseStandard one = esService.getOne(esWrapper);
log.info("企标废止流程监听执行器开始执行,企标编号为:{}", standNo);
esService.update(new LambdaUpdateWrapper<LawsEnterpriseStandard>()
.set(LawsEnterpriseStandard::getStandardState, StandardStateEnum.ABOLISH.getStateValue())
.eq(LawsEnterpriseStandard::getStandardNumber, standNo));
// todo 如果需要发消息可以在此处编写
log.info("企标废止流程结束监听执行器执行结束");
}
}
@@ -0,0 +1,16 @@
package com.jero.modules.activiti.process.abolish.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jero.modules.activiti.process.abolish.entity.ProcessAbolishRelease;
/**
* <p>
* 企标废止发布流程 Mapper 接口
* </p>
*
* @author sz
* @since 2024-09-05
*/
public interface ProcessAbolishReleaseMapper extends BaseMapper<ProcessAbolishRelease> {
}
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jero.modules.activiti.process.abolish.mapper.ProcessAbolishReleaseMapper">
</mapper>
@@ -0,0 +1,25 @@
package com.jero.modules.activiti.process.abolish.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.abolish.entity.ProcessAbolishRelease;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.ni.entity.ProcessNewStandardImport;
/**
* <p>
* 企标废止发布流程 服务类
* </p>
*
* @author sz
* @since 2024-09-05
*/
public interface IProcessAbolishReleaseService extends IService<ProcessAbolishRelease> {
void startProcess(ProcessInfoVO<ProcessAbolishRelease> processInfoVO);
void approveTask(ProcessInfoVO<ProcessAbolishRelease> processInfoVO, boolean pass);
ProcessInfoVO<ProcessAbolishRelease> getHandleData(String taskId);
void submit(ProcessInfoVO<ProcessAbolishRelease> processInfoVO);
}
@@ -0,0 +1,281 @@
package com.jero.modules.activiti.process.abolish.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.common.ActivitiCommon;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.abolish.entity.ProcessAbolishRelease;
import com.jero.modules.activiti.process.abolish.mapper.ProcessAbolishReleaseMapper;
import com.jero.modules.activiti.process.abolish.service.IProcessAbolishReleaseService;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.enums.StandardStateEnum;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService;
import com.jero.modules.sys.utils.UserUtils;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import static com.jero.modules.activiti.common.ActivitiCommon.PASS;
/**
* <p>
* 企标废止发布流程 服务实现类
* </p>
*
* @author sz
* @since 2024-09-05
*/
@Service
@Transactional(rollbackFor = JeroBootException.class)
public class ProcessAbolishReleaseServiceImpl extends ServiceImpl<ProcessAbolishReleaseMapper, ProcessAbolishRelease> implements IProcessAbolishReleaseService {
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private ProcessApprovalRecordService processApprovalRecordService;
@Resource
private ProcessAllService processAllService;
@Resource
private RuntimeService runtimeService;
@Resource
private IProcessHandleService processHandleService;
@Resource
private TaskService taskService;
@Resource
private ILawsEnterpriseStandardService esService;
@Override
public void startProcess(ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
// 流程Key
String processDefinitionKey = ProcessType.ENTERPRISE_STANDARD_ABOLISH_PUBLISH.getProcessKey();
// 流程信息
BasicProcessInfoDTO processInfo = processInfoVO.getBasicProcessInfoDTO();
// 任务信息
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 业务数据
ProcessAbolishRelease businessInfoDTO = processInfoVO.getBusinessInfoDTO();
// 设置流程变量
Map<String, Object> actVariables = setVariables(userInfoMap);
// 删除草稿
actFlowCommonService.getExistDraftAndRemove(processInfoVO.getDraftId());
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
businessInfoDTO.setProcessInstanceId(processInstanceId);
processInfo.setProcessInstanceId(processInstanceId);
processInfo.setProcessDefinitionId(processDefinitionId);
processInfo.setProcessType(ProcessTypeEnum.ENTERPRISE_STANDARD_ABOLISH_PUBLISH.getValue());
// 第一个节点业务数据处理
this.startNodeBusProcess(processInfoVO);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, changeVariables(userInfoMap));
// 当前用户Id
String userId = UserUtils.getUserId();
// 获取第一个任务的taskId
String taskId = actFlowCommonService.getFirstTaskId(processInstanceId, userId, processDefinitionId);
processTask.setTaskId(taskId);
// 保存第一个节点的草稿
processHandleService.saveToDraft(processInfoVO, UserUtils.getUserId());
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 根据流程实例id更新流程总表
actFlowCommonService.updateProcessAll(processInfo);
// 自动完成第一个任务
actFlowCommonService.completeTask(taskId, userId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO,userId);
}
@Override
public void approveTask(ProcessInfoVO<ProcessAbolishRelease> processInfoVO, boolean pass) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 获取task
if (StringUtils.isBlank(taskId) || !actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("taskId为空或任务不存在");
}
// 获取当前节点的id
ProcessApprovalRecord processApprovalRecord = actFlowCommonService.getNodeIdByTaskId(taskId);
String xmlNodeId = processApprovalRecord.getNodeId();
//任务Id 查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
String userId = actFlowCommonService.getOriginTaskAssignee(taskId);
if(Objects.isNull(task)){
throw new JeroBootException("找不到对应任务");
}
if (pass && task.getName().equals("授权人审批")) {
ProcessAbolishRelease businessInfoDTO = this.getOne(new LambdaQueryWrapper<ProcessAbolishRelease>()
.eq(ProcessAbolishRelease::getProcessInstanceId, processInstanceId));
String standardNumber = businessInfoDTO.getStandardNumber();
LawsEnterpriseStandard es = esService.getOne(new LambdaQueryWrapper<LawsEnterpriseStandard>()
.eq(LawsEnterpriseStandard::getStandardNumber, standardNumber));
if (StandardStateEnum.ABOLISH.getStateValue().equals(es.getStandardState())) {
throw new JeroBootException("该标准已废止,需要驳回重新选择");
}
}
if(Objects.isNull(processTask.getCommitFlag())){
processTask.setCommitFlag(pass ? ActivitiCommon.COMMIT_FLAG1 : ActivitiCommon.COMMIT_FLAG2);
}
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 设置流程变量
runtimeService.setVariable(processInstanceId, PASS, pass);
// 审批节点
actFlowCommonService.completeTask(taskId, userId);
// 驳回,结束所有节点
processApprovalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 保存快照
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
processInfoVO.setBasicProcessInfoDTO(basicProcessInfoDTO);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO,userId);
}
}
@Override
public void submit(ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 获取task
if (StringUtils.isBlank(taskId) || !actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("taskId为空或任务不存在");
}
//任务Id 查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if(Objects.isNull(task)){
throw new JeroBootException("找不到对应任务");
}
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 设置流程变量
Map<String, Object> actVariables = setVariables(userInfoMap);
String processInstanceId = task.getProcessInstanceId();
runtimeService.setVariables(processInstanceId,actVariables);
String userId = actFlowCommonService.getOriginTaskAssignee(taskId);
// 发起节点 更新业务数据
startNodeBusProcess(processInfoVO);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 审批节点
actFlowCommonService.completeTask(taskId, userId);
// 保存快照
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
processInfoVO.setBasicProcessInfoDTO(basicProcessInfoDTO);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO,userId);
}
}
@Override
public ProcessInfoVO<ProcessAbolishRelease> getHandleData(String taskId) {
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("任务不存在");
}
ProcessInfoVO<ProcessAbolishRelease> result = new ProcessInfoVO<>();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
result.setBasicProcessInfoDTO(basicProcessInfoDTO);
}
// 获取流程实例数据
LambdaQueryWrapper<ProcessAbolishRelease> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ProcessAbolishRelease::getProcessInstanceId, processInstanceId);
ProcessAbolishRelease data = getOne(lambdaQueryWrapper,false);
result.setBusinessInfoDTO(data);
return result;
}
private void startNodeBusProcess(ProcessInfoVO<ProcessAbolishRelease> processInfoVO) {
ProcessAbolishRelease businessInfoDTO = processInfoVO.getBusinessInfoDTO();
saveOrUpdate(businessInfoDTO);
}
private Map<String, Object> setVariables(Map<String, Object> userInfoMap) {
Map<String, Object> map = new HashMap<>();
// 人员信息
userInfoMap.forEach((key, value) -> {
if(Objects.equals("checkUserLeader1List",key + "List") ||
Objects.equals("checkUserLeader2List",key + "List") ||
Objects.equals("checkUserLeader3List",key + "List") ||
Objects.equals("checkUserLeader4List",key + "List") ||
Objects.equals("checkUserLeader5List",key + "List") ||
Objects.equals("checkUserLeader6List",key + "List")){
map.put(key, value);
map.put(key + "List", Arrays.asList(value.toString().split(",")));
return;
}
map.put(key, value);
});
return map;
}
private Map<String, Object> changeVariables(Map<String, Object> userInfoMap) {
Map<String, Object> map = new HashMap<>();
// 人员信息
userInfoMap.forEach((key, value) -> {
if(Objects.equals("checkUserLeader1List",key + "List") ||
Objects.equals("checkUserLeader4List",key + "List") ||
Objects.equals("checkUserLeader5List",key + "List") ||
Objects.equals("checkUserLeader6List",key + "List")){
map.put(key + "List", value);
return;
}
map.put(key, value);
});
return map;
}
}
@@ -0,0 +1,42 @@
package com.jero.modules.activiti.process.annualinit.common;
/**
* @author liJiaRao
* @date 2024-09-24 15:10
*/
public class ProcessAnnualInitCommon {
//起草人发起
public static final String QCRFQ = "qcrfq";
//部门经理审批
public static final String BMJLSP = "bmjlsp";
//法规部门处理人审批
public static final String FGBMCLRSP = "fgbmclrsp";
//法规部门经理审批
public static final String FGBMJLSP = "fgbmjlsp";
//高级经理审批
public static final String GJJLSP = "gjjlsp";
//总监审批
public static final String ZJSP = "zjsp";
//授权人审批
public static final String SQRSP = "sqrsp";
//起草人
public static final String MAIN_DRAFTING_USER = "mainDraftingUser";
//部门经理
public static final String DEPART_MANAGER_LIST = "departManagerList";
//法规部门处理人
public static final String STANDARD_DEPART_HANDLER = "standardDepartHandler";
//法规部门经理
public static final String STANDARD_DEPART_MANAGER = "standardDepartManager";
//高级经理
public static final String SENIOR_MANAGER_LIST = "seniorManagerList";
//总监
public static final String CHIEF_INSPECTOR_LIST = "chiefInspectorList";
//授权人
public static final String AUTHORIZED_PERSON_LIST = "authorizedPersonList";
//制订
public static final String FORMULATE = "1";
//修订
public static final String REVISE = "2";
}
@@ -0,0 +1,89 @@
package com.jero.modules.activiti.process.annualinit.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.common.system.base.controller.JeroController;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInit;
import com.jero.modules.activiti.process.annualinit.service.ProcessAnnualInitService;
import com.jero.modules.activiti.process.annualinit.vo.ProcessAnnualInitVO;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* 年度制修订计划流程(ProcessAnnualInit)表控制层
*
* @author lijiarao
* @since 2024-09-24 14:13:42
*/
@Slf4j
@Api(tags = "年度制修订计划流程")
@RestController
@RequestMapping("/process/processAnnualInit")
public class ProcessAnnualInitController extends JeroController<ProcessAnnualInit, ProcessAnnualInitService> {
/**
* 服务对象
*/
@Resource
private ProcessAnnualInitService processAnnualInitService;
@Resource
private ActFlowCommonService actFlowCommonService;
@AutoLog(value = "年度制修订计划流程-发起流程")
@ApiOperation(value = "年度制修订计划流程-发起流程")
@PostMapping(value = "/startProcess")
public Result<T> startProcess(@Validated @RequestBody ProcessInfoVO<ProcessAnnualInitVO> processInfoVO) {
processAnnualInitService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "年度制修订计划流程-提交")
@ApiOperation(value = "年度制修订计划流程-提交")
@PostMapping("/submit")
public Result<T> submit(@Validated @RequestBody ProcessInfoVO<ProcessAnnualInitVO> processInfoVO) {
processAnnualInitService.submit(processInfoVO);
return Result.OK();
}
@AutoLog(value = "年度制修订计划流程-同意")
@ApiOperation(value = "年度制修订计划流程-同意")
@PostMapping("/agree")
public Result<T> agree(@Validated @RequestBody ProcessInfoVO<ProcessAnnualInitVO> processInfoVO) {
processAnnualInitService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "年度制修订计划流程-驳回")
@ApiOperation(value = "年度制修订计划流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@Validated @RequestBody ProcessInfoVO<ProcessAnnualInitVO> processInfoVO) {
processAnnualInitService.approveTask(processInfoVO, false);
return Result.OK();
}
@AutoLog(value = "年度制修订计划流程-查询流程信息")
@ApiOperation(value="年度制修订计划流程-查询流程信息", notes="年度制修订计划流程-查询流程信息")
@GetMapping("queryProcessInfoVO")
@ApiImplicitParam(name = "taskId", value = "任务id")
@Translation
public Result<?> handle(String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.ANNUAL_INIT);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(processAnnualInitService.getHandleData(taskId));
}
}
@@ -0,0 +1,204 @@
package com.jero.modules.activiti.process.annualinit.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.DictPoint;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.base.controller.JeroController;
import com.jero.common.system.query.QueryGenerator;
import com.jero.common.util.FileUtils;
import com.jero.common.util.ZipUtil;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInitLink;
import com.jero.modules.activiti.process.annualinit.service.ProcessAnnualInitLinkService;
import com.jero.modules.activiti.process.annualinit.vo.ProcessAnnualInitLinkExcelVO;
import com.jero.modules.laws.club.vo.excel.LawsClubJoinTeamExcel;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService;
import com.jero.modules.system.vo.IdMapBody;
import com.jero.modules.system.vo.IdsMapBody;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.core.io.ClassPathResource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.commons.lang3.StringUtils;
import com.jero.common.api.vo.Result;
import com.jero.common.api.vo.ResultCommon;
import org.springframework.web.servlet.ModelAndView;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 年度制修订计划流程关联标准(ProcessAnnualInitLink)表控制层
*
* @author lijiarao
* @since 2024-09-25 14:52:55
*/
@Slf4j
@Api(tags = "年度制修订计划流程关联标准")
@RestController
@RequestMapping("processAnnualInitLink")
public class ProcessAnnualInitLinkController extends JeroController<ProcessAnnualInitLink, ProcessAnnualInitLinkService> {
/**
* 服务对象
*/
@Resource
private ProcessAnnualInitLinkService processAnnualInitLinkService;
/**
* 分页列表查询
*/
@ApiOperation(value = "年度制修订计划流程关联标准-分页列表查询")
@GetMapping(value = "/page")
public Result<IPage<ProcessAnnualInitLink>> queryPageList(ProcessAnnualInitLink processAnnualInitLink,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
HttpServletRequest req) {
Page<ProcessAnnualInitLink> page = new Page<>(pageNo, pageSize);
IPage<ProcessAnnualInitLink> pageList = processAnnualInitLinkService.pageList(page, processAnnualInitLink, req);
return Result.OK(pageList);
}
/**
* 列表查询
*/
@ApiOperation(value = "年度制修订计划流程关联标准-列表查询", notes = "年度制修订计划流程关联标准-列表查询")
@GetMapping(value = "/list")
public Result<List<ProcessAnnualInitLink>> queryList(ProcessAnnualInitLink processAnnualInitLink,
HttpServletRequest req) {
QueryWrapper<ProcessAnnualInitLink> queryWrapper = QueryGenerator.initQueryWrapper(processAnnualInitLink, req.getParameterMap());
List<ProcessAnnualInitLink> list = processAnnualInitLinkService.list(queryWrapper);
return Result.OK(list);
}
/**
* 添加
*/
@AutoLog(value = "年度制修订计划流程关联标准-添加")
@ApiOperation(value = "年度制修订计划流程关联标准-添加", notes = "年度制修订计划流程关联标准-添加")
@PostMapping(value = "/add")
public Result<String> add(@Validated @RequestBody ProcessAnnualInitLink processAnnualInitLink) {
processAnnualInitLinkService.add(processAnnualInitLink);
return Result.OK(ResultCommon.OK);
}
/**
* 编辑
*/
@AutoLog(value = "年度制修订计划流程关联标准-编辑")
@ApiOperation(value = "年度制修订计划流程关联标准-编辑", notes = "年度制修订计划流程关联标准-编辑")
@PostMapping(value = "/edit")
public Result<String> edit(@Validated @RequestBody ProcessAnnualInitLink processAnnualInitLink) {
processAnnualInitLinkService.editById(processAnnualInitLink);
return Result.OK(ResultCommon.EDIT_OK);
}
/**
* 通过id删除
*/
@AutoLog(value = "年度制修订计划流程关联标准-通过id删除")
@ApiOperation(value = "年度制修订计划流程关联标准-通过id删除", notes = "年度制修订计划流程关联标准-通过id删除")
@PostMapping(value = "/delete")
public Result<String> delete(@RequestBody IdMapBody map) {
String id = map.getId();
if (StringUtils.isBlank(id)) {
return Result.error("请选择数据");
}
processAnnualInitLinkService.deleteById(id);
return Result.OK(ResultCommon.SUCCESSFULLY_DELETED);
}
/**
* 批量删除
*/
@AutoLog(value = "年度制修订计划流程关联标准-批量删除")
@ApiOperation(value = "年度制修订计划流程关联标准-批量删除", notes = "年度制修订计划流程关联标准-批量删除")
@PostMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestBody IdsMapBody map) {
String ids = map.getIds();
if (StringUtils.isBlank(ids)) {
return Result.error(ResultCommon.PLEASE_SELECT_DATA);
}
List<String> idList = Arrays.asList(map.getIds().split(","));
this.processAnnualInitLinkService.deleteByIds(idList);
return Result.OK(ResultCommon.SUCCESSFULLY_DELETED_IN_BULK);
}
/**
* 通过id查询
*/
@AutoLog(value = "年度制修订计划流程关联标准-通过id查询")
@ApiOperation(value = "年度制修订计划流程关联标准-通过id查询", notes = "年度制修订计划流程关联标准-通过id查询")
@GetMapping(value = "/queryById")
public Result<ProcessAnnualInitLink> queryById(@RequestParam(name = "id") String id) {
ProcessAnnualInitLink processAnnualInitLink = processAnnualInitLinkService.queryById(id);
if (processAnnualInitLink == null) {
return Result.error(ResultCommon.NO_CORRESPONDING_DATA_FOUND);
}
return Result.OK(processAnnualInitLink);
}
/**
* 导出excel
*/
@ApiOperation(value = "年度制修订计划流程关联标准-导出excel")
@GetMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest req, ProcessAnnualInitLink processAnnualInitLink) {
Page<ProcessAnnualInitLink> page = new Page<>(-1, -1);
IPage<ProcessAnnualInitLink> pageList = processAnnualInitLinkService.pageList(page, processAnnualInitLink, req);
// 获取数据
List<ProcessAnnualInitLink> records = pageList.getRecords();
return super.exportListXls(records, ProcessAnnualInitLink.class, "年度制修订计划流程关联标准");
}
/**
* 下载导入模板
*/
@ApiOperation(value = "年度制修订计划流程关联标准-下载导入模板")
@GetMapping(value = "/exportTemplate")
public void exportTemplate(HttpServletResponse response) {
ClassPathResource resource = new ClassPathResource("excelTemplate/企业标准年度制修订计划导入.xls");
// 设置HTTP响应头,包括文件大小和内容类型
response.setContentType("application/force-download");// 设置强制下载不打开
response.addHeader("Content-Disposition", "attachment;fileName=" + new String("企业标准年度制修订计划导入.xls".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
try (InputStream inputStream = resource.getInputStream();
OutputStream outputStream = response.getOutputStream()
) {
byte[] buf = new byte[1024];
int len;
while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
response.flushBuffer();
} catch (Exception e) {
response.setStatus(404);
e.printStackTrace();
}
}
/**
* 通过excel导入数据
*/
@DictPoint
@ApiOperation(value = "年度制修订计划流程关联标准-通过excel导入数据")
@PostMapping(value = "/importExcel")
public Result<List<ProcessAnnualInitLinkExcelVO>> importExcel(HttpServletRequest request) {
List<ProcessAnnualInitLinkExcelVO> excelData = processAnnualInitLinkService.importExcel(request);
return Result.OK(excelData);
}
}
@@ -0,0 +1,116 @@
package com.jero.modules.activiti.process.annualinit.entity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import lombok.Data;
import io.swagger.annotations.ApiModel;
/**
* 年度制修订计划流程(ProcessAnnualInit)实体类
*
* @author lijiarao
* @since 2024-09-24 14:13:42
*/
@Data
@TableName("process_annual_init")
@ApiModel(value = "ProcessAnnualInit", description = "年度制修订计划流程")
public class ProcessAnnualInit implements Serializable {
private static final long serialVersionUID = -24249950589081692L;
/**
* 主键id
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键id")
private String id;
/**
* 部门经理
*/
@ApiModelProperty(value = "部门经理")
@Excel(name = "部门经理", width = 15)
private String departManager;
/**
* 法规部门处理人id
*/
@ApiModelProperty(value = "法规部门处理人id")
@Excel(name = "法规部门处理人id", width = 15)
private String standardDepartHandler;
/**
* 法规部门经理id
*/
@ApiModelProperty(value = "法规部门经理id")
@Excel(name = "法规部门经理id", width = 15)
private String standardDepartManager;
/**
* 高级经理
*/
@ApiModelProperty(value = "高级经理")
@Excel(name = "高级经理", width = 15)
private String seniorManager;
/**
* 总监
*/
@ApiModelProperty(value = "总监")
@Excel(name = "总监", width = 15)
private String chiefInspector;
/**
* 授权人id
*/
@ApiModelProperty(value = "授权人id")
@Excel(name = "授权人id", width = 15)
private String authorizedPerson;
/**
* 附件
*/
@ApiModelProperty(value = "附件")
@Excel(name = "附件", width = 15)
private String file;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String orgCode;
/**
* 删除状态(0-正常,1-删除)
*/
@ApiModelProperty(value = "删除状态(0-正常,1-删除)")
@TableLogic
private String delFlag;
}
@@ -0,0 +1,151 @@
package com.jero.modules.activiti.process.annualinit.entity;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import lombok.Data;
import io.swagger.annotations.ApiModel;
/**
* 年度制修订计划流程关联标准(ProcessAnnualInitLink)实体类
*
* @author lijiarao
* @since 2024-09-24 14:30:21
*/
@Data
@TableName("process_annual_init_link")
@ApiModel(value = "ProcessAnnualInitLink", description = "年度制修订计划流程关联标准")
public class ProcessAnnualInitLink implements Serializable {
private static final long serialVersionUID = 647513571439825961L;
/**
* 主键id
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键id")
private String id;
/**
* 流程主表id
*/
@ApiModelProperty(value = "流程主表id")
private String processId;
/**
* 制修订类别
*/
@ApiModelProperty(value = "制修订类别")
@Excel(name = "*制修订类型", width = 15, dicCode = "esp_revision_type")
@Dict(dicCode = "esp_revision_type")
private String revisionType;
/**
* 标准id
*/
@ApiModelProperty(value = "标准id")
private String standardId;
/**
* 标准编号
*/
@ApiModelProperty(value = "标准编号")
@Excel(name = "*企标编号", width = 15)
private String standardNumber;
/**
* 标准名称
*/
@ApiModelProperty(value = "标准名称")
@Excel(name = "*企标名称", width = 15)
private String standardName;
/**
* 起草人
*/
@ApiModelProperty(value = "起草人")
@Excel(name = "*起草人", width = 15, dictTable = "sys_user", dicText = "CONCAT(realname, '(', username, ')')", dicCode = "id")
@Dict(dictTable = "sys_user", dicText = "CONCAT(realname, '(', username, ')')", dicCode = "id")
private String mainDraftingUser;
/**
* 邮箱
*/
@TableField(exist = false)
@ApiModelProperty(value = "邮箱")
private String email;
/**
* 所在部门id
*/
@ApiModelProperty(value = "所在部门id")
@Excel(name = "*所在部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
private String departId;
/**
* 专业模块
*/
@ApiModelProperty(value = "专业模块")
@Excel(name = "*专业模块", width = 15, dicCode = "professional_module")
@Dict(dicCode = "professional_module")
private String professionalModule;
/**
* 初稿完成日期
*/
@ApiModelProperty(value = "初稿完成日期")
@Excel(name = "*初稿完成日期", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date draftCompleteDate;
/**
* 计划归档日期
*/
@ApiModelProperty(value = "计划归档日期")
@Excel(name = "*计划归档日期", width = 15, format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date planArchivingDate;
/**
* 是否有英文版
*/
@ApiModelProperty(value = "是否有英文版")
@Excel(name = "是否有英文版", width = 15, dicCode = "yn")
@Dict(dicCode = "yn")
private String haveEnglishVersion;
/**
* 所属技术委员会
*/
@ApiModelProperty(value = "所属技术委员会")
@Excel(name = "所属技术委员会", width = 15)
private String committee;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String orgCode;
}
@@ -0,0 +1,26 @@
package com.jero.modules.activiti.process.annualinit.mapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInitLink;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 年度制修订计划流程关联标准(ProcessAnnualInitLink)表数据库访问层
*
* @author lijiarao
* @since 2024-09-24 14:30:21
*/
public interface ProcessAnnualInitLinkMapper extends BaseMapper<ProcessAnnualInitLink> {
default List<ProcessAnnualInitLink> listByProcessId(String processId) {
LambdaQueryWrapper<ProcessAnnualInitLink> myQuery = Wrappers.lambdaQuery(ProcessAnnualInitLink.class);
myQuery.eq(ProcessAnnualInitLink::getProcessId, processId);
return selectList(myQuery);
}
}
@@ -0,0 +1,15 @@
package com.jero.modules.activiti.process.annualinit.mapper;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInit;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* 年度制修订计划流程(ProcessAnnualInit)表数据库访问层
*
* @author lijiarao
* @since 2024-09-24 14:13:42
*/
public interface ProcessAnnualInitMapper extends BaseMapper<ProcessAnnualInit> {
}
@@ -0,0 +1,49 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jero.modules.activiti.process.annualinit.mapper.ProcessAnnualInitLinkMapper">
<resultMap id="BaseResultMap" type="com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInitLink">
<!--@Table process_annual_init_link-->
<result property="id" column="id" jdbcType="VARCHAR"/>
<result property="processId" column="process_id" jdbcType="VARCHAR"/>
<result property="revisionType" column="revision_type" jdbcType="VARCHAR"/>
<result property="standardId" column="standard_id" jdbcType="VARCHAR"/>
<result property="standardNumber" column="standard_number" jdbcType="VARCHAR"/>
<result property="standardName" column="standard_name" jdbcType="VARCHAR"/>
<result property="mainDraftingUser" column="main_drafting_user" jdbcType="VARCHAR"/>
<result property="departId" column="depart_id" jdbcType="VARCHAR"/>
<result property="professionalModule" column="professional_module" jdbcType="VARCHAR"/>
<result property="draftCompleteDate" column="draft_complete_date" jdbcType="TIMESTAMP"/>
<result property="planArchivingDate" column="plan_archiving_date" jdbcType="TIMESTAMP"/>
<result property="haveEnglishVersion" column="have_english_version" jdbcType="VARCHAR"/>
<result property="committee" column="committee" jdbcType="VARCHAR"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="orgCode" column="org_code" jdbcType="VARCHAR"/>
<result property="delFlag" column="del_flag" jdbcType="INTEGER"/>
</resultMap>
<sql id="Base_Column_List">
id,
process_id,
revision_type,
standard_id,
standard_number,
standard_name,
main_drafting_user,
depart_id,
professional_module,
draft_complete_date,
plan_archiving_date,
have_english_version,
committee,
create_by,
create_time,
update_by,
update_time,
org_code,
del_flag
</sql>
</mapper>
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jero.modules.activiti.process.annualinit.mapper.ProcessAnnualInitMapper">
<resultMap id="BaseResultMap" type="com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInit">
<!--@Table process_annual_init-->
<result property="id" column="id" jdbcType="VARCHAR"/>
<result property="departManager" column="depart_manager" jdbcType="VARCHAR"/>
<result property="standardDepartHandler" column="standard_depart_handler" jdbcType="VARCHAR"/>
<result property="standardDepartManager" column="standard_depart_manager" jdbcType="VARCHAR"/>
<result property="seniorManager" column="senior_manager" jdbcType="VARCHAR"/>
<result property="chiefInspector" column="chief_inspector" jdbcType="VARCHAR"/>
<result property="authorizedPerson" column="authorized_person" jdbcType="VARCHAR"/>
<result property="file" column="file" jdbcType="VARCHAR"/>
<result property="createBy" column="create_by" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateBy" column="update_by" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="orgCode" column="org_code" jdbcType="VARCHAR"/>
<result property="delFlag" column="del_flag" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,
depart_manager,
standard_depart_handler,
standard_depart_manager,
senior_manager,
chief_inspector,
authorized_person,
file,
create_by,
create_time,
update_by,
update_time,
org_code,
del_flag
</sql>
</mapper>
@@ -0,0 +1,378 @@
package com.jero.modules.activiti.process.annualinit.service;
import com.google.common.collect.Lists;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jero.common.api.vo.Result;
import com.jero.common.exception.JeroBootException;
import com.jero.common.system.api.ISysBaseAPI;
import com.jero.common.system.query.QueryGenerator;
import com.jero.common.system.vo.DictModel;
import com.jero.common.util.PasswordUtil;
import com.jero.modules.activiti.process.annualinit.common.ProcessAnnualInitCommon;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInitLink;
import com.jero.modules.activiti.process.annualinit.mapper.ProcessAnnualInitLinkMapper;
import com.jero.modules.activiti.process.annualinit.vo.ProcessAnnualInitLinkExcelVO;
import com.jero.modules.activiti.process.planchange.entity.ProcessPlanChangeLink;
import com.jero.modules.activiti.process.planchange.service.ProcessPlanChangeLinkService;
import com.jero.modules.activiti.process.planchange.service.ProcessPlanChangeService;
import com.jero.modules.laws.common.util.ImportUtil;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService;
import com.jero.modules.system.entity.SysDepart;
import com.jero.modules.system.service.ISysDepartService;
import org.apache.commons.lang3.StringUtils;
import org.jeecgframework.poi.excel.ExcelImportCheckUtil;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import java.io.IOException;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
* 年度制修订计划流程关联标准(ProcessAnnualInitLink)表服务实现类
*
* @author lijiarao
* @since 2024-09-24 14:30:22
*/
@Slf4j
@Service()
public class ProcessAnnualInitLinkService extends ServiceImpl<ProcessAnnualInitLinkMapper, ProcessAnnualInitLink> {
@Resource
private ProcessAnnualInitLinkMapper processAnnualInitLinkMapper;
@Resource
private ISysBaseAPI sysBaseAPI;
@Resource
private ILawsEnterpriseStandardService enterpriseStandardService;
@Resource
private ImportUtil importUtil;
@Resource
private ISysDepartService sysDepartService;
@Resource
private ProcessPlanChangeLinkService planChangeLinkService;
public IPage<ProcessAnnualInitLink> pageList(Page<ProcessAnnualInitLink> page, ProcessAnnualInitLink processAnnualInitLink, HttpServletRequest req) {
QueryWrapper<ProcessAnnualInitLink> queryWrapper = QueryGenerator.initQueryWrapper(processAnnualInitLink, req.getParameterMap());
Page<ProcessAnnualInitLink> pageList = this.page(page, queryWrapper);
List<ProcessAnnualInitLink> records = pageList.getRecords();
String userIds = records.stream().map(ProcessAnnualInitLink::getMainDraftingUser).collect(Collectors.joining(","));
List<DictModel> dictModels = sysBaseAPI.translateDictFromTableByKeys("sys_user", "email", "id", userIds);
Map<String, String> userMap = CollStreamUtil.toMap(dictModels, DictModel::getValue, DictModel::getText);
for (ProcessAnnualInitLink record : records) {
String mainDraftingUser = record.getMainDraftingUser();
String email = userMap.get(mainDraftingUser);
record.setEmail(PasswordUtil.decrypt(email));
}
return pageList;
}
public void add(ProcessAnnualInitLink processAnnualInitLink) {
this.save(processAnnualInitLink);
}
public void editById(ProcessAnnualInitLink processAnnualInitLink) {
this.updateById(processAnnualInitLink);
}
public void deleteById(String id) {
this.removeById(id);
}
public void deleteByIds(List<String> idList) {
for (String id : idList) {
deleteById(id);
}
}
public ProcessAnnualInitLink queryById(String id) {
ProcessAnnualInitLink processAnnualInitLink = this.getById(id);
return processAnnualInitLink;
}
public List<ProcessAnnualInitLinkExcelVO> importExcel(HttpServletRequest request) {
String processId = request.getParameter("businessId");
List<String> standardIdList = new ArrayList<>();
Integer type = 1;
if (StringUtils.isNotBlank(processId)){
LambdaQueryWrapper<ProcessAnnualInitLink> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessAnnualInitLink::getProcessId,processId);
List<ProcessAnnualInitLink> list = this.list(wrapper);
if (!list.isEmpty()){
standardIdList = list.stream().map(ProcessAnnualInitLink::getStandardId).collect(Collectors.toList());
}else {
type = 2;
LambdaQueryWrapper<ProcessPlanChangeLink> wrapper1 = new LambdaQueryWrapper<>();
wrapper1.eq(ProcessPlanChangeLink::getProcessId,processId);
List<ProcessPlanChangeLink> list1 = planChangeLinkService.list(wrapper1);
standardIdList = list1.stream().map(ProcessPlanChangeLink::getStandardId).collect(Collectors.toList());
}
}
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
// 获取上传文件对象
MultipartFile file = entity.getValue();
//校验文件名
String originalFilename = file.getOriginalFilename();
if (originalFilename != null) {
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
if (!".xlsx".equals(substring)&&!".xls".equals(substring)) {
throw new JeroBootException("文件类型错误:" + "请上传.xlsx或.xls文件!");
}
} else {
throw new JeroBootException("文件错误:" + "文件名丢失,请上传正确的文件!");
}
ImportParams params = new ImportParams();
params.setSheetNum(1);
params.setHeadRows(1);
try {
//导入Excel格式校验,看匹配的字段文本概率
Boolean t = ExcelImportCheckUtil.check(file.getInputStream(), ProcessAnnualInitLinkExcelVO.class, params);
if (t == null) {
throw new JeroBootException("导入数据为空!");
}
if(!t){
throw new JeroBootException("文件格式有误,请下载模板后上传 ");
}
List<ProcessAnnualInitLinkExcelVO> excelList = ExcelImportUtil.importExcel(file.getInputStream(), ProcessAnnualInitLinkExcelVO.class, params);
excelList = excelList.stream().skip(2).filter(item -> !Objects.isNull(item)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(excelList)) {
throw new JeroBootException("没有数据可导入");
}
StringBuilder msg = validateExcelData(excelList,standardIdList); // 校验数据
if (StringUtils.isNotEmpty(msg.toString())) {
throw new JeroBootException(msg.toString());
}
if (StringUtils.isNotBlank(processId)){
if (type == 1){
List<ProcessAnnualInitLink> list = convertToProcessAnnualInitLink(processId,excelList);
this.saveBatch(list);
}else {
List<ProcessPlanChangeLink> list = convertToProcessPlanChangeLink(processId,excelList);
planChangeLinkService.saveBatch(list);
}
}
return excelList;
} catch (Exception e) {
log.error("文件导入失败:",e);
if(Objects.isNull(e.getMessage())){
throw new JeroBootException("文件导入失败:请填写内容标题!");
}
throw new JeroBootException("文件导入失败:" + e.getMessage());
} finally {
try {
file.getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
private List<ProcessPlanChangeLink> convertToProcessPlanChangeLink(String processId, List<ProcessAnnualInitLinkExcelVO> excelList) {
List<ProcessPlanChangeLink> processPlanChangeLinklist=Lists.newArrayList();
for (ProcessAnnualInitLinkExcelVO processAnnualInitLinkExcelVO :excelList) {
processPlanChangeLinklist.add(convertFromProcessAnnualInitLinkExcelVO1(processId,processAnnualInitLinkExcelVO));
}
return processPlanChangeLinklist;
}
private ProcessPlanChangeLink convertFromProcessAnnualInitLinkExcelVO1(String processId, ProcessAnnualInitLinkExcelVO vo) {
ProcessPlanChangeLink processPlanChangeLink = new ProcessPlanChangeLink();
processPlanChangeLink.setProcessId(processId);
processPlanChangeLink.setRevisionType(vo.getRevisionType());
processPlanChangeLink.setStandardId(vo.getStandardId());
processPlanChangeLink.setStandardNumber(vo.getStandardNumber());
processPlanChangeLink.setStandardName(vo.getStandardName());
processPlanChangeLink.setMainDraftingUser(vo.getMainDraftingUser());
processPlanChangeLink.setEmail(vo.getEmail());
processPlanChangeLink.setDepartId(vo.getDepartId());
processPlanChangeLink.setProfessionalModule(vo.getProfessionalModule());
processPlanChangeLink.setDraftCompleteDate(DateUtil.parseDate(vo.getDraftCompleteDate()));
processPlanChangeLink.setPlanArchivingDate(DateUtil.parseDate(vo.getPlanArchivingDate()));
processPlanChangeLink.setHaveEnglishVersion(vo.getHaveEnglishVersion());
processPlanChangeLink.setCommittee(vo.getCommittee());
return processPlanChangeLink;
}
private List<ProcessAnnualInitLink> convertToProcessAnnualInitLink(String processId, List<ProcessAnnualInitLinkExcelVO> excelList) {
List<ProcessAnnualInitLink> processAnnualInitLinklist=Lists.newArrayList();
for (ProcessAnnualInitLinkExcelVO vo :excelList) {
processAnnualInitLinklist.add(convertFromProcessAnnualInitLinkExcelVO(processId,vo));
}
return processAnnualInitLinklist;
}
private ProcessAnnualInitLink convertFromProcessAnnualInitLinkExcelVO(String processId, ProcessAnnualInitLinkExcelVO vo) {
ProcessAnnualInitLink processAnnualInitLink = new ProcessAnnualInitLink();
processAnnualInitLink.setProcessId(processId);
processAnnualInitLink.setRevisionType(vo.getRevisionType());
processAnnualInitLink.setStandardId(vo.getStandardId());
processAnnualInitLink.setStandardNumber(vo.getStandardNumber());
processAnnualInitLink.setStandardName(vo.getStandardName());
processAnnualInitLink.setMainDraftingUser(vo.getMainDraftingUser());
processAnnualInitLink.setEmail(vo.getEmail());
processAnnualInitLink.setDepartId(vo.getDepartId());
processAnnualInitLink.setProfessionalModule(vo.getProfessionalModule());
processAnnualInitLink.setDraftCompleteDate(DateUtil.parseDate(vo.getDraftCompleteDate()));
processAnnualInitLink.setPlanArchivingDate(DateUtil.parseDate(vo.getPlanArchivingDate()));
processAnnualInitLink.setHaveEnglishVersion(vo.getHaveEnglishVersion());
processAnnualInitLink.setCommittee(vo.getCommittee());
return processAnnualInitLink;
}
private StringBuilder validateExcelData(List<ProcessAnnualInitLinkExcelVO> excelList, List<String> oldStandardIdList) {
StringBuilder msg = new StringBuilder();
//日期格式
String users = excelList.stream().map(ProcessAnnualInitLinkExcelVO::getMainDraftingUser).collect(Collectors.joining(","));
List<DictModel> dictModels = sysBaseAPI.translateDictFromTableByKeys("sys_user", "id", "CONCAT(realname, '(', username, ')')", users);
Map<String, String> userMap = CollStreamUtil.toMap(dictModels, DictModel::getValue, DictModel::getText);
List<DictModel> dictModels0 = sysBaseAPI.translateDictFromTableByKeys("sys_user", "email", "CONCAT(realname, '(', username, ')')", users);
Map<String, String> emailMap = CollStreamUtil.toMap(dictModels0, DictModel::getValue, DictModel::getText);
List<DictModel> dictModels1 = sysBaseAPI.getDictItems("esp_revision_type");
Map<String, String> espRevisionTypeMap = CollStreamUtil.toMap(dictModels1, DictModel::getText, DictModel::getValue);
String departs = excelList.stream().map(ProcessAnnualInitLinkExcelVO::getDepartId).collect(Collectors.joining(","));
List<DictModel> dictModels2 = sysBaseAPI.translateDictFromTableByKeys("sys_depart", "id", "depart_name", departs);
Map<String, String> departMap = CollStreamUtil.toMap(dictModels2, DictModel::getValue, DictModel::getText);
List<DictModel> dictModels3 = sysBaseAPI.getDictItems("professional_module");
Map<String, String> professionalModuleMap = CollStreamUtil.toMap(dictModels3, DictModel::getText, DictModel::getValue);
List<DictModel> dictModels4 = sysBaseAPI.getDictItems("yn");
Map<String, String> ynMap = CollStreamUtil.toMap(dictModels4, DictModel::getText, DictModel::getValue);
// 准备部门校验的数据
List<SysDepart> departList = sysDepartService.list();
Map<String, List<SysDepart>> sysDepartMap = departList.stream().collect(Collectors.groupingBy(SysDepart::getDepartName));
Map<String, String> sysDepartPathMap = SysDepart.buildPaths(departList);
LinkedList<String> standardNumberList = new LinkedList<>();
for (int i = 0; i < excelList.size(); i++) {
StringBuilder msgSub = new StringBuilder();
ProcessAnnualInitLinkExcelVO excelVO = excelList.get(i);
String revisionType = excelVO.getRevisionType();
if (StringUtils.isBlank(revisionType)){
msgSub.append("" + (i + 4) + "" + "制修订类型不能为空;");
}else if (!espRevisionTypeMap.containsKey(revisionType)){
msgSub.append("" + (i + 4) + "" + "制修订类型不存在;");
}else {
excelVO.setRevisionType(espRevisionTypeMap.get(revisionType));
}
String standardNumber = excelVO.getStandardNumber();
if (ProcessAnnualInitCommon.REVISE.equals(excelVO.getRevisionType())){
if (StringUtils.isBlank(standardNumber)){
msgSub.append("" + (i + 4) + "" + "企标编号不能为空;");
}else
if (standardNumberList.contains(standardNumber)) {
msgSub.append("" + (i + 4) + "" + "企标编号重复;");
} else {
standardNumberList.add(standardNumber);
LawsEnterpriseStandard lawsEnterpriseStandard = enterpriseStandardService.queryByStandardNumber(standardNumber);
if (lawsEnterpriseStandard != null){
String standardId = lawsEnterpriseStandard.getId();
if (oldStandardIdList.contains(standardId)) {
msgSub.append("" + (i + 4) + "" + "企标编号已经存在;");
}
excelVO.setStandardId(standardId);
//使用当前年份的年代号
String[] split = standardNumber.split("-");
split[split.length-1] = String.valueOf(DateUtil.thisYear());
String join = String.join("-", Arrays.asList(split));
excelVO.setStandardNumber(join);
}else {
msgSub.append("" + (i + 4) + "" + "企标编号不存在;");
}
}
}
String standardName = excelVO.getStandardName();
if (StringUtils.isBlank(standardName)){
msgSub.append("" + (i + 4) + "" + "企标名称不能为空;");
}
String mainDraftingUser = excelVO.getMainDraftingUser();
if (StringUtils.isBlank(mainDraftingUser)){
msgSub.append("" + (i + 4) + "" + "起草人不能为空;");
}else if (!userMap.containsKey(mainDraftingUser)){
msgSub.append("" + (i + 4) + "" + "起草人不存在;");
}else {
excelVO.setMainDraftingUser(userMap.get(mainDraftingUser));
excelVO.setEmail(PasswordUtil.decrypt(emailMap.get(mainDraftingUser)));
}
String departName = excelVO.getDepartId();
if (StringUtils.isBlank(departName)){
msgSub.append("" + (i + 4) + "" + "所在部门不能为空;");
}else {
if (!importUtil.multiOrgValid(departName, sysDepartMap, sysDepartPathMap)) {
msgSub.append("" + (i + 4) + "" + "所在部门填写错误 ");
} else {
// 转为id
String departId1 = importUtil.convertMultiOrgId(departName, sysDepartMap, sysDepartPathMap);
excelVO.setDepartId(departId1);
}
}
String professionalModule = excelVO.getProfessionalModule();
if (StringUtils.isBlank(professionalModule)){
msgSub.append("" + (i + 4) + "" + "专业模块不能为空;");
}else if (!professionalModuleMap.containsKey(professionalModule)){
msgSub.append("" + (i + 4) + "" + "专业模块不存在;");
}else {
excelVO.setProfessionalModule(professionalModuleMap.get(professionalModule));
}
String draftCompleteDate = excelVO.getDraftCompleteDate();
if (StringUtils.isBlank(draftCompleteDate)){
msgSub.append("" + (i + 4) + "" + "初稿完成日期不能为空;");
}else {
try {
LocalDate.parse(draftCompleteDate);
} catch (Exception e) {
msgSub.append("" + (i + 4) + "" + "初稿完成日期格式不正确,应为yyyy-MM-dd;");
}
}
String planArchivingDate = excelVO.getPlanArchivingDate();
if (StringUtils.isBlank(planArchivingDate)){
msgSub.append("" + (i + 4) + "" + "计划归档日期不能为空;");
}else {
try {
LocalDate.parse(planArchivingDate);
} catch (Exception e) {
msgSub.append("" + (i + 4) + "" + "计划归档日期格式不正确,应为yyyy-MM-dd;");
}
}
String haveEnglishVersion = excelVO.getHaveEnglishVersion();
if (StringUtils.isNotBlank(haveEnglishVersion)){
if (ynMap.containsKey(haveEnglishVersion)){
excelVO.setHaveEnglishVersion(ynMap.get(haveEnglishVersion));
}else {
msgSub.append("" + (i + 4) + "" + "是否有英文版不存在;");
}
}
String committee = excelVO.getCommittee();
if (StringUtils.isNotBlank(committee)&&committee.length()>500){
msgSub.append("" + (i + 4) + "" + "所属技术委员会最大为500字符;");
}
}
return msg;
}
}
@@ -0,0 +1,412 @@
package com.jero.modules.activiti.process.annualinit.service;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.google.common.collect.Lists;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.system.api.ISysBaseAPI;
import com.jero.modules.activiti.common.ActivitiCommon;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.annualinit.common.ProcessAnnualInitCommon;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInit;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInitLink;
import com.jero.modules.activiti.process.annualinit.mapper.ProcessAnnualInitMapper;
import com.jero.modules.activiti.process.annualinit.vo.ProcessAnnualInitVO;
import com.jero.modules.activiti.process.common.common.DraftCommon;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.dto.ProcessDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.WorkCenterService;
import com.jero.modules.laws.common.util.CurrentUserUtil;
import com.jero.modules.laws.enterprise.entity.ESPProjectStatus;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan;
import com.jero.modules.laws.enterprise.enums.ESPlanStatusEnum;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
/**
* 年度制修订计划流程(ProcessAnnualInit)表服务实现类
*
* @author lijiarao
* @since 2024-09-24 14:13:43
*/
@Slf4j
@Service()
public class ProcessAnnualInitService extends ServiceImpl<ProcessAnnualInitMapper, ProcessAnnualInit> {
@Resource
private ProcessAnnualInitMapper processAnnualInitMapper;
@Resource
private ISysBaseAPI sysBaseAPI;
@Resource
private IProcessHandleService processHandleService;
@Resource
private ProcessAllService processAllService;
@Resource
private TaskService taskService;
@Resource
private ProcessAnnualInitLinkService annualInitLinkService;
@Resource
private EnterpriseStandardPlanService esPlanService;
public void startProcess(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO) {
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
ProcessAnnualInitVO businessInfoDTO = processInfoVO.getBusinessInfoDTO();
ProcessAnnualInit annualInit = businessInfoDTO.getAnnualInit();
//补充流程主表信息
String departManagerList = (String) userInfoMap.get("departManagerList");
String standardDepartHandler = (String) userInfoMap.get("standardDepartHandler");
String standardDepartManager = (String) userInfoMap.get("standardDepartManager");
String seniorManagerList = (String) userInfoMap.get("seniorManagerList");
String chiefInspectorList = (String) userInfoMap.get("chiefInspectorList");
String authorizedPersonList = (String) userInfoMap.get("authorizedPersonList");
annualInit.setDepartManager(departManagerList);
annualInit.setStandardDepartHandler(standardDepartHandler);
annualInit.setStandardDepartManager(standardDepartManager);
annualInit.setSeniorManager(seniorManagerList);
annualInit.setChiefInspector(chiefInspectorList);
annualInit.setAuthorizedPerson(authorizedPersonList);
this.saveOrUpdate(annualInit);
String annualInitId = annualInit.getId();
List<ProcessAnnualInitLink> annualInitLinkList = businessInfoDTO.getAnnualInitLinkList();
for (ProcessAnnualInitLink link : annualInitLinkList) {
link.setProcessId(annualInitId);
}
annualInitLinkService.saveOrUpdateBatch(annualInitLinkList);
processInfoVO.setBusinessId(annualInitId);
//启动流程
BasicProcessInfoDTO basicProcessInfoDTO = processInfoVO.getBasicProcessInfoDTO();
basicProcessInfoDTO.setProcessDefinitionId(processHandleService.getDefinitionIdByKey(ProcessType.ANNUAL_INIT.getProcessKey())); // 流程定义id
basicProcessInfoDTO.setProcessType(ProcessTypeEnum.ANNUAL_INIT.getValue()); // 流程类型
userInfoMap.put(ProcessAnnualInitCommon.MAIN_DRAFTING_USER, CurrentUserUtil.getId());
processInfoVO.setUserInfoMap(userInfoMap);
String processInstanceId = processHandleService.startProcess(processInfoVO);
//start 先保存一份初始草稿
processInfoVO.setSaveSource(DraftCommon.INITIAL_SOURCE);
processHandleService.saveToDraft(processInfoVO, CurrentUserUtil.getId());
//end 保存初始草稿结束
//保存快照 start
saveToSnapshot(processInfoVO, processInstanceId);
//保存快照 end
}
public void submit(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO) {
BasicTaskInfoDTO basicTaskInfoDTO = processInfoVO.getBasicTaskInfoDTO();
String taskId = basicTaskInfoDTO.getTaskId();
ProcessDTO processDTO = processHandleService.getProcessDTO(taskId);
String processInstanceId = processDTO.getProcessInstanceId();
ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId);
processInfoVO.setBusinessId(processAll.getProjectId());
Task task = processDTO.getTask();
String taskDefinitionKey = task.getTaskDefinitionKey();
processHandleService.updateApprovalRecord(processInfoVO);
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
ProcessAnnualInitVO businessInfoDTO = processInfoVO.getBusinessInfoDTO();
ProcessAnnualInit annualInit = businessInfoDTO.getAnnualInit();
//补充流程主表信息
String departManagerList = (String) userInfoMap.get("departManagerList");
String standardDepartHandler = (String) userInfoMap.get("standardDepartHandler");
String standardDepartManager = (String) userInfoMap.get("standardDepartManager");
String seniorManagerList = (String) userInfoMap.get("seniorManagerList");
String chiefInspectorList = (String) userInfoMap.get("chiefInspectorList");
String authorizedPersonList = (String) userInfoMap.get("authorizedPersonList");
annualInit.setDepartManager(departManagerList);
annualInit.setStandardDepartHandler(standardDepartHandler);
annualInit.setStandardDepartManager(standardDepartManager);
annualInit.setSeniorManager(seniorManagerList);
annualInit.setChiefInspector(chiefInspectorList);
annualInit.setAuthorizedPerson(authorizedPersonList);
this.saveOrUpdate(annualInit);
String annualInitId = annualInit.getId();
//先删除,在新增
LambdaQueryWrapper<ProcessAnnualInitLink> myQuery = Wrappers.lambdaQuery(ProcessAnnualInitLink.class);
myQuery.eq(ProcessAnnualInitLink::getProcessId, annualInit);
annualInitLinkService.remove(myQuery);
List<ProcessAnnualInitLink> annualInitLinkList = businessInfoDTO.getAnnualInitLinkList();
for (ProcessAnnualInitLink link : annualInitLinkList) {
link.setProcessId(annualInitId);
}
annualInitLinkService.saveOrUpdateBatch(annualInitLinkList);
// 完成任务
Map<String, Object> variables = new HashMap<>();
taskService.complete(processDTO.getTaskId(), variables);
//保存快照 start
saveToSnapshot(processInfoVO, processInstanceId);
//保存快照 end
}
private void saveToSnapshot(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, String processInstanceId) {
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO processInfoDTO = new BasicProcessInfoDTO();
processInfoDTO.setProcessName(process.getPrcName());
processInfoDTO.setProcessType(process.getPrcType());
processInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
processInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
processInfoDTO.setProcessDescription(process.getPrcMes());
processInfoDTO.setProcessDueDate(process.getDueTime());
processInfoVO.setBasicProcessInfoDTO(processInfoDTO);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, CurrentUserUtil.getId());
}
}
public void approveTask(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, boolean pass) {
BasicTaskInfoDTO basicTaskInfoDTO = processInfoVO.getBasicTaskInfoDTO();
String taskId = basicTaskInfoDTO.getTaskId();
ProcessDTO processDTO = processHandleService.getProcessDTO(taskId);
String processInstanceId = processDTO.getProcessInstanceId();
ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId);
processInfoVO.setBusinessId(processAll.getProjectId());
Task task = processDTO.getTask();
String taskDefinitionKey = task.getTaskDefinitionKey();
processHandleService.updateApprovalRecord(processInfoVO);
switch (taskDefinitionKey) {
//部门经理审批
case ProcessAnnualInitCommon.BMJLSP:
bmjlspApprove(processInfoVO, processDTO, pass);
break;
//法规部门处理人审批
case ProcessAnnualInitCommon.FGBMCLRSP:
fgbmclrspApprove(processInfoVO, processDTO, pass);
break;
//法规部门经理审批
case ProcessAnnualInitCommon.FGBMJLSP:
fgbmjlspApprove(processInfoVO, processDTO, pass);
break;
//高级经理审批
case ProcessAnnualInitCommon.GJJLSP:
gjjlspApprove(processInfoVO, processDTO, pass);
break;
//总监审批
case ProcessAnnualInitCommon.ZJSP:
zjspApprove(processInfoVO, processDTO, pass);
break;
//授权人审批
case ProcessAnnualInitCommon.SQRSP:
sqrspApprove(processInfoVO, processDTO, pass);
break;
default:
}
//保存快照 start
saveToSnapshot(processInfoVO, processInstanceId);
//保存快照 end
}
private void bmjlspApprove(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, ProcessDTO processDTO, boolean pass) {
ProcessApprovalRecord processApprovalRecord = processDTO.getProcessApprovalRecord();
String originUserId = processApprovalRecord.getOriginUserId();
String userId = CurrentUserUtil.getId();
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
// 完成任务
Map<String, Object> variables = new HashMap<>();
variables.put(ActivitiCommon.PASS, pass);
variables.put(ProcessAnnualInitCommon.STANDARD_DEPART_HANDLER, annualInit.getStandardDepartHandler());
taskService.complete(processDTO.getTaskId(), variables);
if (!Objects.equals(userId, originUserId)) {
String departManager = annualInit.getDepartManager();
String userIdList = departManager.replaceAll(originUserId, userId);
LambdaUpdateWrapper<ProcessAnnualInit> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAnnualInit::getId, businessId);
updateWrapper.set(ProcessAnnualInit::getDepartManager, userIdList);
update(updateWrapper);
}
}
private void fgbmclrspApprove(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, ProcessDTO processDTO, boolean pass) {
ProcessApprovalRecord processApprovalRecord = processDTO.getProcessApprovalRecord();
String originUserId = processApprovalRecord.getOriginUserId();
String userId = CurrentUserUtil.getId();
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
// 完成任务
Map<String, Object> variables = new HashMap<>();
variables.put(ActivitiCommon.PASS, pass);
variables.put(ProcessAnnualInitCommon.STANDARD_DEPART_MANAGER, annualInit.getStandardDepartManager());
taskService.complete(processDTO.getTaskId(), variables);
if (!Objects.equals(userId, originUserId)) {
LambdaUpdateWrapper<ProcessAnnualInit> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAnnualInit::getId, businessId);
updateWrapper.set(ProcessAnnualInit::getStandardDepartHandler, userId);
update(updateWrapper);
}
}
private void fgbmjlspApprove(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, ProcessDTO processDTO, boolean pass) {
ProcessApprovalRecord processApprovalRecord = processDTO.getProcessApprovalRecord();
String originUserId = processApprovalRecord.getOriginUserId();
String userId = CurrentUserUtil.getId();
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
// 完成任务
Map<String, Object> variables = new HashMap<>();
variables.put(ActivitiCommon.PASS, pass);
variables.put(ProcessAnnualInitCommon.SENIOR_MANAGER_LIST, Arrays.asList(annualInit.getSeniorManager().split(",")));
taskService.complete(processDTO.getTaskId(), variables);
if (!Objects.equals(userId, originUserId)) {
LambdaUpdateWrapper<ProcessAnnualInit> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAnnualInit::getId, businessId);
updateWrapper.set(ProcessAnnualInit::getStandardDepartManager, userId);
update(updateWrapper);
}
}
private void gjjlspApprove(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, ProcessDTO processDTO, boolean pass) {
ProcessApprovalRecord processApprovalRecord = processDTO.getProcessApprovalRecord();
String originUserId = processApprovalRecord.getOriginUserId();
String userId = CurrentUserUtil.getId();
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
// 完成任务
Map<String, Object> variables = new HashMap<>();
variables.put(ActivitiCommon.PASS, pass);
variables.put(ProcessAnnualInitCommon.CHIEF_INSPECTOR_LIST, Arrays.asList(annualInit.getChiefInspector().split(",")));
taskService.complete(processDTO.getTaskId(), variables);
if (!Objects.equals(userId, originUserId)) {
String departManager = annualInit.getSeniorManager();
String userIdList = departManager.replaceAll(originUserId, userId);
LambdaUpdateWrapper<ProcessAnnualInit> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAnnualInit::getId, businessId);
updateWrapper.set(ProcessAnnualInit::getSeniorManager, userIdList);
update(updateWrapper);
}
}
private void zjspApprove(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, ProcessDTO processDTO, boolean pass) {
ProcessApprovalRecord processApprovalRecord = processDTO.getProcessApprovalRecord();
String originUserId = processApprovalRecord.getOriginUserId();
String userId = CurrentUserUtil.getId();
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
// 完成任务
Map<String, Object> variables = new HashMap<>();
variables.put(ActivitiCommon.PASS, pass);
variables.put(ProcessAnnualInitCommon.AUTHORIZED_PERSON_LIST, Arrays.asList(annualInit.getAuthorizedPerson().split(",")));
taskService.complete(processDTO.getTaskId(), variables);
if (!Objects.equals(userId, originUserId)) {
String departManager = annualInit.getChiefInspector();
String userIdList = departManager.replaceAll(originUserId, userId);
LambdaUpdateWrapper<ProcessAnnualInit> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAnnualInit::getId, businessId);
updateWrapper.set(ProcessAnnualInit::getChiefInspector, userIdList);
update(updateWrapper);
}
}
private void sqrspApprove(ProcessInfoVO<ProcessAnnualInitVO> processInfoVO, ProcessDTO processDTO, boolean pass) {
ProcessApprovalRecord processApprovalRecord = processDTO.getProcessApprovalRecord();
String originUserId = processApprovalRecord.getOriginUserId();
String userId = CurrentUserUtil.getId();
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
// 完成任务
Map<String, Object> variables = new HashMap<>();
variables.put(ActivitiCommon.PASS, pass);
taskService.complete(processDTO.getTaskId(), variables);
if (!Objects.equals(userId, originUserId)) {
String departManager = annualInit.getAuthorizedPerson();
String userIdList = departManager.replaceAll(originUserId, userId);
LambdaUpdateWrapper<ProcessAnnualInit> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(ProcessAnnualInit::getId, businessId);
updateWrapper.set(ProcessAnnualInit::getAuthorizedPerson, userIdList);
update(updateWrapper);
}
if (pass){
LambdaQueryWrapper<ProcessAnnualInitLink> myQuery = Wrappers.lambdaQuery(ProcessAnnualInitLink.class);
myQuery.eq(ProcessAnnualInitLink::getProcessId, businessId);
List<ProcessAnnualInitLink> list = annualInitLinkService.list(myQuery);
List<EnterpriseStandardPlan> enterpriseStandardPlanList = convertToEnterpriseStandardPlanList(list);
esPlanService.saveBatch(enterpriseStandardPlanList);
}
}
private List<EnterpriseStandardPlan> convertToEnterpriseStandardPlanList(List<ProcessAnnualInitLink> list) {
List<EnterpriseStandardPlan> enterpriseStandardPlanlist=Lists.newArrayList();
for (ProcessAnnualInitLink processAnnualInitLink :list) {
enterpriseStandardPlanlist.add(convertFromProcessAnnualInitLink(processAnnualInitLink));
}
return enterpriseStandardPlanlist;
}
private EnterpriseStandardPlan convertFromProcessAnnualInitLink(ProcessAnnualInitLink processAnnualInitLink) {
EnterpriseStandardPlan enterpriseStandardPlan = new EnterpriseStandardPlan();
enterpriseStandardPlan.setRevisionType(processAnnualInitLink.getRevisionType());
//enterpriseStandardPlan.setProjectType();
enterpriseStandardPlan.setStandardId(processAnnualInitLink.getStandardId());
enterpriseStandardPlan.setStandardNumber(processAnnualInitLink.getStandardNumber());
enterpriseStandardPlan.setStandardName(processAnnualInitLink.getStandardName());
enterpriseStandardPlan.setMainDraftingUser(processAnnualInitLink.getMainDraftingUser());
enterpriseStandardPlan.setDepartId(processAnnualInitLink.getDepartId());
enterpriseStandardPlan.setProfessionalModule(processAnnualInitLink.getProfessionalModule());
enterpriseStandardPlan.setHaveEnglishVersion(processAnnualInitLink.getHaveEnglishVersion());
enterpriseStandardPlan.setCommittee(processAnnualInitLink.getCommittee());
enterpriseStandardPlan.setProjectStatus(ESPProjectStatus.NOT_STARTED.getValue());
enterpriseStandardPlan.setPlanStatus(ESPlanStatusEnum.ADD.getValue());
Date draftCompleteDate = processAnnualInitLink.getDraftCompleteDate();
enterpriseStandardPlan.setDraftCompleteDate(draftCompleteDate);
Date planArchivingDate = processAnnualInitLink.getPlanArchivingDate();
enterpriseStandardPlan.setPlanArchivingDate(planArchivingDate);
DateTime date = DateUtil.date();
//初稿完成日期和计划归档日期有逾期
if (date.compareTo(draftCompleteDate) >= 0 || date.compareTo(planArchivingDate) >= 0){
enterpriseStandardPlan.setProjectStatus(ESPProjectStatus.OVERDUE.getValue());
}
return enterpriseStandardPlan;
}
public ProcessInfoVO<ProcessAnnualInitVO> getHandleData(String taskId) {
ProcessInfoVO processInfoVO = processHandleService.queryProcessInfoVO(taskId);
String businessId = processInfoVO.getBusinessId();
ProcessAnnualInit annualInit = this.getById(businessId);
ProcessAnnualInitVO annualInitVO = new ProcessAnnualInitVO();
annualInitVO.setAnnualInit(annualInit);
LambdaQueryWrapper<ProcessAnnualInitLink> myQuery = Wrappers.lambdaQuery(ProcessAnnualInitLink.class);
myQuery.eq(ProcessAnnualInitLink::getProcessId, businessId);
List<ProcessAnnualInitLink> list = annualInitLinkService.list(myQuery);
annualInitVO.setAnnualInitLinkList(list);
processInfoVO.setBusinessInfoDTO(annualInitVO);
return processInfoVO;
}
}
@@ -0,0 +1,108 @@
package com.jero.modules.activiti.process.annualinit.vo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
* 年度制修订计划流程关联标准 Excel导入VO
*
* @author lijiarao
* @since 2024-09-24 14:30:21
*/
@Data
@ApiModel(value = "ProcessAnnualInitLinkExcelVO", description = "年度制修订计划流程关联标准 Excel导入VO")
public class ProcessAnnualInitLinkExcelVO implements Serializable {
private static final long serialVersionUID = 647513571439825961L;
/**
* 制修订类别
*/
@ApiModelProperty(value = "制修订类别")
@Excel(name = "*制修订类型", width = 15)
@Dict(dicCode = "esp_revision_type")
private String revisionType;
/**
* 标准id
*/
@ApiModelProperty(value = "标准id")
private String standardId;
/**
* 标准编号
*/
@ApiModelProperty(value = "标准编号")
@Excel(name = "*企标编号", width = 15)
private String standardNumber;
/**
* 标准名称
*/
@ApiModelProperty(value = "标准名称")
@Excel(name = "*企标名称", width = 15)
private String standardName;
/**
* 起草人
*/
@ApiModelProperty(value = "起草人")
@Excel(name = "*起草人", width = 15)
@Dict(dictTable = "sys_user", dicText = "CONCAT(realname, '(', username, ')')", dicCode = "id")
private String mainDraftingUser;
/**
* 邮箱
*/
@TableField(exist = false)
@ApiModelProperty(value = "邮箱")
private String email;
/**
* 所在部门id
*/
@ApiModelProperty(value = "所在部门id")
@Excel(name = "*所在部门")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
private String departId;
/**
* 专业模块
*/
@ApiModelProperty(value = "专业模块")
@Excel(name = "*专业模块", width = 15)
@Dict(dicCode = "professional_module")
private String professionalModule;
/**
* 初稿完成日期
*/
@ApiModelProperty(value = "初稿完成日期")
@Excel(name = "*初稿完成日期", width = 15)
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private String draftCompleteDate;
/**
* 计划归档日期
*/
@ApiModelProperty(value = "计划归档日期")
@Excel(name = "*计划归档日期", width = 15)
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private String planArchivingDate;
/**
* 是否有英文版
*/
@ApiModelProperty(value = "是否有英文版")
@Excel(name = "是否有英文版", width = 15)
@Dict(dicCode = "yn")
private String haveEnglishVersion;
/**
* 所属技术委员会
*/
@ApiModelProperty(value = "所属技术委员会")
@Excel(name = "所属技术委员会", width = 15)
private String committee;
}
@@ -0,0 +1,21 @@
package com.jero.modules.activiti.process.annualinit.vo;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInit;
import com.jero.modules.activiti.process.annualinit.entity.ProcessAnnualInitLink;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author liJiaRao
* @date 2024-09-25 13:51
*/
@Data
public class ProcessAnnualInitVO {
@ApiModelProperty(value = "流程主表信息")
private ProcessAnnualInit annualInit;
@ApiModelProperty(value = "关联标准信息")
private List<ProcessAnnualInitLink> annualInitLinkList;
}
@@ -0,0 +1,23 @@
package com.jero.modules.activiti.process.carEsApproval.common;
/**
* @author: Mzaxd
* @Date: 2023/12/19 15:14
*/
public class CarEsApprovalTaskNodeIdConstant {
/** 法规工程师确认是否开启征求意见 */
public static final String START = "Activity_1siuksf";
/** 设计工程师填写意见 */
public static final String ONE = "Activity_04m430n";
/** 法规工程师汇总数据 */
public static final String TWO = "Activity_1riqzkp";
/** 法规工程师派号 */
public static final String THREE = "Activity_11uuyg0";
/** 主起草人 */
public static final String FOUR = "mainDraftUser";
/** 法规工程师 */
public static final String FIVE = "standardEngineer";
/** 征求意见人员 */
public static final String SIX = "adviceUserList";
}
@@ -0,0 +1,90 @@
package com.jero.modules.activiti.process.carEsApproval.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.carEsApproval.service.CarEsApprovalService;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.carEsApproval.entity.ProcessCarEsApproval;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author: Mzaxd
* @Date: 2023/10/18 10:44
*/
@Slf4j
@RestController
@Api(tags = "整车企业标准报批流程")
@RequestMapping("/process/es/carEsApproval")
public class CarEsApprovalController {
@Resource
private CarEsApprovalService flowService;
@Resource
private ActFlowCommonService actFlowCommonService;
/**
* 整车企业标准报批流程
*
* @param processInfoVO
*/
@AutoLog(value = "整车企业标准报批流程-发起流程")
@ApiOperation(value="整车企业标准报批流程-发起流程", notes="整车企业标准报批流程-发起流程")
@PostMapping("/start")
public Result<?> startProcess(@RequestBody ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
flowService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "整车企业标准报批流程-提交")
@ApiOperation(value = "整车企业标准报批流程-提交", notes = "整车企业标准报批流程-提交")
@PostMapping("/submit")
public Result<T> submit(@RequestBody ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
flowService.submit(processInfoVO);
return Result.OK();
}
/**
* 保存到待办
* @param taskId
*/
@AutoLog(value = "整车企业标准报批流程-办理")
@ApiOperation(value="整车企业标准报批流程-办理", notes="整车企业标准报批流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.MACHINE_ES_APPROVAL);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(flowService.getHandleData(taskId));
}
@AutoLog(value = "整车企业标准报批流程-同意")
@ApiOperation(value = "整车企业标准报批流程-同意", notes = "整车企业标准报批流程-同意")
@PostMapping("/agree")
public Result<T> agree(@RequestBody ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
flowService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "整车企业标准报批流程-驳回")
@ApiOperation(value = "整车企业标准报批流程-驳回", notes = "整车企业标准报批流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@RequestBody ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
flowService.approveTask(processInfoVO, false);
return Result.OK();
}
}
@@ -0,0 +1,98 @@
package com.jero.modules.activiti.process.carEsApproval.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*
* @TableName process_car_es_approval
*/
@TableName(value ="process_car_es_approval")
@Data
public class ProcessCarEsApproval implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String orgCode;
/**
* 0表示未删除,1表示删除
*/
@ApiModelProperty(value = "0表示未删除,1表示删除")
private Integer delFlag;
/**
* 流程实例Id
*/
@ApiModelProperty(value = "流程实例Id")
private String processInstanceId;
/**
* 在线编辑文件id
*/
@ApiModelProperty(value = "在线编辑文件id")
private String onEditFile;
/**
* 业务json数据
*/
@ApiModelProperty(value = "业务JSON数据")
private String businessJson;
/**
* 附件
*/
@Dict(dictTable = "sys_oss", dicText = "fileName", dicCode = "id")
@ApiModelProperty(value = "附件")
private String attach;
/**
* 抄送人员
*/
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
@ApiModelProperty(value = "抄送人员")
private String copyUser;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,60 @@
package com.jero.modules.activiti.process.carEsApproval.listener;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.jero.modules.activiti.process.carEsApproval.entity.ProcessCarEsApproval;
import com.jero.modules.activiti.process.carEsApproval.service.CarEsApprovalService;
import com.jero.modules.activiti.process.common.enums.StandardStateEnum;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.tag.enums.TableNameEnum;
import lombok.SneakyThrows;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Map;
/**
* @author: Mzaxd
* @Date: 2023/12/19 11:59
*/
@Component
public class ProcessCarEsApprovalEndListener implements ExecutionListener {
@Resource
private CarEsApprovalService flowService;
@Resource
private ILawsCommonService lawsCommonService;
@SneakyThrows
@Override
public void notify(DelegateExecution delegateExecution) {
// 获取流程实例Id
String processInstanceId = delegateExecution.getProcessInstanceId();
// 根据流程Id获取业务数据
LambdaQueryWrapper<ProcessCarEsApproval> revisionWrapper = new LambdaQueryWrapper<>();
revisionWrapper.eq(ProcessCarEsApproval::getProcessInstanceId, processInstanceId);
// 获取企标相关数据
ProcessCarEsApproval data = flowService.getOne(revisionWrapper);
// 将数据转换为Map
Map<String, Object> variables = transMap(data);
// 发布企标
lawsCommonService.commonAdd(variables);
}
private Map<String, Object> transMap(ProcessCarEsApproval data) {
Map<String, Object> variables = JSON.parseObject(data.getBusinessJson(), Map.class);
variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue());
// 标准状态
variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.CURRENTLY_EFFECTIVE.getStateValue());
String standardId = IdWorker.getIdStr();
variables.put(FieldCommon.ID, standardId);
String onEditFile = data.getOnEditFile();
// 发布稿
variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile);
return variables;
}
}
@@ -0,0 +1,18 @@
package com.jero.modules.activiti.process.carEsApproval.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jero.modules.activiti.process.carEsApproval.entity.ProcessCarEsApproval;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Mapper
* @createDate 2023-12-19 11:58:59
* @Entity com.jero.modules.activiti.process.esRevision.entity.EsRevision
*/
public interface ProcessCarEsApprovalMapper extends BaseMapper<ProcessCarEsApproval> {
}
@@ -0,0 +1,22 @@
package com.jero.modules.activiti.process.carEsApproval.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.carEsApproval.entity.ProcessCarEsApproval;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Service
* @createDate 2023-12-19 11:58:59
*/
public interface CarEsApprovalService extends IService<ProcessCarEsApproval> {
ProcessInfoVO<ProcessCarEsApproval> getHandleData(String taskId);
void startProcess(ProcessInfoVO<ProcessCarEsApproval> processInfoVO);
void submit(ProcessInfoVO<ProcessCarEsApproval> processInfoVO);
void approveTask(ProcessInfoVO<ProcessCarEsApproval> processInfoVO, boolean pass);
}
@@ -0,0 +1,243 @@
package com.jero.modules.activiti.process.carEsApproval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.CommitFlagEnum;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.carEsApproval.mapper.ProcessCarEsApprovalMapper;
import com.jero.modules.activiti.process.carEsApproval.service.CarEsApprovalService;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.carEsApproval.entity.ProcessCarEsApproval;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.sys.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import static com.jero.modules.activiti.common.ActivitiCommon.*;
import static com.jero.modules.activiti.process.specialEsApproval.common.SpecialEsApprovalTaskNodeIdConstant.TWO;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Service实现
* @createDate 2023-12-19 11:58:59
*/
@Service
@Slf4j
@Transactional(rollbackFor = JeroBootException.class)
public class CarEsApprovalServiceImpl extends ServiceImpl<ProcessCarEsApprovalMapper, ProcessCarEsApproval>
implements CarEsApprovalService {
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private RuntimeService runtimeService;
@Resource
private IProcessHandleService processHandleService;
@Resource
private TaskService taskService;
@Resource
private ProcessApprovalRecordService approvalRecordService;
@Override
public void startProcess(ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
// 流程Key
String processDefinitionKey = ProcessType.CAR_ES_APPROVAL.getProcessKey();
// 流程信息
BasicProcessInfoDTO processInfo = processInfoVO.getBasicProcessInfoDTO();
// 任务信息
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 当前用户Id
String userId = UserUtils.getUserId();
// 设置流程变量
Map<String, Object> actVariables = this.setVariables(processInfoVO);
// 删除草稿
actFlowCommonService.getExistDraftAndRemove(processInfoVO.getDraftId());
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
processInfo.setProcessInstanceId(processInstanceId);
processInfo.setProcessDefinitionId(processDefinitionId);
processInfo.setProcessType(ProcessTypeEnum.MACHINE_ES_APPROVAL.getValue());
// 第一个节点业务数据处理
this.startNodeBusProcess(processInfoVO);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap);
// 获取第一个任务的taskId
String taskId = actFlowCommonService.getFirstTaskId(processInstanceId, userId, processDefinitionId);
processTask.setTaskId(taskId);
// 保存第一个节点的草稿
processHandleService.saveToDraft(processInfoVO, userId);
// 保存第一个节点的快照
processHandleService.saveToSnapshot(processInfoVO, userId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 根据流程实例id更新流程总表
actFlowCommonService.updateProcessAll(processInfo);
// 自动完成第一个任务
actFlowCommonService.completeTask(taskId, userId);
}
private void startNodeBusProcess(ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
String processInstanceId = processInfoVO.getBasicProcessInfoDTO().getProcessInstanceId();
ProcessCarEsApproval processInfo = processInfoVO.getBusinessInfoDTO();
processInfo.setProcessInstanceId(processInstanceId);
save(processInfo);
}
private Map<String, Object> setVariables(ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
Map<String, Object> result = new HashMap<>();
// 将所有多选人员转换为List后放入map中
result.put(MAIN_DRAFT_USER, userInfoMap.get(MAIN_DRAFT_USER));
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_ONE_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_TWO_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_THREE_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_FOUR_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_FIVE_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_SIX_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_SEVEN_List);
// 获取分发人
return result;
}
@Override
public ProcessInfoVO<ProcessCarEsApproval> getHandleData(String taskId) {
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException(ResultCommon.TASK_NOT_EXISTS);
}
ProcessInfoVO<ProcessCarEsApproval> result = new ProcessInfoVO<>();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
result.setBasicProcessInfoDTO(actFlowCommonService.getProcessInfo(processInstanceId));
// 获取当前流程数据
LambdaQueryWrapper<ProcessCarEsApproval> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessCarEsApproval::getProcessInstanceId, processInstanceId);
ProcessCarEsApproval processVo = getOne(queryWrapper);
// 设置流程信息
result.setBusinessInfoDTO(processVo);
return result;
}
@Override
public void submit(ProcessInfoVO<ProcessCarEsApproval> processInfoVO) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 校验是否有权限操作此待办
processHandleService.validTask(taskId);
// 获取当前节点的id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO();
// 使用流程引擎根据taskId找到流程实例Id
processInfo.setProcessInstanceId(processInstanceId);
processInfoVO.setBasicProcessInfoDTO(processInfo);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
String curUserId = UserUtils.getUserId();
ProcessCarEsApproval data = processInfoVO.getBusinessInfoDTO();
// 根据流程实例Id获取流程定义ID
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
// 获取数据库中的流程信息
LambdaQueryWrapper<ProcessCarEsApproval> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessCarEsApproval::getProcessInstanceId, processInstanceId);
ProcessCarEsApproval dataFromDb = getOne(queryWrapper);
if (dataFromDb != null) {
data.setId(dataFromDb.getId());
}
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
// 判断是否开启征求意见子流程 设置流程变量
Map<String, Object> actVariable = this.setVariables(processInfoVO);
taskService.setVariables(taskId, actVariable);
// 保存流程数据
saveOrUpdate(data);
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, processInfoVO.getUserInfoMap());
// 完成任务
actFlowCommonService.completeTask(taskId, curUserId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 删除草稿
actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, curUserId);
}
@Override
public void approveTask(ProcessInfoVO<ProcessCarEsApproval> processInfoVO, boolean pass) {
// 获取task
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 校验是否有权限操作此待办
processHandleService.validTask(taskId);
String prcId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO();
processInfo.setProcessInstanceId(prcId);
processInfoVO.setBasicProcessInfoDTO(processInfo);
// 获取当前节点的id
ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId);
String xmlNodeId = record.getNodeId();
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
String curUserId = UserUtils.getUserId();
if (xmlNodeId.equals(TWO)) {
// 获取数据库中的流程信息
ProcessCarEsApproval data = processInfoVO.getBusinessInfoDTO();
LambdaQueryWrapper<ProcessCarEsApproval> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessCarEsApproval::getProcessInstanceId, processInstanceId);
ProcessCarEsApproval dataFromDb = getOne(queryWrapper);
if (dataFromDb != null) {
data.setId(dataFromDb.getId());
}
// 保存数据
updateById(data);
}
// 设置流程变量
runtimeService.setVariable(processInstanceId, PASS, pass);
// 会签节点驳回后修改其他节点的状态
approvalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, curUserId);
// 审批节点
actFlowCommonService.completeTask(taskId, curUserId);
// 驳回,结束所有节点
approvalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 更新审批表为完成,填充数据
processTask.setCommitFlag(pass ? CommitFlagEnum.PASS.getValue() : CommitFlagEnum.REJECT.getValue());
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 删除草稿
actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId);
}
}
@@ -14,7 +14,18 @@ public enum ProcessType {
NEW_STANDARD_IMPORT("新法规导入流程", "1", "new_standard_import", "ProcessNewStandardImportServiceImpl"),
STANDARD_INTERPRET("标准解读流程", "2", "standard_interpret", "StandardInterpretFlowServiceImpl"),
STANDARD_COMPLIANCE_CHECK("法规符合性评估流程", "3", "laws-evaluation-main", "ProcessStandardComplianceCheckServiceImpl"),
MARKET_STANDARD_PUBLISH("市场清单发布流程", "4", "market_standard_publish", "ProcessNewStandardImportServiceImpl"),
MARKET_STANDARD_PUBLISH("市场清单发布流程", "4", "market_standard_publish", "ProcessMarketStandardReleaseServiceImpl"),
ENTERPRISE_STANDARD_ABOLISH_PUBLISH("企标废止发布流程", "5", "enterprise_standard_abolish_publish", "ProcessAbolishReleaseServiceImpl"),
ES_REVISION_ADVICE("企标制修订及征求意见流程", "6", "es_revision_advice", "ProcessEsRevisionServiceImpl"),
ANNUAL_INIT("企业标准年度制修订计划流程", "7", "process-annual-init", "ProcessAnnualInitService"),
DOMESTIC_VEHICLE_CONTROL_PUBLISH("国内整车型号和VIN前八位管控流程", "8", "domestic_vehicle_control_publish", "ProcessVehicleDomesticReleaseServiceImpl"),
PLAN_CHANGE("企业标准计划变更流程", "9", "process-plan-change", "ProcessPlanChangeService"),
INTERNATIONAL_VEHICLE_CONTROL_PUBLISH("国际整车型号和VIN前八位管控流程", "10", "international_vehicle_control_publish", "ProcessVehicleInternationalReleaseServiceImpl"),
PART_TYPE_APPLY("关键零部件型号申请流程", "11", "part_type_apply","ProcessPartTypeApplyServiceImpl"),
SPECIAL_ES_APPROVAL("专业技术企业标准报批流程", "12", "special_es_approval", "ProcessSpecialEsApprovalServiceImpl"),
MACHINE_ES_APPROVAL("产品标准-整车企业标准报批流程", "13", "machine_es_approval", "ProcessMachineEsApprovalServiceImpl"),
CAR_ES_APPROVAL("产品标准-整机企业标准报批流程", "14", "car_es_approval", "ProcessEsCarApprovalServiceImpl"),
ES_RECHECK("企标复审流程", "15", "es_recheck", "ProcessEsRecheckServiceImpl"),
;
private final String name;
@@ -8,7 +8,7 @@ import lombok.Getter;
*/
@Getter
public enum StandardStateEnum {
SEEK_FOR_OPINIONS("征求意见","2"),
CURRENTLY_EFFECTIVE("现行有效","8"),
ABOLISH("废止","9"),
;
@@ -110,7 +110,7 @@ public class ActFlowCommonService {
* @param flowUserInfoVO
* @param key
*/
public void convertAndPutList(HashMap<String, Object> map, Map<String, Object> flowUserInfoVO, String key) {
public void convertAndPutList(Map<String, Object> map, Map<String, Object> flowUserInfoVO, String key) {
Optional.ofNullable(flowUserInfoVO.get(key))
.map(Object::toString)
.map(s -> Arrays.asList(s.split(",")))
@@ -0,0 +1,29 @@
package com.jero.modules.activiti.process.esRevisionAdvice.common;
/**
* @author: Mzaxd
* @Date: 2023/12/19 15:14
*/
public class RevisionTaskNodeIdConstant {
/** 主起草人发起 */
public static final String START = "Activity_0v98tow";
/** 法规工程师确认是否开启征求意见 */
public static final String CONFIRM_ADVISE = "Activity_1siuksf";
/** 设计工程师填写意见 */
public static final String ADVICE = "Activity_04m430n";
/** 法规工程师汇总数据 */
public static final String ADVICE_COLLECT = "Activity_1riqzkp";
/** 法规工程师派号 */
public static final String SET_STANDARD_NUMBER = "Activity_11uuyg0";
/** 主起草人 */
public static final String MAIN_DRAFT_USER = "mainDraftUser";
/** 法规工程师 */
public static final String STANDARD_ENGINEER = "standardEngineer";
/** 征求意见人员 */
public static final String ADVICE_USER_LIST = "adviceUserList";
/** 开启征求意见 */
public static final String OPEN = "open";
/** 开启征求意见 */
public static final String CAN_REJECT = "canReject";
}
@@ -0,0 +1,81 @@
package com.jero.modules.activiti.process.esRevisionAdvice.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.vo.ProcessRevisionVO;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author: Mzaxd
* @Date: 2023/10/18 10:44
*/
@Slf4j
@RestController
@Api(tags = "企标制修订征求意见流程")
@RequestMapping("/process/es/revision")
public class ESRevisionController {
@Resource
private EsRevisionService revisionService;
@Resource
private ActFlowCommonService actFlowCommonService;
/**
* 企标制修订流程
*
* @param processInfoVO
*/
@AutoLog(value = "企标制修订流程-发起流程")
@ApiOperation(value="企标制修订流程-发起流程", notes="企标制修订流程-发起流程")
@PostMapping("/start")
public Result<?> startProcess(@RequestBody ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
revisionService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "企标制修订流程-提交")
@ApiOperation(value = "企标制修订流程-提交", notes = "企标制修订流程-提交")
@PostMapping("/submit")
public Result<T> submit(@RequestBody ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
revisionService.submit(processInfoVO);
return Result.OK();
}
@AutoLog(value = "整车企业标准报批流程-驳回")
@ApiOperation(value = "整车企业标准报批流程-驳回", notes = "整车企业标准报批流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@RequestBody ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
revisionService.approveTask(processInfoVO, false);
return Result.OK();
}
/**
* 保存到待办
* @param taskId
*/
@AutoLog(value = "企标制修订流程-办理")
@ApiOperation(value="企标制修订流程-办理", notes="企标制修订流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.ES_REVISION_ADVICE);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(revisionService.getHandleData(taskId));
}
}
@@ -0,0 +1,131 @@
package com.jero.modules.activiti.process.esRevisionAdvice.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
*
* @TableName process_es_revision_advice
*/
@TableName(value ="process_es_revision_advice")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EsRevisionAdvice implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String orgCode;
/**
* 流程实例Id
*/
@ApiModelProperty(value = "流程实例Id")
private String processInstanceId;
/**
* 条款号
*/
@ApiModelProperty(value = "条款号")
private String termNum;
/**
* 条款内容
*/
@ApiModelProperty(value = "条款内容")
private String termContent;
/**
* 修改意见内容(包括修改理由和依据)
*/
@ApiModelProperty(value = "修改意见内容(包括修改理由和依据)")
private String editAdvice;
/**
* 意见提出人
*/
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
@ApiModelProperty(value = "意见提出人")
private String createUserId;
/**
* 1采纳 2部分采纳 3不采纳
*/
@ApiModelProperty(value = "1采纳 2部分采纳 3不采纳")
@Dict(dicCode = "consultation_opinion")
private String handleAdvice;
/**
* 理由
*/
@ApiModelProperty(value = "提出缘由")
private String reason;
/**
* 轮数
*/
@ApiModelProperty(value = "轮数")
@Dict(dicCode = "batch_num")
private Integer batchNum;
/**
* 修改意见
*/
@ApiModelProperty(value = "修改意见")
private String description;
/**
* 标准Id
*/
@ApiModelProperty(value = "标准Id")
private String standardId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,38 @@
package com.jero.modules.activiti.process.esRevisionAdvice.entity;
import lombok.Getter;
/**
* @author: Mzaxd
* @Date: 2024/1/28 17:36
*/
@Getter
public enum HandleAdviceEnum {
/**
* 1:采纳
*/
AGREE("同意", "1"),
/**
* 2:部分采纳
*/
PART_DISAGREE("部分采纳", "2"),
/**
* 3:不采纳
*/
DISAGREE("不采纳", "3"),
;
private final String name;
private final String value;
HandleAdviceEnum(String name, String value) {
this.name = name;
this.value = value;
}
}
@@ -0,0 +1,127 @@
package com.jero.modules.activiti.process.esRevisionAdvice.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
/**
*
* @TableName process_es_revision
*/
@TableName(value ="process_es_revision")
@Data
public class ProcessEsRevision implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String orgCode;
/**
* 0表示未删除,1表示删除
*/
@ApiModelProperty(value = "0表示未删除,1表示删除")
private Integer delFlag;
/**
* 企标计划Id
*/
@ApiModelProperty(value = "企标计划Id")
private String espId;
/**
* 流程实例Id
*/
@ApiModelProperty(value = "流程实例Id")
private String processInstanceId;
/**
* 是否开启征求意见 0不征求 1征求
*/
@TableField(exist = false)
@ApiModelProperty(value = "是否开启征求意见 0不征求 1征求")
private String adviceFlag;
/**
* 征求意见截止日期
*/
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@ApiModelProperty(value = "征求意见截止日期")
private Date adviceDeadline;
/**
* 在线编辑文件id
*/
@ApiModelProperty(value = "在线编辑文件id")
private String onEditFile;
/**
* 业务json数据
*/
@ApiModelProperty(value = "业务JSON数据")
private String businessJson;
/**
* 主起草人
*/
@TableField(exist = false)
@ApiModelProperty(value = "主起草人")
private String mainDraftUser;
/**
* 法规工程师
*/
@TableField(exist = false)
@ApiModelProperty(value = "法规工程师")
private String standardEngineer;
/**
* 设计工程师
*/
@TableField(exist = false)
@ApiModelProperty(value = "设计工程师")
private String adviceUsers;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,17 @@
package com.jero.modules.activiti.process.esRevisionAdvice.entity.vo;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import lombok.Data;
import java.util.List;
@Data
public class ProcessRevisionVO {
ProcessEsRevision processInfo;
List<EsRevisionAdvice> adviceList;
boolean canReject;
}
@@ -0,0 +1,114 @@
package com.jero.modules.activiti.process.esRevisionAdvice.job;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.FinishFlagEnum;
import com.jero.modules.activiti.enums.ProcessStatusEnum;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.vo.ProcessRevisionVO;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.TaskService;
import org.jetbrains.annotations.NotNull;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import javax.annotation.Resource;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @author: Mzaxd
* @Date: 2023/12/28 18:40
*/
@Slf4j
public class AdviceDeadlineJob implements Job {
@Resource
private EsRevisionService revisionService;
@Resource
private ProcessApprovalRecordService approvalRecordService;
@Resource
private ProcessAllService processAllService;
@Resource
private TaskService taskService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
log.info("开始执行征求意见截止日期每日定时任务");
// 获取所有正在进行中的企标制修订流程
List<ProcessAll> processAlls = processAllService.list(new LambdaQueryWrapper<ProcessAll>()
.eq(ProcessAll::getPrcType, ProcessTypeEnum.ES_REVISION_ADVICE.getValue())
.eq(ProcessAll::getPrcStatus, ProcessStatusEnum.INCOMPLETE.getValue()));
if (processAlls.isEmpty()) {
log.info("没有进行中的企标制修订流程");
return;
}
List<String> processInstanceIds = processAlls.stream().map(ProcessAll::getProcessInstanceId).collect(Collectors.toList());
LambdaQueryWrapper<ProcessEsRevision> revisionLambdaQueryWrapper = new LambdaQueryWrapper<>();
revisionLambdaQueryWrapper.in(ProcessEsRevision::getProcessInstanceId, processInstanceIds);
revisionLambdaQueryWrapper.isNotNull(ProcessEsRevision::getAdviceDeadline);
List<ProcessEsRevision> revisionList = revisionService.list(revisionLambdaQueryWrapper);
if (revisionList.isEmpty()) {
return;
}
Map<String, ProcessEsRevision> revisionMap = revisionList.stream()
.collect(Collectors.toMap(ProcessEsRevision::getProcessInstanceId, revision -> revision));
// 找到所有征求意见的未完成的待办
LambdaQueryWrapper<ProcessApprovalRecord> arWrapper = new LambdaQueryWrapper<>();
arWrapper.eq(ProcessApprovalRecord::getFinishFlag, FinishFlagEnum.INCOMPLETE.getValue());
arWrapper.in(ProcessApprovalRecord::getProcessInstanceId, revisionMap.keySet());
arWrapper.eq(ProcessApprovalRecord::getTaskName, "征求意见对象填写意见");
arWrapper.isNotNull(ProcessApprovalRecord::getTaskId);
List<ProcessApprovalRecord> arList = approvalRecordService.list(arWrapper);
Map<String, List<ProcessApprovalRecord>> arMap = arList.stream()
.collect(Collectors.groupingBy(ProcessApprovalRecord::getProcessInstanceId));
Date curDate = new Date();
for (Map.Entry<String, List<ProcessApprovalRecord>> map : arMap.entrySet()) {
String processInstanceId = map.getKey();
ProcessEsRevision revision = revisionMap.get(processInstanceId);
List<ProcessApprovalRecord> recordList = map.getValue();
// 判断是否到期
Date adviceDeadline = getDeadlineDate(revision.getAdviceDeadline());
if (curDate.after(adviceDeadline)) {
// 如果到期则批量完成
for (ProcessApprovalRecord record : recordList) {
ProcessInfoVO<ProcessRevisionVO> handleData = revisionService.getHandleData(record.getTaskId());
// 如果当前日期大于该条数据的截止日期 则自动完成任务
revisionService.submit(handleData);
}
}
}
log.info("征求意见截止日期每日定时任务执行结束");
}
@NotNull
private static Date getDeadlineDate(Date deadline) {
// 设置deadline为今天的最后一秒
// 创建一个 Calendar 对象
Calendar calendar = Calendar.getInstance();
// 获取当前日期和时间
calendar.setTime(deadline);
// 设置时间部分为当天的最后一秒
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
// 将修改后的日期和时间设置回原始的 Date 对象
deadline = calendar.getTime();
return deadline;
}
}
@@ -0,0 +1,245 @@
package com.jero.modules.activiti.process.esRevisionAdvice.listener;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.jero.common.util.CommonUtils;
import com.jero.modules.activiti.process.common.enums.StandardStateEnum;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdviceService;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionService;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.oss.entity.OSSFile;
import com.jero.modules.oss.service.IOSSFileService;
import com.jero.modules.tag.enums.TableNameEnum;
import com.jero.modules.util.SysOnlyOfficePdfUtil;
import lombok.SneakyThrows;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.apache.poi.xwpf.usermodel.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.mock.web.MockMultipartHttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.file.Files;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
/**
* @author: Mzaxd
* @Date: 2023/12/19 11:59
*/
@Component
public class ProcessESRevisionEndListener implements ExecutionListener {
@Resource
private EsRevisionService esRevisionService;
@Resource
private EsRevisionAdviceService esAdviceService;
@Resource
private ILawsCommonService lawsCommonService;
@Resource
private IOSSFileService ossFileService;
@Resource
private EsRevisionAdviceService revisionAdviceService;
@Resource
private SysOnlyOfficePdfUtil sysOnlyOfficePdfUtil;
@Value(value = "${jero.uploadType}")
private String uploadType;
@SneakyThrows
@Override
public void notify(DelegateExecution delegateExecution) {
// 获取流程实例Id
String processInstanceId = delegateExecution.getProcessInstanceId();
// 根据流程Id获取业务数据
LambdaQueryWrapper<ProcessEsRevision> revisionWrapper = new LambdaQueryWrapper<>();
revisionWrapper.eq(ProcessEsRevision::getProcessInstanceId, processInstanceId);
// 获取企标相关数据
ProcessEsRevision data = esRevisionService.getOne(revisionWrapper);
// 将数据转换为Map
Map<String, Object> variables = transMap(data);
Date adviceDeadline = data.getAdviceDeadline();
if (adviceDeadline != null) {
// 制作征求意见稿
String draftFileId = this.makeDraftFile(data);
variables.put(FieldCommon.FILE_DRAFT_FOR_COMMENT, draftFileId);
}
// 发布企标
String esId = lawsCommonService.commonAdd(variables);
// 所有意见设置标准Id
LambdaQueryWrapper<EsRevisionAdvice> adviceWrapper = new LambdaQueryWrapper<>();
adviceWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId);
List<EsRevisionAdvice> list = esAdviceService.list(adviceWrapper);
if (!list.isEmpty()) {
list.forEach(item -> item.setStandardId(esId));
esAdviceService.updateBatchById(list);
}
}
private Map<String, Object> transMap(ProcessEsRevision data) {
Map<String, Object> variables = JSON.parseObject(data.getBusinessJson(), Map.class);
variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue());
// 标准状态
variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.SEEK_FOR_OPINIONS.getStateValue());
String standardId = IdWorker.getIdStr();
variables.put(FieldCommon.ID, standardId);
String onEditFile = data.getOnEditFile();
// 发布稿
List<OSSFile> ossFileList = sysOnlyOfficePdfUtil.docFileTransferPdf(onEditFile);
if (ossFileList != null && !ossFileList.isEmpty()) {
variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile + "," + ossFileList.get(0).getId());
} else {
variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile);
}
return variables;
}
private String makeDraftFile(ProcessEsRevision data) throws Exception {
Map<String, Object> variables = JSON.parseObject(data.getBusinessJson(), Map.class);
String standardNo = (String) variables.get(FieldCommon.STANDARD_NUMBER);
String standardName = (String) variables.get(FieldCommon.STANDARD_NAME);
ClassPathResource resource = new ClassPathResource("wordTemplate/征求意见反馈单.docx");
// 使用ClassPathResource来读取模板文件
try (InputStream fis = resource.getInputStream()) {
XWPFDocument document = new XWPFDocument(fis);
// Iterate through paragraphs to find "标准名称:"
for (XWPFParagraph paragraph : document.getParagraphs()) {
for (XWPFRun run : paragraph.getRuns()) {
String text = run.getText(0);
if (text != null && text.contains("标准名称:")) {
// Append the new text right after "标准名称:"
text = text + standardName;
run.setText(text, 0); // Update the text in the current run
}
}
}
// 获取并修改文档中的表格
List<XWPFTable> tables = document.getTables();
if (!tables.isEmpty()) {
XWPFTable firstTable = tables.get(0);
setFirstTableContents(firstTable, data);
}
// 创建临时文件
String fileName = standardNo + "征求意见回函意见表";
fileName = fileName.replaceAll("/", "");
File tempFile = Files.createTempFile(fileName, ".docx").toFile();
// 将更改写入临时文件
try (FileOutputStream fos = new FileOutputStream(tempFile)) {
document.write(fos);
}
// 将文件作为MultipartFile封装
MultipartFile multipartFile = new MockMultipartFile(
"file", // 表单字段名称
tempFile.getName(), // 文件名
"application/vnd.openxmlformats-officedocument.wordprocessingml.document", // 内容类型
Files.newInputStream(tempFile.toPath()) // 文件内容
);
// 创建模拟的MultipartHttpServletRequest
MockMultipartHttpServletRequest mockRequest = new MockMultipartHttpServletRequest();
mockRequest.addFile(multipartFile); // 添加文件
mockRequest.addParameter("biz", "temp"); // 添加其他表单字段
// 调用上传接口
String bizPath = "esDraft";
CommonUtils.upload(multipartFile, bizPath, uploadType);
String savePath = CommonUtils.upload(multipartFile, bizPath, uploadType);
//上传成功 进行数据库存储
OSSFile ossFile = new OSSFile();
// 文件名
ossFile.setStandardFileType(FieldCommon.FILE_DRAFT_FOR_COMMENT);
ossFile.setStandardNumber(standardNo);
ossFile.setFileName(fileName.substring(0, fileName.lastIndexOf("征求意见反馈单") + 7) + ".docx");
ossFile.setUrl(savePath);
ossFileService.save(ossFile);
// 删除临时文件
boolean delete = tempFile.delete();
return ossFile.getId();
}
}
private void setFirstTableContents(XWPFTable table, ProcessEsRevision data) {
List<EsRevisionAdvice> opinions = revisionAdviceService.list(new LambdaQueryWrapper<EsRevisionAdvice>()
.eq(EsRevisionAdvice::getProcessInstanceId, data.getProcessInstanceId()));
List<String> termNo = opinions.stream().map(EsRevisionAdvice::getTermNum).collect(Collectors.toList());
List<String> adviceList = opinions.stream().map(EsRevisionAdvice::getEditAdvice).collect(Collectors.toList());
// 获取一个1-5的List
List<String> noList = IntStream.rangeClosed(1, termNo.size()).mapToObj(String::valueOf).collect(Collectors.toList());
// 获取表格的行列表
List<XWPFTableRow> rows = table.getRows();
if (!rows.isEmpty()) {
// 序号
setContentList(rows, 1, 0, noList);
// 章节编号
setContentList(rows, 1, 1, termNo);
// 修改意见内容
setContentList(rows, 1, 2, adviceList);
}
}
private void setContentList(List<XWPFTableRow> rows, int rowNum, int cellNum, List<String> contentList) {
for (String content : contentList) {
if (StrUtil.isBlank(content)) {
continue;
}
setContent(rows, rowNum, cellNum, content, true, false, false);
}
}
private void setContent(List<XWPFTableRow> rows, int rowNum, int cellNum, String content,
boolean newLine, boolean alignCenter, boolean verCenter) {
if (StrUtil.isBlank(content)) {
return;
}
XWPFTableRow row = rows.get(rowNum);
List<XWPFTableCell> cells = row.getTableCells();
if (!cells.isEmpty()) {
XWPFTableCell cell = cells.get(cellNum);
XWPFParagraph paragraph;
if (newLine) {
paragraph = cell.addParagraph();
} else {
paragraph = cell.getParagraphs().get(0);
}
XWPFRun run = paragraph.createRun();
// 设置段落居中(水平)
if (alignCenter) {
paragraph.setAlignment(ParagraphAlignment.CENTER);
}
run.setText(content);
run.setFontSize(12);
run.setFontFamily("新宋体");
// 设置单元格垂直居中
if (verCenter) {
cell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
}
}
}
}
@@ -0,0 +1,18 @@
package com.jero.modules.activiti.process.esRevisionAdvice.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
/**
* @author ThinkBook
* @description 针对表【process_es_revision_advice】的数据库操作Mapper
* @createDate 2023-12-20 17:17:56
* @Entity com.jero.modules.activiti.process.esRevision.entity.EsRevisionAdvice
*/
public interface EsRevisionAdviceMapper extends BaseMapper<EsRevisionAdvice> {
}
@@ -0,0 +1,18 @@
package com.jero.modules.activiti.process.esRevisionAdvice.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Mapper
* @createDate 2023-12-19 11:58:59
* @Entity com.jero.modules.activiti.process.esRevision.entity.EsRevision
*/
public interface EsRevisionMapper extends BaseMapper<ProcessEsRevision> {
}
@@ -0,0 +1,15 @@
package com.jero.modules.activiti.process.esRevisionAdvice.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
/**
* @author ThinkBook
* @description 针对表【process_es_revision_advice】的数据库操作Service
* @createDate 2023-12-20 17:17:56
*/
public interface EsRevisionAdviceService extends IService<EsRevisionAdvice> {
IPage<EsRevisionAdvice> adviceList(EsRevisionAdvice advice, Integer pageNo, Integer pageSize);
}
@@ -0,0 +1,24 @@
package com.jero.modules.activiti.process.esRevisionAdvice.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.vo.ProcessRevisionVO;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Service
* @createDate 2023-12-19 11:58:59
*/
public interface EsRevisionService extends IService<ProcessEsRevision> {
ProcessInfoVO<ProcessRevisionVO> getHandleData(String taskId);
void startProcess(ProcessInfoVO<ProcessRevisionVO> processInfoVO);
void submit(ProcessInfoVO<ProcessRevisionVO> processInfoVO);
void approveTask(ProcessInfoVO<ProcessRevisionVO> processInfoVO, boolean pass);
}
@@ -0,0 +1,64 @@
package com.jero.modules.activiti.process.esRevisionAdvice.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
import com.jero.modules.activiti.process.esRevisionAdvice.mapper.EsRevisionAdviceMapper;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdviceService;
import com.jero.modules.system.entity.SysUser;
import com.jero.modules.system.service.ISysUserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author ThinkBook
* @description 针对表【process_es_revision_advice】的数据库操作Service实现
* @createDate 2023-12-20 17:17:56
*/
@Service
public class EsRevisionAdviceServiceImpl extends ServiceImpl<EsRevisionAdviceMapper, EsRevisionAdvice>
implements EsRevisionAdviceService{
@Resource
private ISysUserService userService;
@Override
public IPage<EsRevisionAdvice> adviceList(EsRevisionAdvice advice, Integer pageNo, Integer pageSize) {
boolean userQuery = StrUtil.isNotBlank(advice.getCreateUserId());
LambdaQueryWrapper<EsRevisionAdvice> queryWrapper = new LambdaQueryWrapper<>();
String standardId = advice.getStandardId();
if (StrUtil.isBlank(standardId)) {
log.error("standardId为空");
throw new JeroBootException("standardId为空");
}
Page<EsRevisionAdvice> page = new Page<>(pageNo, pageSize);
queryWrapper.eq(EsRevisionAdvice::getStandardId, advice.getStandardId());
queryWrapper.eq(null != advice.getBatchNum() , EsRevisionAdvice::getBatchNum, advice.getBatchNum());
if (userQuery) {
QueryWrapper<SysUser> userQueryWrapper = new QueryWrapper<>();
userQueryWrapper.like("CONCAT(realname, '(', username, ')')", advice.getCreateUserId());
List<SysUser> list = userService.list(userQueryWrapper);
if (!list.isEmpty()) {
queryWrapper.in(EsRevisionAdvice::getCreateUserId, list.stream().map(SysUser::getId).collect(Collectors.toList()));
}
}
queryWrapper.eq(StrUtil.isNotBlank(advice.getHandleAdvice()), EsRevisionAdvice::getHandleAdvice, advice.getHandleAdvice());
queryWrapper.like(StrUtil.isNotBlank(advice.getTermNum()), EsRevisionAdvice::getTermNum, advice.getTermNum());
queryWrapper.orderByAsc(EsRevisionAdvice::getBatchNum);
return page(page, queryWrapper);
}
}
@@ -0,0 +1,392 @@
package com.jero.modules.activiti.process.esRevisionAdvice.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.SendMessageAPI;
import com.jero.common.api.dto.message.SendMessageDTO;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.CommitFlagEnum;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.EsRevisionAdvice;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.ProcessEsRevision;
import com.jero.modules.activiti.process.esRevisionAdvice.entity.vo.ProcessRevisionVO;
import com.jero.modules.activiti.process.esRevisionAdvice.mapper.EsRevisionMapper;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionAdviceService;
import com.jero.modules.activiti.process.esRevisionAdvice.service.EsRevisionService;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.constant.MessageTemplateCodeCommon;
import com.jero.modules.laws.enterprise.entity.ESPProjectStatus;
import com.jero.modules.laws.enterprise.entity.EnterpriseStandardPlan;
import com.jero.modules.laws.enterprise.service.EnterpriseStandardPlanService;
import com.jero.modules.laws.enterprise.util.EnterpriseStandardUtil;
import com.jero.modules.laws.standard.entity.LawsEnterpriseStandard;
import com.jero.modules.laws.standard.service.ILawsEnterpriseStandardService;
import com.jero.modules.sys.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import static com.jero.modules.activiti.common.ActivitiCommon.PASS;
import static com.jero.modules.activiti.process.esRevisionAdvice.common.RevisionTaskNodeIdConstant.*;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Service实现
* @createDate 2023-12-19 11:58:59
*/
@Service
@Slf4j
@Transactional(rollbackFor = JeroBootException.class)
public class EsRevisionServiceImpl extends ServiceImpl<EsRevisionMapper, ProcessEsRevision>
implements EsRevisionService {
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private RuntimeService runtimeService;
@Resource
private IProcessHandleService processHandleService;
@Resource
private ProcessAllService processAllService;
@Resource
private TaskService taskService;
@Resource
private EnterpriseStandardPlanService espService;
@Resource
private EsRevisionAdviceService adviceService;
@Resource
private SendMessageAPI sendMessageAPI;
@Resource
private ILawsEnterpriseStandardService esService;
@Resource
private EnterpriseStandardPlanService planService;
@Resource
private EnterpriseStandardUtil esUtil;
@Resource
private ProcessApprovalRecordService approvalRecordService;
@Override
public void startProcess(ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
// 流程Key
String processDefinitionKey = ProcessType.ES_REVISION_ADVICE.getProcessKey();
// 流程信息
BasicProcessInfoDTO processInfo = processInfoVO.getBasicProcessInfoDTO();
// 任务信息
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 当前用户Id
String userId = UserUtils.getUserId();
// 设置流程变量
Map<String, Object> actVariables = this.setVariables(processInfoVO);
// 删除草稿
actFlowCommonService.getExistDraftAndRemove(processInfoVO.getDraftId());
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
processInfo.setProcessInstanceId(processInstanceId);
processInfo.setProcessDefinitionId(processDefinitionId);
processInfo.setProcessType(ProcessTypeEnum.ES_REVISION_ADVICE.getValue());
// 第一个节点业务数据处理
this.startNodeBusProcess(processInfoVO);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap);
// 获取第一个任务的taskId
String taskId = actFlowCommonService.getFirstTaskId(processInstanceId, userId, processDefinitionId);
processTask.setTaskId(taskId);
// 保存第一个节点的草稿
processHandleService.saveToDraft(processInfoVO, userId);
// 保存第一个节点的快照
processHandleService.saveToSnapshot(processInfoVO, userId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 根据流程实例id更新流程总表
actFlowCommonService.updateProcessAll(processInfo);
// 自动完成第一个任务
actFlowCommonService.completeTask(taskId, userId);
}
private void startNodeBusProcess(ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
String processInstanceId = processInfoVO.getBasicProcessInfoDTO().getProcessInstanceId();
ProcessRevisionVO businessInfoDTO = processInfoVO.getBusinessInfoDTO();
ProcessEsRevision processInfo = businessInfoDTO.getProcessInfo();
// 修改企标计划状态
// 检查企标计划是否已被删除
String espId = processInfo.getEspId();
EnterpriseStandardPlan esp = espService.getById(espId);
if (esp == null) {
throw new JeroBootException(ResultCommon.INVALID_ESP);
}
// 设置状态为运行中
espService.updateProjectStatus(espId, ESPProjectStatus.IN_PROGRESS.getValue());
// 保存数据
processInfo.setProcessInstanceId(processInstanceId);
save(processInfo);
}
private Map<String, Object> setVariables(ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
HashMap<String, Object> result = new HashMap<>(userInfoMap);
result.put(CAN_REJECT, true);
// 获取分发人
return result;
}
@Override
public ProcessInfoVO<ProcessRevisionVO> getHandleData(String taskId) {
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException(ResultCommon.TASK_NOT_EXISTS);
}
ProcessInfoVO<ProcessRevisionVO> result = new ProcessInfoVO<>();
ProcessRevisionVO processVo = new ProcessRevisionVO();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
result.setBasicProcessInfoDTO(actFlowCommonService.getProcessInfo(processInstanceId));
// 获取流程通用数据
ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId);
// 获取当前流程数据
LambdaQueryWrapper<ProcessEsRevision> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessEsRevision::getProcessInstanceId, processInstanceId);
ProcessEsRevision data = getOne(queryWrapper);
LambdaQueryWrapper<EsRevisionAdvice> detailQueryWrapper = new LambdaQueryWrapper<>();
List<EsRevisionAdvice> adviceList = null;
if (Objects.nonNull(data)) {
detailQueryWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId);
adviceList = adviceService.list(detailQueryWrapper);
}
// 获取当前流程
String xmlNodeId = record.getNodeId();
// 设置流程信息
switch (xmlNodeId) {
case START:
case CONFIRM_ADVISE:
case ADVICE:
case SET_STANDARD_NUMBER:
break;
case ADVICE_COLLECT:
processVo.setAdviceList(adviceList);
}
// 设置流程变量等相关信息
processVo.setProcessInfo(data);
boolean canReject = (boolean) taskService.getVariable(taskId, CAN_REJECT);
processVo.setCanReject(canReject);
result.setBusinessInfoDTO(processVo);
return result;
}
@Override
public void submit(ProcessInfoVO<ProcessRevisionVO> processInfoVO) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 校验是否有权限操作此待办
processHandleService.validTask(taskId);
// 获取当前节点的id
ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId);
String xmlNodeId = record.getNodeId();
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO();
// 使用流程引擎根据taskId找到流程实例Id
processInfo.setProcessInstanceId(processInstanceId);
processInfoVO.setBasicProcessInfoDTO(processInfo);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
String curUserId = UserUtils.getUserId();
ProcessRevisionVO businessInfoDTO = processInfoVO.getBusinessInfoDTO();
ProcessEsRevision data = businessInfoDTO.getProcessInfo();
List<EsRevisionAdvice> adviceList = businessInfoDTO.getAdviceList();
// 根据流程实例Id获取流程定义ID
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
// 获取数据库中的流程信息
LambdaQueryWrapper<ProcessEsRevision> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessEsRevision::getProcessInstanceId, processInstanceId);
ProcessEsRevision dataFromDb = getOne(queryWrapper);
if (dataFromDb != null) {
data.setId(dataFromDb.getId());
}
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
Map<String, Object> userMap = new HashMap<>();
LambdaQueryWrapper<EsRevisionAdvice> detailQueryWrapper = new LambdaQueryWrapper<>();
detailQueryWrapper.eq(EsRevisionAdvice::getProcessInstanceId, processInstanceId);
List<EsRevisionAdvice> dbAdviceList = adviceService.list(detailQueryWrapper);
// 筛选出最新一轮
Integer maxBatchNum = this.calculateAdviceBatchNum(dbAdviceList);
switch (xmlNodeId) {
case START:
saveOrUpdate(data);
break;
case CONFIRM_ADVISE:
// 判断是否开启征求意见子流程 设置流程变量
boolean adviceFlag = !data.getAdviceFlag().equals(YesOrNoEnum.NO.getValue());
if (adviceFlag) {
List<String> adviceUserList = Arrays.asList(data.getAdviceUsers().split(","));
taskService.setVariable(taskId, ADVICE_USER_LIST, adviceUserList);
taskService.setVariable(taskId, STANDARD_ENGINEER, curUserId);
taskService.setVariable(taskId, OPEN, true);
taskService.setVariable(taskId, CAN_REJECT, false);
// 保存流程数据
saveOrUpdate(data);
userMap.put(STANDARD_ENGINEER, curUserId);
userMap.put(ADVICE_USER_LIST, data.getAdviceUsers());
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userMap);
} else {
taskService.setVariable(taskId, OPEN, false);
}
taskService.setVariable(taskId, PASS, true);
break;
case ADVICE:
// 保存意见数据
if (!adviceList.isEmpty()) {
adviceList.forEach(advice -> {
advice.setProcessInstanceId(processInstanceId);
advice.setBatchNum(maxBatchNum + 1);
advice.setCreateUserId(curUserId);
});
adviceService.saveBatch(adviceList);
}
break;
case ADVICE_COLLECT:
// 保存数据
adviceService.updateBatchById(adviceList);
// 给主起草人发消息
String mainDraftUser = (String) taskService.getVariable(taskId, MAIN_DRAFT_USER);
this.sendMessageToMainDraftUser(mainDraftUser, processInstanceId, maxBatchNum);
break;
case SET_STANDARD_NUMBER:
// 判断标准编号是否重复
Map<String, Object> variables = JSON.parseObject(data.getBusinessJson(), Map.class);
// 根据派号字段重新生成标准编号
String standardNumberTmp = (String) variables.get(FieldCommon.STANDARD_NUMBER_TEMP);
String standardNumber = "";
if (StringUtils.isNotBlank(standardNumberTmp)) {
// 组合企标编号
standardNumber = esUtil.combineStandardNumber(variables);
} else {
// 生成企标编号
standardNumber = esUtil.generateStandardNumber(variables);
standardNumberTmp = EnterpriseStandardUtil.getSequenceNoFromStandardNo(standardNumber);
}
variables.put(FieldCommon.STANDARD_NUMBER, standardNumber);
variables.put(FieldCommon.STANDARD_NUMBER_TEMP, standardNumberTmp);
// 重新序列化为json
data.setBusinessJson(JSON.toJSONString(variables));
// 校验重复
LambdaQueryWrapper<LawsEnterpriseStandard> esQueryWrapper = new LambdaQueryWrapper<>();
esQueryWrapper.eq(LawsEnterpriseStandard::getStandardNumber, standardNumber);
LawsEnterpriseStandard es = esService.getOne(esQueryWrapper);
if (Objects.nonNull(es)) {
throw new JeroBootException(ResultCommon.STANDARD_NUMBER_ALREADY_EXISTS);
}
LambdaQueryWrapper<EnterpriseStandardPlan> planQueryWrapper = new LambdaQueryWrapper<>();
planQueryWrapper.eq(EnterpriseStandardPlan::getStandardNumber, standardNumber);
EnterpriseStandardPlan plan = planService.getOne(planQueryWrapper);
if (Objects.nonNull(plan)) {
throw new JeroBootException(ResultCommon.STANDARD_NUMBER_ALREADY_EXISTS);
}
// 保存数据
updateById(data);
break;
}
// 审批节点
actFlowCommonService.completeTask(taskId, curUserId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 删除草稿
actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, curUserId);
}
@Override
public void approveTask(ProcessInfoVO<ProcessRevisionVO> processInfoVO, boolean pass) {
// 获取task
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 校验是否有权限操作此待办
processHandleService.validTask(taskId);
String prcId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO();
processInfo.setProcessInstanceId(prcId);
processInfoVO.setBasicProcessInfoDTO(processInfo);
// 获取当前节点的id
ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId);
String xmlNodeId = record.getNodeId();
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
String curUserId = UserUtils.getUserId();
// 设置流程变量
runtimeService.setVariable(processInstanceId, PASS, pass);
runtimeService.setVariable(processInstanceId, OPEN, pass);
// 会签节点驳回后修改其他节点的状态
approvalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, curUserId);
// 审批节点
actFlowCommonService.completeTask(taskId, curUserId);
// 驳回,结束所有节点
approvalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 更新审批表为完成,填充数据
processTask.setCommitFlag(pass ? CommitFlagEnum.PASS.getValue() : CommitFlagEnum.REJECT.getValue());
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 删除草稿
actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId);
}
private Integer calculateAdviceBatchNum(List<EsRevisionAdvice> adviceList) {
return adviceList.stream().mapToInt(EsRevisionAdvice::getBatchNum).max().orElse(0);
}
private void sendMessageToMainDraftUser(String mainDraftUser, String processInstanceId, Integer maxBatchNum) {
ProcessAll processAll = processAllService.getByProcessInstanceId(processInstanceId);
SendMessageDTO sendMessageDTO = new SendMessageDTO();
sendMessageDTO.setTemplateCode(MessageTemplateCodeCommon.ES_REVISION_ADVICE);
sendMessageDTO.setToUserId(mainDraftUser);
Map<String, String> sendMap = new HashMap<>();
sendMap.put("prcNum", processAll.getPrcNum());
sendMap.put("batchNum", maxBatchNum.toString());
sendMessageDTO.setMap(sendMap);
sendMessageAPI.sendMessage(sendMessageDTO);
}
}
@@ -70,7 +70,7 @@ public interface IProcessHandleService {
**/
void updateApprovalRecord(ProcessInfoVO processInfoVO);
void saveToDraft(ProcessInfoVO processInfoVO, String userId);
String saveToDraft(ProcessInfoVO processInfoVO, String userId);
void saveToSnapshot(ProcessInfoVO processInfoVO, String userId);
@@ -88,4 +88,10 @@ public interface IProcessHandleService {
**/
void deleteMyDraft(String taskId, String businessId, Integer processType);
/**
* 查询流程信息
* @param taskId taskId
* @return ProcessInfoVO
*/
ProcessInfoVO queryProcessInfoVO(String taskId);
}
@@ -403,7 +403,7 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
}
@Override
public void saveToDraft(ProcessInfoVO processInfoVO, String userId) {
public String saveToDraft(ProcessInfoVO processInfoVO, String userId) {
BasicProcessInfoDTO basicProcessInfoDTO = processInfoVO.getBasicProcessInfoDTO();
BasicTaskInfoDTO basicTaskInfoDTO = processInfoVO.getBasicTaskInfoDTO();
String taskId = null;
@@ -426,7 +426,7 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
String draftId = processInfoVO.getDraftId();
if (StringUtils.isNotBlank(draftId)) {
processDraft.setId(draftId);
//processDraftService.removeById(draftId);
processDraftService.removeById(draftId);
}
// 根据是否有taskId区分保存来源(待办、草稿)
processDraft.setProjectId(processInfoVO.getBusinessId()); // 业务id
@@ -479,6 +479,7 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
log.error("反序列化失败", e);
}
}
return processDraft.getId();
}
@Override
@@ -555,6 +556,27 @@ public class ProcessHandleServiceImpl implements IProcessHandleService {
}
}
@Override
public ProcessInfoVO queryProcessInfoVO(String taskId) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
ProcessInfoVO processInfoVO = new ProcessInfoVO<>();
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
if(!Objects.isNull(process)){
BasicProcessInfoDTO basicProcessInfoDTO = new BasicProcessInfoDTO();
basicProcessInfoDTO.setProcessName(process.getPrcName());
basicProcessInfoDTO.setProcessType(process.getPrcType());
basicProcessInfoDTO.setProcessDefinitionId(process.getProcessDefinitionId());
basicProcessInfoDTO.setProcessInstanceId(process.getProcessInstanceId());
basicProcessInfoDTO.setProcessDescription(process.getPrcMes());
basicProcessInfoDTO.setProcessDueDate(process.getDueTime());
processInfoVO.setBasicProcessInfoDTO(basicProcessInfoDTO);
processInfoVO.setBusinessId(process.getProjectId());
}
return processInfoVO;
}
/**
* @Author: liao
* @Date: 2023/11/3 11:14
@@ -0,0 +1,23 @@
package com.jero.modules.activiti.process.machineEsApproval.common;
/**
* @author: Mzaxd
* @Date: 2023/12/19 15:14
*/
public class MachineEsApprovalTaskNodeIdConstant {
/** 法规工程师确认是否开启征求意见 */
public static final String START = "Activity_1siuksf";
/** 设计工程师填写意见 */
public static final String ONE = "Activity_04m430n";
/** 法规工程师汇总数据 */
public static final String TWO = "Activity_1riqzkp";
/** 法规工程师派号 */
public static final String THREE = "Activity_11uuyg0";
/** 主起草人 */
public static final String FOUR = "mainDraftUser";
/** 法规工程师 */
public static final String FIVE = "standardEngineer";
/** 征求意见人员 */
public static final String SIX = "adviceUserList";
}
@@ -0,0 +1,90 @@
package com.jero.modules.activiti.process.machineEsApproval.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.machineEsApproval.entity.ProcessMachineEsApproval;
import com.jero.modules.activiti.process.machineEsApproval.service.MachineEsApprovalService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author: Mzaxd
* @Date: 2023/10/18 10:44
*/
@Slf4j
@RestController
@Api(tags = "整机企业标准报批流程")
@RequestMapping("/process/es/machineEsApproval")
public class MachineEsApprovalController {
@Resource
private MachineEsApprovalService flowService;
@Resource
private ActFlowCommonService actFlowCommonService;
/**
* 整机企业标准报批流程
*
* @param processInfoVO
*/
@AutoLog(value = "整机企业标准报批流程-发起流程")
@ApiOperation(value="整机企业标准报批流程-发起流程", notes="整机企业标准报批流程-发起流程")
@PostMapping("/start")
public Result<?> startProcess(@RequestBody ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
flowService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "整机企业标准报批流程-提交")
@ApiOperation(value = "整机企业标准报批流程-提交", notes = "整机企业标准报批流程-提交")
@PostMapping("/submit")
public Result<T> submit(@RequestBody ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
flowService.submit(processInfoVO);
return Result.OK();
}
/**
* 保存到待办
* @param taskId
*/
@AutoLog(value = "整机企业标准报批流程-办理")
@ApiOperation(value="整机企业标准报批流程-办理", notes="整机企业标准报批流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.MACHINE_ES_APPROVAL);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(flowService.getHandleData(taskId));
}
@AutoLog(value = "整机企业标准报批流程-同意")
@ApiOperation(value = "整机企业标准报批流程-同意", notes = "整机企业标准报批流程-同意")
@PostMapping("/agree")
public Result<T> agree(@RequestBody ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
flowService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "整机企业标准报批流程-驳回")
@ApiOperation(value = "整机企业标准报批流程-驳回", notes = "整机企业标准报批流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@RequestBody ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
flowService.approveTask(processInfoVO, false);
return Result.OK();
}
}
@@ -0,0 +1,98 @@
package com.jero.modules.activiti.process.machineEsApproval.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
*
* @TableName process_machine_es_approval
*/
@TableName(value ="process_machine_es_approval")
@Data
public class ProcessMachineEsApproval implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 创建人
*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**
* 创建时间
*/
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 所属部门
*/
@ApiModelProperty(value = "所属部门")
private String orgCode;
/**
* 0表示未删除,1表示删除
*/
@ApiModelProperty(value = "0表示未删除,1表示删除")
private Integer delFlag;
/**
* 流程实例Id
*/
@ApiModelProperty(value = "流程实例Id")
private String processInstanceId;
/**
* 在线编辑文件id
*/
@ApiModelProperty(value = "在线编辑文件id")
private String onEditFile;
/**
* 业务json数据
*/
@ApiModelProperty(value = "业务JSON数据")
private String businessJson;
/**
* 附件
*/
@Dict(dictTable = "sys_oss", dicText = "fileName", dicCode = "id")
@ApiModelProperty(value = "附件")
private String attach;
/**
* 抄送人员
*/
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
@ApiModelProperty(value = "抄送人员")
private String copyUser;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,61 @@
package com.jero.modules.activiti.process.machineEsApproval.listener;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.jero.modules.activiti.process.common.enums.StandardStateEnum;
import com.jero.modules.activiti.process.machineEsApproval.entity.ProcessMachineEsApproval;
import com.jero.modules.activiti.process.machineEsApproval.service.MachineEsApprovalService;
import com.jero.modules.laws.common.constant.FieldCommon;
import com.jero.modules.laws.common.service.ILawsCommonService;
import com.jero.modules.tag.enums.TableNameEnum;
import lombok.SneakyThrows;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Map;
/**
* @author: Mzaxd
* @Date: 2023/12/19 11:59
*/
@Component
public class ProcessMachineEsApprovalEndListener implements ExecutionListener {
@Resource
private MachineEsApprovalService flowService;
@Resource
private ILawsCommonService lawsCommonService;
@SneakyThrows
@Override
public void notify(DelegateExecution delegateExecution) {
// 获取流程实例Id
String processInstanceId = delegateExecution.getProcessInstanceId();
// 根据流程Id获取业务数据
LambdaQueryWrapper<ProcessMachineEsApproval> revisionWrapper = new LambdaQueryWrapper<>();
revisionWrapper.eq(ProcessMachineEsApproval::getProcessInstanceId, processInstanceId);
// 获取企标相关数据
ProcessMachineEsApproval data = flowService.getOne(revisionWrapper);
// 将数据转换为Map
Map<String, Object> variables = transMap(data);
// 发布企标
lawsCommonService.commonAdd(variables);
}
private Map<String, Object> transMap(ProcessMachineEsApproval data) {
Map<String, Object> variables = JSON.parseObject(data.getBusinessJson(), Map.class);
variables.put(FieldCommon.MODULE, TableNameEnum.ENTERPRISE_STANDARDS.getValue());
// 标准状态
variables.put(FieldCommon.STANDARD_STATE, StandardStateEnum.CURRENTLY_EFFECTIVE.getStateValue());
String standardId = IdWorker.getIdStr();
variables.put(FieldCommon.ID, standardId);
String onEditFile = data.getOnEditFile();
// 发布稿
variables.put(FieldCommon.FILE_PUBLISH_OF_ORIGINAL, onEditFile);
return variables;
}
}
@@ -0,0 +1,18 @@
package com.jero.modules.activiti.process.machineEsApproval.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jero.modules.activiti.process.machineEsApproval.entity.ProcessMachineEsApproval;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Mapper
* @createDate 2023-12-19 11:58:59
* @Entity com.jero.modules.activiti.process.esRevision.entity.EsRevision
*/
public interface ProcessMachineEsApprovalMapper extends BaseMapper<ProcessMachineEsApproval> {
}
@@ -0,0 +1,23 @@
package com.jero.modules.activiti.process.machineEsApproval.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.machineEsApproval.entity.ProcessMachineEsApproval;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Service
* @createDate 2023-12-19 11:58:59
*/
public interface MachineEsApprovalService extends IService<ProcessMachineEsApproval> {
ProcessInfoVO<ProcessMachineEsApproval> getHandleData(String taskId);
void startProcess(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO);
void submit(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO);
void approveTask(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO, boolean pass);
}
@@ -0,0 +1,242 @@
package com.jero.modules.activiti.process.machineEsApproval.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.entity.ProcessApprovalRecord;
import com.jero.modules.activiti.enums.CommitFlagEnum;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.dto.BasicProcessInfoDTO;
import com.jero.modules.activiti.process.fb.dto.BasicTaskInfoDTO;
import com.jero.modules.activiti.process.fb.service.IProcessHandleService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.machineEsApproval.entity.ProcessMachineEsApproval;
import com.jero.modules.activiti.process.machineEsApproval.mapper.ProcessMachineEsApprovalMapper;
import com.jero.modules.activiti.process.machineEsApproval.service.MachineEsApprovalService;
import com.jero.modules.activiti.service.ProcessApprovalRecordService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.sys.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import static com.jero.modules.activiti.common.ActivitiCommon.*;
import static com.jero.modules.activiti.process.specialEsApproval.common.SpecialEsApprovalTaskNodeIdConstant.TWO;
/**
* @author ThinkBook
* @description 针对表【process_es_revision】的数据库操作Service实现
* @createDate 2023-12-19 11:58:59
*/
@Service
@Slf4j
@Transactional(rollbackFor = JeroBootException.class)
public class MachineEsApprovalServiceImpl extends ServiceImpl<ProcessMachineEsApprovalMapper, ProcessMachineEsApproval>
implements MachineEsApprovalService {
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private RuntimeService runtimeService;
@Resource
private IProcessHandleService processHandleService;
@Resource
private TaskService taskService;
@Resource
private ProcessApprovalRecordService approvalRecordService;
@Override
public void startProcess(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
// 流程Key
String processDefinitionKey = ProcessType.MACHINE_ES_APPROVAL.getProcessKey();
// 流程信息
BasicProcessInfoDTO processInfo = processInfoVO.getBasicProcessInfoDTO();
// 任务信息
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
// 人员信息
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
// 当前用户Id
String userId = UserUtils.getUserId();
// 设置流程变量
Map<String, Object> actVariables = this.setVariables(processInfoVO);
// 删除草稿
actFlowCommonService.getExistDraftAndRemove(processInfoVO.getDraftId());
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, actVariables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
processInfo.setProcessInstanceId(processInstanceId);
processInfo.setProcessDefinitionId(processDefinitionId);
processInfo.setProcessType(ProcessTypeEnum.MACHINE_ES_APPROVAL.getValue());
// 第一个节点业务数据处理
this.startNodeBusProcess(processInfoVO);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, userInfoMap);
// 获取第一个任务的taskId
String taskId = actFlowCommonService.getFirstTaskId(processInstanceId, userId, processDefinitionId);
processTask.setTaskId(taskId);
// 保存第一个节点的草稿
processHandleService.saveToDraft(processInfoVO, userId);
// 保存第一个节点的快照
processHandleService.saveToSnapshot(processInfoVO, userId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 根据流程实例id更新流程总表
actFlowCommonService.updateProcessAll(processInfo);
// 自动完成第一个任务
actFlowCommonService.completeTask(taskId, userId);
}
private void startNodeBusProcess(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
String processInstanceId = processInfoVO.getBasicProcessInfoDTO().getProcessInstanceId();
ProcessMachineEsApproval processInfo = processInfoVO.getBusinessInfoDTO();
processInfo.setProcessInstanceId(processInstanceId);
save(processInfo);
}
private Map<String, Object> setVariables(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
Map<String, Object> userInfoMap = processInfoVO.getUserInfoMap();
Map<String, Object> result = new HashMap<>();
// 将所有多选人员转换为List后放入map中
result.put(MAIN_DRAFT_USER, userInfoMap.get(MAIN_DRAFT_USER));
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_ONE_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_TWO_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_THREE_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_FOUR_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_FIVE_List);
actFlowCommonService.convertAndPutList(result, userInfoMap, USER_SIX_List);
// 获取分发人
return result;
}
@Override
public ProcessInfoVO<ProcessMachineEsApproval> getHandleData(String taskId) {
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException(ResultCommon.TASK_NOT_EXISTS);
}
ProcessInfoVO<ProcessMachineEsApproval> result = new ProcessInfoVO<>();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
result.setBasicProcessInfoDTO(actFlowCommonService.getProcessInfo(processInstanceId));
// 获取当前流程数据
LambdaQueryWrapper<ProcessMachineEsApproval> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessMachineEsApproval::getProcessInstanceId, processInstanceId);
ProcessMachineEsApproval processVo = getOne(queryWrapper);
// 设置流程信息
result.setBusinessInfoDTO(processVo);
return result;
}
@Override
public void submit(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO) {
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 校验是否有权限操作此待办
processHandleService.validTask(taskId);
// 获取当前节点的id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO();
// 使用流程引擎根据taskId找到流程实例Id
processInfo.setProcessInstanceId(processInstanceId);
processInfoVO.setBasicProcessInfoDTO(processInfo);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
String curUserId = UserUtils.getUserId();
ProcessMachineEsApproval data = processInfoVO.getBusinessInfoDTO();
// 根据流程实例Id获取流程定义ID
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
// 获取数据库中的流程信息
LambdaQueryWrapper<ProcessMachineEsApproval> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessMachineEsApproval::getProcessInstanceId, processInstanceId);
ProcessMachineEsApproval dataFromDb = getOne(queryWrapper);
if (dataFromDb != null) {
data.setId(dataFromDb.getId());
}
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
// 判断是否开启征求意见子流程 设置流程变量
Map<String, Object> actVariable = this.setVariables(processInfoVO);
taskService.setVariables(taskId, actVariable);
// 保存流程数据
saveOrUpdate(data);
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, processInfoVO.getUserInfoMap());
// 完成任务
actFlowCommonService.completeTask(taskId, curUserId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 删除草稿
actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, curUserId);
}
@Override
public void approveTask(ProcessInfoVO<ProcessMachineEsApproval> processInfoVO, boolean pass) {
// 获取task
BasicTaskInfoDTO processTask = processInfoVO.getBasicTaskInfoDTO();
String taskId = processTask.getTaskId();
// 校验是否有权限操作此待办
processHandleService.validTask(taskId);
String prcId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
BasicProcessInfoDTO processInfo = new BasicProcessInfoDTO();
processInfo.setProcessInstanceId(prcId);
processInfoVO.setBasicProcessInfoDTO(processInfo);
// 获取当前节点的id
ProcessApprovalRecord record = actFlowCommonService.getNodeIdByTaskId(taskId);
String xmlNodeId = record.getNodeId();
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(processTask, taskId);
String curUserId = UserUtils.getUserId();
if (xmlNodeId.equals(TWO)) {
// 获取数据库中的流程信息
ProcessMachineEsApproval data = processInfoVO.getBusinessInfoDTO();
LambdaQueryWrapper<ProcessMachineEsApproval> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessMachineEsApproval::getProcessInstanceId, processInstanceId);
ProcessMachineEsApproval dataFromDb = getOne(queryWrapper);
if (dataFromDb != null) {
data.setId(dataFromDb.getId());
}
// 保存数据
updateById(data);
}
// 设置流程变量
runtimeService.setVariable(processInstanceId, PASS, pass);
// 会签节点驳回后修改其他节点的状态
approvalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 保存快照
processHandleService.saveToSnapshot(processInfoVO, curUserId);
// 审批节点
actFlowCommonService.completeTask(taskId, curUserId);
// 驳回,结束所有节点
approvalRecordService.updateApprovalRecordFinishFlag(pass, taskId, xmlNodeId, processInstanceId);
// 更新审批表为完成,填充数据
processTask.setCommitFlag(pass ? CommitFlagEnum.PASS.getValue() : CommitFlagEnum.REJECT.getValue());
actFlowCommonService.updateApprovalInfo(processTask, taskId);
// 删除草稿
actFlowCommonService.removeDraft(curUserId, taskId, processInstanceId);
}
}
@@ -8,6 +8,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
@@ -34,17 +35,103 @@ public class ProcessNewStandardImport implements Serializable {
*/
@ApiModelProperty(value = "标准ID")
private String standardId;
/**标准编号*/
@ApiModelProperty(value = "标准编号")
@TableField(exist = false)
@Excel(name = "标准编号", width = 15)
private String standardNumber;
/**标准名称*/
@ApiModelProperty(value = "标准名称")
@TableField(exist = false)
@Excel(name = "标准名称", width = 15)
private String standardName;
/**代替标准编号*/
@ApiModelProperty(value = "代替标准编号")
@TableField(exist = false)
@Excel(name = "代替标准编号", width = 15)
private String substituteStandardNumber;
/**标准类型*/
@ApiModelProperty(value = "标准类型")
@Dict(dicCode = "standard_type")
@Excel(name = "标准类型", width = 15,dicCode = "standard_type")
private String standardCategory;
/**主管部门*/
@ApiModelProperty(value = "主管部门")
@Excel(name = "主管部门", width = 15,dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
private String competentDepartment;
/**主控部门*/
@ApiModelProperty(value = "主控部门")
@Excel(name = "主控部门", width = 15, dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
private String mainControlDepartment;
/**主控部门专业模块*/
@ApiModelProperty(value = "主控部门专业模块")
@Excel(name = "主控部门专业模块", width = 15, dicCode = "professional_module")
@Dict(dicCode = "professional_module")
private String mainDeptProfMode;
/**所处阶段*/
@ApiModelProperty(value = "所处阶段")
@Excel(name = "所处阶段", width = 15,dicCode = "stage_we_are_in")
@Dict(dicCode = "stage_we_are_in")
private String eventPhase;
/**新认证车实施日期*/
@ApiModelProperty(value = "新认证车实施日期")
@Excel(name = "新认证车实施日期", width = 15)
private String newAuthImplDate;
/**新生产车实施日期*/
@ApiModelProperty(value = "新生产车实施日期")
@Excel(name = "新生产车实施日期", width = 15)
private String newProductImplDate;
/**注册日期*/
@ApiModelProperty(value = "注册日期")
@Excel(name = "注册日期", width = 15)
private String registrationDate;
/**适用市场*/
@ApiModelProperty(value = "适用市场")
@Excel(name = "适用市场", width = 15,dicCode = "market_state")
@Dict(dicCode = "market_state")
private String applicableMarket;
/**法规要求简要描述*/
@ApiModelProperty(value = "法规要求简要描述")
@Excel(name = "法规要求简要描述", width = 15)
private String requireBriefDesc;
/**主送部门*/
@ApiModelProperty(value = "主送部门")
@Excel(name = "主送部门", width = 15,dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
private String masterSendDepartment;
/**抄送部门*/
@ApiModelProperty(value = "抄送部门")
@Excel(name = "抄送部门", width = 15,dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
@Dict(dictTable = "sys_depart", dicText = "depart_name", dicCode = "id")
private String copySendDepartment;
/**发送人员*/
@ApiModelProperty(value = "发送人员")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
@Excel(name = "发送人员", width = 15,dictTable = "sys_user", dicText = "CONCAT(realname,'(',username,')')", dicCode = "id")
private String copyUser;
/**通知发起人*/
@ApiModelProperty(value = "通知发起人")
@Dict(dictTable = "sys_user", dicText = "CONCAT(realname,'(',username,')')", dicCode = "username")
@Excel(name = "通知发起人", width = 15,dictTable = "sys_user", dicText = "CONCAT(realname,'(',username,')')", dicCode = "username")
private String createBy;
/**实施日期*/
@ApiModelProperty(value = "实施日期")
@TableField(exist = false)
private String implementationDate;
/**通知发布日期*/
@ApiModelProperty(value = "通知发布日期")
@TableField(exist = false)
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd")
@Excel(name = "通知发布日期", width = 15,format = "yyyy-MM-dd")
private Date publishDate;
/**
* 流程实例id
*/
@ApiModelProperty(value = "流程实例id")
private String processInstanceId;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@@ -61,54 +148,10 @@ public class ProcessNewStandardImport implements Serializable {
@ApiModelProperty(value = "更新日期")
private Date updateTime;
/**
* 0表示未删除,1表示删除
*/
@ApiModelProperty(value = "0表示未删除,1表示删除")
@TableLogic
private Integer delFlag;
/**所处阶段*/
@ApiModelProperty(value = "所处阶段")
private String eventPhase;
/**适用市场*/
@ApiModelProperty(value = "适用市场")
private String applicableMarket;
/**法规要求简要描述*/
@ApiModelProperty(value = "法规要求简要描述")
private String requireBriefDesc;
/**抄送人员*/
@ApiModelProperty(value = "抄送人员")
@Dict(dictTable = "sys_user", dicText = "realname", dicCode = "id")
private String copyUser;
/**适用市场*/
@ApiModelProperty(value = "标准类型")
@Dict(dicCode = "standard_type")
private String standardCategory;
/**实施日期*/
@ApiModelProperty(value = "实施日期")
@TableField(exist = false)
private String implementationDate;
/**标准名称*/
@ApiModelProperty(value = "标准名称")
@TableField(exist = false)
private String standardName;
/**标准编号*/
@ApiModelProperty(value = "标准编号")
@TableField(exist = false)
private String standardNumber;
/**代替标准编号*/
@ApiModelProperty(value = "代替标准编号")
@TableField(exist = false)
private String substituteStandardNumber;
/**主管部门*/
@ApiModelProperty(value = "主管部门")
private String competentDepartment;
/**主控部门*/
@ApiModelProperty(value = "主控部门")
private String mainControlDepartment;
}
@@ -1,8 +1,16 @@
package com.jero.modules.activiti.process.ni.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jero.modules.activiti.process.ni.entity.ProcessNewStandardImport;
import com.jero.modules.laws.marketStandard.entity.LawsMarketStandard;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author
@@ -18,6 +26,21 @@ public interface ProcessNewStandardImportMapper extends BaseMapper<ProcessNewSta
* @return
*/
ProcessNewStandardImport getStandardNameById(String id);
/**
* 分页
* @param page
* @param queryWrapper
* @return
*/
IPage<ProcessNewStandardImport> queryByPage(Page<ProcessNewStandardImport> page, @Param(Constants.WRAPPER) QueryWrapper<ProcessNewStandardImport> queryWrapper);
/**
* 列表
* @param queryWrapper
* @return
*/
List<ProcessNewStandardImport> queryByPage(@Param(Constants.WRAPPER) QueryWrapper<ProcessNewStandardImport> queryWrapper);
}
@@ -5,15 +5,21 @@
<mapper namespace="com.jero.modules.activiti.process.ni.mapper.ProcessNewStandardImportMapper">
<select id="getStandardNameById" resultType="com.jero.modules.activiti.process.ni.entity.ProcessNewStandardImport">
select standard_number,standard_name,
(select GROUP_CONCAT(replaced SEPARATOR ', ') from laws_replaced_standard where type=1 and replaced_by = a.standard_number) as substitute_standard_number,
implementation_date from
(select id, standard_number,standard_name,implementation_date
select id,standard_number,standard_name,
(select GROUP_CONCAT(replaced SEPARATOR ', ') from laws_replaced_standard where type=1 and replaced_by = laws_domestic_standard.standard_number) as substitute_standard_number,
implementation_date,new_product_impl_date,new_auth_impl_date,registration_date
from laws_domestic_standard
where del_flag = 0
union all
select id, standard_number,standard_name,implementation_date
from laws_enterprise_standard
where del_flag = 0) a where id = #{id}
where del_flag = 0 and id = #{id}
</select>
<select id="queryByPage" resultType="com.jero.modules.activiti.process.ni.entity.ProcessNewStandardImport">
select p.*,p1.standard_number,p1.standard_name,
(select GROUP_CONCAT(replaced SEPARATOR ', ') from laws_replaced_standard where type=1 and replaced_by = p1.standard_number) as substitute_standard_number,
p1.implementation_date,p1.new_product_impl_date,p1.new_auth_impl_date,p1.registration_date,p2.end_time as publishDate
from process_standard_import p
left join laws_domestic_standard p1 on p.standard_id = p1.id and p1.del_flag = 0
left join process_all p2 on p2.process_instance_id = p.process_instance_id
left join sys_user s1 on s1.username = p.create_by and s1.del_flag = 0
${ew.customSqlSegment}
</select>
</mapper>
@@ -1,5 +1,7 @@
package com.jero.modules.activiti.process.ni.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.ni.entity.ProcessNewStandardImport;
@@ -323,7 +323,6 @@ public class ProcessNewStandardImportServiceImpl extends ServiceImpl<ProcessNewS
if(!Objects.isNull(processNewStandardImport)){
data.setStandardName(processNewStandardImport.getStandardName());
data.setStandardNumber(processNewStandardImport.getStandardNumber());
data.setImplementationDate(processNewStandardImport.getImplementationDate());
data.setSubstituteStandardNumber(processNewStandardImport.getSubstituteStandardNumber());
}
result.setBusinessInfoDTO(data);
@@ -0,0 +1,14 @@
package com.jero.modules.activiti.process.part.common;
/**
* @author liJiaRao
* @date 2024-06-17 15:28
*/
public class ProcessPartTypeApplyConstants {
private ProcessPartTypeApplyConstants(){}
/**
* 设计工程师部门经理审批
*/
public static final String DESIGN_ENGINEER_DEPARTMENT_MANAGER_APPROVAL = "SID-BA959E3B-C6E3-4407-BA45-7127052C1E4A";
}
@@ -0,0 +1,102 @@
package com.jero.modules.activiti.process.part.controller;
import com.jero.common.api.vo.Result;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.common.system.base.controller.JeroController;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.fb.vo.ProcessInfoVO;
import com.jero.modules.activiti.process.part.entity.ProcessPartTypeApply;
import com.jero.modules.activiti.process.part.service.IProcessPartTypeApplyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* 流程-关键零部件型号申请流程
*
* @author xxxxx
*/
@Slf4j
@Api(tags = "关键零部件型号申请流程")
@RestController
@RequestMapping("process/processPartTypeApply")
public class ProcessPartTypeApplyController extends JeroController<ProcessPartTypeApply, IProcessPartTypeApplyService> {
@Resource
private IProcessPartTypeApplyService sccService;
@Resource
private ActFlowCommonService actFlowCommonService;
@AutoLog(value = "关键零部件型号申请流程-发起流程")
@ApiOperation(value = "关键零部件型号申请流程-发起流程", notes = "关键零部件型号申请流程-发起流程")
@PostMapping(value = "/start")
public Result<T> startProcess(@Validated @RequestBody ProcessInfoVO<ProcessPartTypeApply> processInfoVO) {
sccService.startProcess(processInfoVO);
return Result.OK();
}
@AutoLog(value = "关键零部件型号申请流程-同意")
@ApiOperation(value = "关键零部件型号申请流程-同意", notes = "关键零部件型号申请流程-同意")
@PostMapping("/agree")
public Result<T> agree(@Validated @RequestBody ProcessInfoVO<ProcessPartTypeApply> processInfoVO) {
sccService.approveTask(processInfoVO, true);
return Result.OK();
}
@AutoLog(value = "关键零部件型号申请流程-驳回")
@ApiOperation(value = "关键零部件型号申请流程-驳回", notes = "关键零部件型号申请流程-驳回")
@PostMapping("/reject")
public Result<T> reject(@Validated @RequestBody ProcessInfoVO<ProcessPartTypeApply> processInfoVO) {
sccService.approveTask(processInfoVO, false);
return Result.OK();
}
@AutoLog(value = "关键零部件型号申请流程-提交")
@ApiOperation(value = "关键零部件型号申请流程-提交", notes = "关键零部件型号申请流程-提交")
@PostMapping("/submit")
public Result<T> submit(@Validated @RequestBody ProcessInfoVO<ProcessPartTypeApply> processInfoVO) {
sccService.submit(processInfoVO);
return Result.OK();
}
/**
* 关键零部件型号申请流程-办理
* @param taskId
*/
@AutoLog(value = "关键零部件型号申请流程-办理")
@ApiOperation(value="关键零部件型号申请流程-办理", notes="关键零部件型号申请流程-办理")
@GetMapping("/handle/{taskId}")
@Translation
public Result<?> handle(@PathVariable("taskId") String taskId) {
ProcessDraft draft = actFlowCommonService.getExistDraftByTaskId(taskId, ProcessTypeEnum.PART_TYPE_APPLY);
if (draft != null) {
return Result.OK(draft);
}
return Result.OK(sccService.getHandleData(taskId));
}
/**
* 生成
* @param scc
*/
@AutoLog(value = "关键零部件型号申请流程-生成")
@ApiOperation(value="关键零部件型号申请流程-生成", notes="关键零部件型号申请流程-生成")
@PostMapping("/generate")
@Translation
public Result<?> generate(@RequestPart("scc") ProcessPartTypeApply scc,
@RequestPart("modelFile") MultipartFile modelFile,
@RequestPart(name = "splitFile", required = false) MultipartFile splitFile) {
return Result.OK(sccService.generate(scc, modelFile, splitFile));
}
}
@@ -0,0 +1,163 @@
package com.jero.modules.activiti.process.part.controller;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.jero.common.api.vo.Result;
import com.jero.common.api.vo.ResultCommon;
import com.jero.common.aspect.annotation.AutoLog;
import com.jero.common.aspect.annotation.Translation;
import com.jero.modules.activiti.process.part.entity.ProcessPartTypeApply;
import com.jero.modules.activiti.process.part.entity.ProcessPartTypeApplyRecord;
import com.jero.modules.activiti.process.part.service.IProcessPartTypeApplyRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Api(tags = "业务支持-关键零部件型号库流程表")
@RestController
@RequestMapping("/laws/processPartTypeApplyRecord")
@Slf4j
public class ProcessPartTypeApplyRecordController {
@Resource
private IProcessPartTypeApplyRecordService processPartTypeApplyRecordService;
/**
* 分页列表查询
*
* @param processPartTypeApplyRecord
* @return
*/
@AutoLog(value = "业务支持-关键零部件型号库-列表查询")
@ApiOperation(value = "业务支持-关键零部件型号库-列表查询", notes = "业务支持-关键零部件型号库-列表查询")
@GetMapping(value = "/page")
@ApiOperationSupport(order = 1)
// @RequiresPermissions("keyPartBindingManage:search")
@Translation
public Result<List<ProcessPartTypeApplyRecord>> queryList(ProcessPartTypeApplyRecord processPartTypeApplyRecord,
HttpServletRequest req) {
List<ProcessPartTypeApplyRecord> pageList = processPartTypeApplyRecordService.queryList(processPartTypeApplyRecord, req);
return Result.OK(pageList);
}
/**
* 详情
*
* @param processPartTypeApplyRecord
* @return
*/
@AutoLog(value = "业务支持-关键零部件型号库-详情")
@ApiOperation(value = "业务支持-关键零部件型号库-详情", notes = "业务支持-关键零部件型号库-详情")
@GetMapping(value = "/queryById")
@ApiOperationSupport(order = 2)
@Translation
public Result<ProcessPartTypeApplyRecord> queryById(ProcessPartTypeApplyRecord processPartTypeApplyRecord) {
ProcessPartTypeApplyRecord result = processPartTypeApplyRecordService.queryById(processPartTypeApplyRecord.getId());
return Result.OK(result);
}
/**
* 删除
*
* @param map
* @return
*/
@AutoLog(value = "业务支持-关键零部件型号库-删除")
@ApiOperation(value = "业务支持-关键零部件型号库-删除", notes = "业务支持-关键零部件型号库-删除")
@ApiOperationSupport(order = 4)
@PostMapping(value = "/delete")
// @RequiresPermissions("keyPartBindingManage:delete")
public Result<?> delete(@RequestBody Map<String, String> map) {
if (!map.containsKey("id") || StringUtils.isEmpty(map.get("id"))) {
return Result.error(ResultCommon.SELECT_DATA);
}
this.processPartTypeApplyRecordService.deleteById(map.get("id"));
return Result.OK(ResultCommon.OK);
}
/**
* 批量删除
*
* @param map
* @return
*/
@AutoLog(value = "业务支持-关键零部件型号库-批量删除")
@ApiOperation(value = "业务支持-关键零部件型号库-批量删除", notes = "业务支持-关键零部件型号库-批量删除")
@ApiOperationSupport(order = 4)
@PostMapping(value = "/deleteBatch")
// @RequiresPermissions("keyPartBindingManage:batchDel")
public Result<T> deleteBatch(@RequestBody Map<String, String> map) {
if (!map.containsKey("ids") || StringUtils.isEmpty(map.get("ids"))) {
return Result.error(ResultCommon.SELECT_DATA);
}
this.processPartTypeApplyRecordService.deleteByIds(Arrays.asList(map.get("ids").split(",")));
return Result.OK(ResultCommon.OK);
}
/**
* 新增
*
* @param processPartTypeApplyRecord
* @return
*/
@AutoLog(value = "业务支持-关键零部件型号库-新增")
@ApiOperation(value = "业务支持-关键零部件型号库-新增", notes = "业务支持-关键零部件型号库-新增")
@ApiOperationSupport(order = 5)
@PostMapping(value = "/add")
@Translation
// @RequiresPermissions("keyPartBindingManage:add")
public Result<ProcessPartTypeApplyRecord> add(@RequestBody ProcessPartTypeApplyRecord processPartTypeApplyRecord) {
return Result.OK(processPartTypeApplyRecordService.add(processPartTypeApplyRecord));
}
/**
* 编辑
*
* @param processPartTypeApplyRecord
* @return
*/
@AutoLog(value = "业务支持-关键零部件型号库-编辑")
@ApiOperation(value = "业务支持-关键零部件型号库-编辑", notes = "业务支持-关键零部件型号库-编辑")
@ApiOperationSupport(order = 6)
@PostMapping(value = "/edit")
// @RequiresPermissions("keyPartBindingManage:import")
@Translation
public Result<ProcessPartTypeApplyRecord> edit(@RequestBody ProcessPartTypeApplyRecord processPartTypeApplyRecord) {
return Result.OK(this.processPartTypeApplyRecordService.edit(processPartTypeApplyRecord));
}
/**
* 关键零部件型号编辑
* @param processPartTypeApplyRecord
*/
@AutoLog(value = "业务支持-关键零部件型号库-关键零部件型号编辑")
@ApiOperation(value="业务支持-关键零部件型号库-关键零部件型号编辑", notes="关键零部件型号库-关键零部件型号编辑")
@PostMapping("/partRelevanceTypeUpdate")
public Result<?> partRelevanceTypeUpdate(@RequestBody ProcessPartTypeApplyRecord processPartTypeApplyRecord) {
return Result.OK(processPartTypeApplyRecordService.partRelevanceTypeUpdate(processPartTypeApplyRecord));
}
/**
* 确认生成
* @param processPartTypeApplyRecord
*/
@AutoLog(value = "业务支持-关键零部件型号库-确认生成")
@ApiOperation(value="业务支持-关键零部件型号库-确认生成", notes="关键零部件型号库-确认生成")
@PostMapping("/affirmGenerate")
public Result<?> affirmGenerate(@RequestBody ProcessPartTypeApplyRecord processPartTypeApplyRecord) {
return Result.OK(processPartTypeApplyRecordService.affirmGenerate(processPartTypeApplyRecord));
}
}
@@ -0,0 +1,78 @@
package com.jero.modules.activiti.process.part.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jero.common.aspect.annotation.Dict;
import com.jero.modules.laws.marketStandard.entity.LawsMarketStandardDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
*
* @TableName process_standard_compliance_check
*/
@TableName(value ="process_part_type_apply")
@Data
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="process_part_type_apply对象", description="关键零部件型号申请流程")
public class ProcessPartTypeApply implements Serializable {
/**主键*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键")
private String id;
/**
* 流程实例id
*/
@ApiModelProperty(value = "流程实例id")
private String processInstanceId;
/**创建人*/
@ApiModelProperty(value = "创建人")
private String createBy;
/**创建日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建日期")
private Date createTime;
/**更新人*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**更新日期*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新日期")
private Date updateTime;
/**
* 0表示未删除,1表示删除
*/
@ApiModelProperty(value = "0表示未删除,1表示删除")
@TableLogic
private Integer delFlag;
/**关键零部件型号ids*/
@ApiModelProperty(value = "关键零部件型号ids")
@TableField(exist = false)
private String ids;
/**
* 关键零部件型号列表
*/
@TableField(exist = false)
private List<ProcessPartTypeApplyRecord> list;
}
@@ -0,0 +1,245 @@
package com.jero.modules.activiti.process.part.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.jero.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.util.Date;
/**
* 关键零部件型号库
*
* @TableName laws_part_type
*/
@TableName(value ="process_part_type_apply_record")
@Data
public class ProcessPartTypeApplyRecord implements Serializable {
/**
* 主键ID
*/
@TableId(type = IdType.ASSIGN_ID)
@ApiModelProperty(value = "主键ID")
private String id;
/**
* 创建时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建时间")
private Date createTime;
/**
* 更新人
*/
@ApiModelProperty(value = "更新人")
private String updateBy;
/**
* 更新时间
*/
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "更新时间")
private Date updateTime;
/**
* 0表示未删除,1表示删除
*/
@TableLogic
@ApiModelProperty(value = "0表示未删除,1表示删除")
private Integer delFlag;
/**
* 零件号
*/
@ApiModelProperty(value = "零件号")
@Excel(name = "零件号", width = 15)
@NotBlank(message = "零件号")
private String partNum;
/**
* 关键零部件id
*/
@ApiModelProperty(value = "关键零部件id")
private String partRelevanceId;
/**
* 关键零部件名称
*/
@ApiModelProperty(value = "关键零部件名称")
@Excel(name = "关键零部件名称", width = 15)
@NotBlank(message = "关键零部件名称不能为空")
private String regPartNameCn;
/**
* 关键零部件名称(英文)
*/
@ApiModelProperty(value = "关键零部件名称(英文)")
@Excel(name = "关键零部件名称(英文)", width = 15)
private String regPartNameEn;
/**
* 零件名称
*/
@NotBlank(message = "零件名称")
@ApiModelProperty(value = "零件名称")
@Excel(name = "零件名称", width = 15)
private String partName;
/**
* 生产厂家
*/
@NotBlank(message = "生产厂家")
@ApiModelProperty(value = "生产厂家")
@Excel(name = "生产厂家", width = 15, dicCode = "production_factory_code", dictTable = "laws_part_production_factory", dicText = "production_factory")
@Dict(dicCode = "production_factory_code", dictTable = "laws_part_production_factory", dicText = "production_factory")
private String productionFactory;
/**
* 关键零部件型号
*/
@ApiModelProperty(value = "关键零部件型号")
@Excel(name = "关键零部件型号", width = 15)
private String partRelevanceType;
/**
* 适用车型
*/
@NotBlank(message = "适用车型不能为空")
@ApiModelProperty(value = "适用车型")
@Excel(name = "适用车型", width = 15, dicCode = "applicable_vehicle_type_part")
@Dict(dicCode = "applicable_vehicle_type_part")
private String applicableVehicleType;
/**
* 技术特性与已有零件全部相同
*/
@NotBlank(message = "技术特性与已有零件全部相同")
@ApiModelProperty(value = "技术特性与已有零件全部相同")
@Dict(dicCode = "yn")
private String technicalFeature;
/**
* 型号型式
*/
@NotBlank(message = "型号型式不能为空")
@ApiModelProperty(value = "型号型式")
@Excel(name = "型号型式", width = 15, dicCode = "form_type")
@Dict(dicCode = "form_type")
private String formType;
/**
* 技术特性判定要求
*/
@ApiModelProperty(value = "技术特性判定要求")
@Excel(name = "技术特性判定要求", width = 15)
private String decisionRequirement;
/**
* 已有零件对应零件号
*/
@ApiModelProperty(value = "已有零件对应零件号")
@Excel(name = "已有零件对应零件号", width = 15)
private String alreadyPartNum;
/**
* 已有零件对应零件号id
*/
@ApiModelProperty(value = "已有零件对应零件号id")
private String alreadyPartNumId;
/**
* 分类(国内)
*/
@ApiModelProperty(value = "分类(国内)")
@Excel(name = "分类(国内)", width = 15,dicCode = "classification")
@Dict(dicCode = "classification")
private String classification;
/**
* 适用市场
*/
@Excel(name = "适用市场", width = 15,dicCode = "market_state")
@NotBlank(message = "适用市场不能为空")
@ApiModelProperty(value = "适用市场")
@Dict(dicCode = "market_state")
private String applicableMarket;
/**
* 零部件认证交付物
*/
@ApiModelProperty(value = "零部件认证交付物")
@Excel(name = "零部件认证交付物", width = 15,dicCode = "parts_certified_deliverables")
@Dict(dicCode = "parts_certified_deliverables")
private String partsCertifiedDeliverables;
/**
* 责任部门
*/
@NotBlank(message = "责任部门不能为空")
@Dict(dictTable = "sys_depart", dicCode = "id", dicText = "depart_name")
@ApiModelProperty(value = "责任部门")
@Excel(name = "责任部门", width = 15, dictTable = "sys_depart", dicCode = "id", dicText = "depart_name")
private String responsibleDepartment;
/**
* 责任部门专业模块
*/
@NotBlank(message = "责任部门专业模块不能为空")
@ApiModelProperty(value = "责任部门专业模块")
@Dict(dicCode = "responsible_module")
@Excel(name = "责任部门专业模块", width = 15, dicCode = "responsible_module")
private String responsibleModule;
/**
* 代替关键零部件型号
*/
@ApiModelProperty(value = "代替关键零部件型号")
@Excel(name = "代替关键零部件型号", width = 15)
private String replacePartNum;
/**
* 申请人
*/
@ApiModelProperty(value = "申请人")
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@Excel(name = "申请人", width = 15, dictTable = "sys_user", dicCode = "id", dicText = "username")
private String createBy;
/**
* 申请部门
*/
@ApiModelProperty(value = "申请部门")
@Dict(dictTable = "sys_depart", dicCode = "id", dicText = "depart_name")
@Excel(name = "申请部门", width = 15, dictTable = "sys_depart", dicCode = "id", dicText = "depart_name")
@TableField(exist = false)
private String depId;
/**
* 完成时间
*/
@ApiModelProperty(value = "完成时间")
@Excel(name = "完成时间",format = "yyyy-MM-dd")
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date successTime;
/**
* 状态
*/
@ApiModelProperty(value = "状态")
@Excel(name = "状态", dicCode = "part_type_status")
@Dict(dicCode = "part_type_status")
private String status;
/**
* 替换前id
*/
@ApiModelProperty(value = "替换前id")
private String lastId;
/**
* 流程id
*/
@ApiModelProperty(value = "流程id")
private String processId;
/**
* FND+GPC关联
*/
@ApiModelProperty(value = "FND+GPC关联")
private String fndGpc;
}
@@ -0,0 +1,26 @@
package com.jero.modules.activiti.process.part.listener;
import com.jero.modules.activiti.process.part.service.IProcessPartTypeApplyService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author liJiaRao
* @date 2023-06-18 15:43
*/
@Slf4j
@Component
public class ProcessPartTypeApplyEndListener implements ExecutionListener {
@Resource
private IProcessPartTypeApplyService processPartTypeApplyService;
@Override
public void notify(DelegateExecution delegateExecution) {
processPartTypeApplyService.flowListener(delegateExecution);
}
}
@@ -0,0 +1,19 @@
package com.jero.modules.activiti.process.part.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jero.modules.activiti.process.part.entity.ProcessPartTypeApply;
/**
* @author
* @description 针对表【process_standard_import】的数据库操作Mapper
* @createDate 2024-07-04 10:21:21
* @Entity
*/
public interface ProcessPartTypeApplyMapper extends BaseMapper<ProcessPartTypeApply> {
}
@@ -0,0 +1,26 @@
package com.jero.modules.activiti.process.part.mapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.jero.modules.activiti.process.part.entity.ProcessPartTypeApplyRecord;
import com.jero.modules.laws.part.entity.LawsPartType;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author
* @description 针对表【process_standard_import】的数据库操作Mapper
* @createDate 2024-07-04 10:21:21
* @Entity
*/
public interface ProcessPartTypeApplyRecordMapper extends BaseMapper<ProcessPartTypeApplyRecord> {
List<ProcessPartTypeApplyRecord> pageList(@Param(Constants.WRAPPER) QueryWrapper<ProcessPartTypeApplyRecord> queryWrapper);
}
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jero.modules.activiti.process.part.mapper.ProcessPartTypeApplyMapper">
</mapper>
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jero.modules.activiti.process.part.mapper.ProcessPartTypeApplyRecordMapper">
<select id="pageList"
resultType="com.jero.modules.activiti.process.part.entity.ProcessPartTypeApplyRecord">
select
l1.reg_part_name_en,
l1.reg_part_name_cn,
l1.form_type,
l1.system_code,
l1.decision_requirement,
l1.classification,
l1.applicable_market,
l1.parts_certified_deliverables,
l1.responsible_department,
l1.responsible_module,
l1.remark,
l1.fnd_gpc,
l1.id,
l1.part_num,
l1.part_relevance_id,
l1.part_name,
l1.production_factory,
l1.applicable_vehicle_type,
l1.technical_feature,
l1.already_part_num_id,
l1.already_part_num,
l1.status,
l1.success_time,
l1.part_relevance_type,
l1.replace_part_num,
l1.create_by,
l1.last_id,
l1.create_time,
s3.id as dep_id
from process_part_type_apply_record l1
left join sys_user s1 on s1.username = l1.create_by
left join sys_user_depart s2 on s2.user_id = s1.id
left join sys_depart s3 on s3.id = s2.dep_id
${ew.customSqlSegment}
</select>
</mapper>

Some files were not shown because too many files have changed in this diff Show More