MaterialTaskServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. package com.xjrsoft.module.material.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.extra.spring.SpringUtil;
  6. import cn.hutool.json.JSONUtil;
  7. import com.alibaba.fastjson.JSONObject;
  8. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  9. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  10. import com.fasterxml.jackson.core.type.TypeReference;
  11. import com.github.yulichang.base.MPJBaseServiceImpl;
  12. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  13. import com.xjrsoft.common.constant.GlobalConstant;
  14. import com.xjrsoft.common.enums.DeleteMark;
  15. import com.xjrsoft.common.enums.MaterialCategoryEnum;
  16. import com.xjrsoft.common.exception.MyException;
  17. import com.xjrsoft.common.model.generator.ComponentConfig;
  18. import com.xjrsoft.common.utils.FileZipUtil;
  19. import com.xjrsoft.common.utils.RedisUtil;
  20. import com.xjrsoft.common.utils.VoToColumnUtil;
  21. import com.xjrsoft.module.concat.service.IXjrUserService;
  22. import com.xjrsoft.module.form.dto.FormExecuteAddOrUpdateDto;
  23. import com.xjrsoft.module.form.entity.FormDesignConfig;
  24. import com.xjrsoft.module.form.entity.FormTemplate;
  25. import com.xjrsoft.module.form.mapper.FormTemplateMapper;
  26. import com.xjrsoft.module.form.service.IFormExecuteService;
  27. import com.xjrsoft.module.generator.constant.ComponentTypeConstant;
  28. import com.xjrsoft.module.generator.entity.TableConfig;
  29. import com.xjrsoft.module.generator.utils.GeneratorUtil;
  30. import com.xjrsoft.module.material.dto.*;
  31. import com.xjrsoft.module.material.entity.MaterialTask;
  32. import com.xjrsoft.module.material.entity.MaterialTaskAppendix;
  33. import com.xjrsoft.module.material.entity.MaterialTaskAssign;
  34. import com.xjrsoft.module.material.entity.MaterialType;
  35. import com.xjrsoft.module.material.entity.MaterialTypeAssign;
  36. import com.xjrsoft.module.material.mapper.MaterialTaskAppendixMapper;
  37. import com.xjrsoft.module.material.mapper.MaterialTaskAssignMapper;
  38. import com.xjrsoft.module.material.mapper.MaterialTaskMapper;
  39. import com.xjrsoft.module.material.service.IMaterialTaskAppendixService;
  40. import com.xjrsoft.module.material.service.IMaterialTaskService;
  41. import com.xjrsoft.module.material.service.IMaterialTypeService;
  42. import com.xjrsoft.module.material.vo.*;
  43. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  44. import com.xjrsoft.module.organization.entity.Department;
  45. import com.xjrsoft.module.organization.entity.User;
  46. import com.xjrsoft.module.organization.entity.UserDeptRelation;
  47. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  48. import com.xjrsoft.module.organization.service.IUserService;
  49. import com.xjrsoft.module.organization.service.IWeChatService;
  50. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  51. import com.xjrsoft.module.system.entity.DictionaryDetail;
  52. import com.xjrsoft.module.system.entity.File;
  53. import com.xjrsoft.module.system.service.IFileService;
  54. import com.xjrsoft.module.teacher.entity.XjrUser;
  55. import com.xjrsoft.module.teacher.vo.XjrUserVo;
  56. import com.xjrsoft.module.workflow.entity.WorkflowSchema;
  57. import lombok.AllArgsConstructor;
  58. import org.springframework.stereotype.Service;
  59. import org.springframework.transaction.annotation.Transactional;
  60. import java.io.ByteArrayOutputStream;
  61. import java.io.IOException;
  62. import java.io.InputStream;
  63. import java.net.URL;
  64. import java.net.URLConnection;
  65. import java.time.LocalDate;
  66. import java.util.*;
  67. import java.util.concurrent.CompletableFuture;
  68. import java.util.stream.Collectors;
  69. /**
  70. * @title: 材料提交任务
  71. * @Author baicai
  72. * @Date: 2023-10-31
  73. * @Version 1.0
  74. */
  75. @Service
  76. @AllArgsConstructor
  77. public class MaterialTaskServiceImpl extends MPJBaseServiceImpl<MaterialTaskMapper, MaterialTask> implements IMaterialTaskService {
  78. private final MaterialTaskMapper materialTaskMaterialTaskMapper;
  79. private final MaterialTaskAssignMapper materialTaskMaterialTaskAssignMapper;
  80. private final MaterialTaskAppendixMapper appendixMapper;
  81. private final IMaterialTypeService materialTypeService;
  82. private final IWeChatService weChatService;
  83. private final IXjrUserService xjrUserService;
  84. private final IFormExecuteService formExecuteService;
  85. private final FormTemplateMapper formTemplateMapper;
  86. private final IFileService fileService;
  87. private final IUserService userService;
  88. private final IMaterialTaskAppendixService materialTaskAppendixService;
  89. @Override
  90. @Transactional(rollbackFor = Exception.class)
  91. public Long add(AddMaterialTaskDto dto) {
  92. MaterialTask materialTask = BeanUtil.toBean(dto, MaterialTask.class);
  93. //梳理提交人
  94. Map<Long, MaterialTaskAssign> materialTaskAssignMap = new HashMap<>();
  95. for (MaterialAssignUserDto materialAssignUserDto : dto.getUserList()){
  96. if(materialAssignUserDto.getUserType() == 1){
  97. List<XjrUserVo> xjrUserVos = xjrUserService.selectJoinList(XjrUserVo.class,
  98. new MPJLambdaWrapper<XjrUser>()
  99. .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, XjrUser::getId)
  100. .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
  101. .eq(UserDeptRelation::getDeptId, materialAssignUserDto.getUserId())
  102. .eq(UserRoleRelation::getRoleId, 2)
  103. .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
  104. );
  105. for (XjrUserVo xjrUserVo : xjrUserVos) {
  106. materialTaskAssignMap.put(xjrUserVo.getId(), new MaterialTaskAssign(){{
  107. setUserId(xjrUserVo.getId());
  108. setUserType(1);
  109. setUserNumber(xjrUserVo.getUserName());
  110. setStatus(1);
  111. setExecutiveStatus(1);
  112. setSendMessage(dto.getSendMessage());
  113. }});
  114. }
  115. }else if(materialAssignUserDto.getUserType() == 2){
  116. List<XjrUserVo> xjrUserVos = xjrUserService.selectJoinList(XjrUserVo.class,
  117. new MPJLambdaWrapper<XjrUser>()
  118. .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId)
  119. .eq(BaseStudentSchoolRoll::getClassId, materialAssignUserDto.getUserId())
  120. .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
  121. );
  122. for (XjrUserVo xjrUserVo : xjrUserVos) {
  123. materialTaskAssignMap.put(xjrUserVo.getId(), new MaterialTaskAssign(){{
  124. setUserId(xjrUserVo.getId());
  125. setUserType(2);
  126. setUserNumber(xjrUserVo.getUserName());
  127. setStatus(1);
  128. setExecutiveStatus(1);
  129. setSendMessage(dto.getSendMessage());
  130. }});
  131. }
  132. }else if(materialAssignUserDto.getUserType() == 3){
  133. List<MaterialTaskAssignUserVo> materialTaskAssignUserVoList = xjrUserService.selectJoinList(MaterialTaskAssignUserVo.class,
  134. new MPJLambdaWrapper<XjrUser>()
  135. .select(XjrUser::getId)
  136. .selectAs(XjrUser::getUserName, MaterialTaskAssignUserVo::getUserName)
  137. .selectAs(UserRoleRelation::getRoleId, MaterialTaskAssignUserVo::getRoleId)
  138. .leftJoin(UserRoleRelation.class, UserRoleRelation::getUserId, XjrUser::getId)
  139. .eq(XjrUser::getId, materialAssignUserDto.getUserId())
  140. .eq(XjrUser::getDeleteMark, DeleteMark.NODELETE.getCode())
  141. );
  142. if(materialTaskAssignUserVoList != null && !materialTaskAssignUserVoList.isEmpty()){
  143. MaterialTaskAssignUserVo materialTaskAssignUserVo = materialTaskAssignUserVoList.get(0);
  144. materialTaskAssignMap.put(materialTaskAssignUserVo.getId(), new MaterialTaskAssign(){{
  145. setUserId(materialAssignUserDto.getUserId());
  146. setUserType(materialTaskAssignUserVo.getRoleId() == 3 ? 2 : 1);
  147. setUserNumber(materialTaskAssignUserVo.getUserName());
  148. setStatus(1);
  149. setExecutiveStatus(1);
  150. setSendMessage(dto.getSendMessage());
  151. }});
  152. }
  153. }
  154. }
  155. List<MaterialTaskAssign> materialTaskAssignList = new ArrayList<>(materialTaskAssignMap.values());
  156. //新增任务
  157. materialTask.setStatus(2);
  158. if(dto.getUserList() != null && !dto.getUserList().isEmpty()){
  159. materialTask.setAssignPerson(materialTaskAssignList.size());
  160. }
  161. materialTaskMaterialTaskMapper.insert(materialTask);
  162. //新增任务人
  163. for(MaterialTaskAssign materialTaskAssign : materialTaskAssignList){
  164. materialTaskAssign.setMaterialTaskId(materialTask.getId());
  165. materialTaskMaterialTaskAssignMapper.insert(materialTaskAssign);
  166. }
  167. // materialTaskMaterialTaskMapper.insert(materialTask);
  168. // if (materialTask.getMaterialTaskAssignList() != null && materialTask.getMaterialTaskAssignList().size() > 0) {
  169. // for (MaterialTaskAssign materialTaskAssign : materialTask.getMaterialTaskAssignList()) {
  170. // materialTaskAssign.setMaterialTaskId(materialTask.getId());
  171. // materialTaskMaterialTaskAssignMapper.insert(materialTaskAssign);
  172. // }
  173. // }
  174. // for (MaterialTaskAppendix materialTaskAppendix : materialTask.getMaterialTaskAppendixList()) {
  175. // materialTaskAppendix.setMaterialTaskId(materialTask.getId());
  176. // materialTaskMaterialTaskAppendixMapper.insert(materialTaskAppendix);
  177. // }
  178. return materialTask.getId();
  179. }
  180. @Override
  181. @Transactional(rollbackFor = Exception.class)
  182. public Boolean update(MaterialTask materialTask) {
  183. materialTaskMaterialTaskMapper.updateById(materialTask);
  184. //********************************* MaterialTaskAssign 增删改 开始 *******************************************/
  185. {
  186. if (materialTask.getMaterialTaskAssignList() != null && materialTask.getMaterialTaskAssignList().size() > 0) {
  187. // 查出所有子级的id
  188. List<MaterialTaskAssign> materialTaskAssignList = materialTaskMaterialTaskAssignMapper.selectList(Wrappers.lambdaQuery(MaterialTaskAssign.class).eq(MaterialTaskAssign::getMaterialTaskId, materialTask.getId()).select(MaterialTaskAssign::getId));
  189. List<Long> materialTaskAssignIds = materialTaskAssignList.stream().map(MaterialTaskAssign::getId).collect(Collectors.toList());
  190. //原有子表单 没有被删除的主键
  191. List<Long> materialTaskAssignOldIds = materialTask.getMaterialTaskAssignList().stream().map(MaterialTaskAssign::getId).filter(Objects::nonNull).collect(Collectors.toList());
  192. //找到需要删除的id
  193. List<Long> materialTaskAssignRemoveIds = materialTaskAssignIds.stream().filter(item -> !materialTaskAssignOldIds.contains(item)).collect(Collectors.toList());
  194. for (MaterialTaskAssign materialTaskAssign : materialTask.getMaterialTaskAssignList()) {
  195. //如果不等于空则修改
  196. if (materialTaskAssign.getId() != null) {
  197. materialTaskMaterialTaskAssignMapper.updateById(materialTaskAssign);
  198. }
  199. //如果等于空 则新增
  200. else {
  201. //已经不存在的id 删除
  202. materialTaskAssign.setMaterialTaskId(materialTask.getId());
  203. materialTaskMaterialTaskAssignMapper.insert(materialTaskAssign);
  204. }
  205. }
  206. //已经不存在的id 删除
  207. if (materialTaskAssignRemoveIds.size() > 0) {
  208. materialTaskMaterialTaskAssignMapper.deleteBatchIds(materialTaskAssignRemoveIds);
  209. }
  210. }
  211. }
  212. //********************************* MaterialTaskAssign 增删改 结束 *******************************************/
  213. //********************************* MaterialTaskAppendix 增删改 开始 *******************************************/
  214. {
  215. // 查出所有子级的id
  216. List<MaterialTaskAppendix> materialTaskAppendixList = appendixMapper.selectList(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTask.getId()).select(MaterialTaskAppendix::getId));
  217. List<Long> materialTaskAppendixIds = materialTaskAppendixList.stream().map(MaterialTaskAppendix::getId).collect(Collectors.toList());
  218. //原有子表单 没有被删除的主键
  219. List<Long> materialTaskAppendixOldIds = materialTask.getMaterialTaskAppendixList().stream().map(MaterialTaskAppendix::getId).filter(Objects::nonNull).collect(Collectors.toList());
  220. //找到需要删除的id
  221. List<Long> materialTaskAppendixRemoveIds = materialTaskAppendixIds.stream().filter(item -> !materialTaskAppendixOldIds.contains(item)).collect(Collectors.toList());
  222. for (MaterialTaskAppendix materialTaskAppendix : materialTask.getMaterialTaskAppendixList()) {
  223. //如果不等于空则修改
  224. if (materialTaskAppendix.getId() != null) {
  225. appendixMapper.updateById(materialTaskAppendix);
  226. }
  227. //如果等于空 则新增
  228. else {
  229. //已经不存在的id 删除
  230. materialTaskAppendix.setMaterialTaskId(materialTask.getId());
  231. appendixMapper.insert(materialTaskAppendix);
  232. }
  233. }
  234. //已经不存在的id 删除
  235. if (materialTaskAppendixRemoveIds.size() > 0) {
  236. appendixMapper.deleteBatchIds(materialTaskAppendixRemoveIds);
  237. }
  238. }
  239. //********************************* MaterialTaskAppendix 增删改 结束 *******************************************/
  240. return true;
  241. }
  242. @Override
  243. @Transactional(rollbackFor = Exception.class)
  244. public Boolean delete(List<Long> ids) {
  245. materialTaskMaterialTaskMapper.deleteBatchIds(ids);
  246. materialTaskMaterialTaskAssignMapper.delete(Wrappers.lambdaQuery(MaterialTaskAssign.class).in(MaterialTaskAssign::getMaterialTaskId, ids));
  247. appendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).in(MaterialTaskAppendix::getMaterialTaskId, ids));
  248. return true;
  249. }
  250. @Override
  251. @Transactional(rollbackFor = Exception.class)
  252. public Boolean submited(MaterialTaskAssignAppendixDto materialTaskAssignAppendixDto) {
  253. if(materialTaskAssignAppendixDto.getMaterialCategory().equals(MaterialCategoryEnum.MT0001.getCode())){
  254. if (materialTaskAssignAppendixDto.getMaterialTaskAppendixList() != null && materialTaskAssignAppendixDto.getMaterialTaskAppendixList().size() > 0) {
  255. MaterialTaskAssign materialTaskAssign = materialTaskMaterialTaskAssignMapper.selectByIdDeep(materialTaskAssignAppendixDto.getMaterialTaskAssignId());
  256. Integer oldStatus = materialTaskAssign.getStatus();
  257. materialTaskAssign.setStatus(2);
  258. if (oldStatus == 1) {
  259. MaterialTask materialTask = materialTaskMaterialTaskMapper.selectByIdDeep(materialTaskAssign.getMaterialTaskId());
  260. LocalDate requiredCompleteTime = materialTask.getRequiredCompleteTime();
  261. LocalDate today = LocalDate.now();
  262. int comparison = today.compareTo(requiredCompleteTime);
  263. if (comparison > 0) {//超时提交
  264. materialTaskAssign.setExecutiveStatus(3);
  265. materialTask.setTimeDelay(materialTask.getTimeDelay() + 1);
  266. } else {//准时提交(包含当天)
  267. materialTaskAssign.setExecutiveStatus(2);
  268. materialTask.setOnTimePerson(materialTask.getOnTimePerson() + 1);
  269. }
  270. materialTask.setSubmitedPerson(materialTask.getSubmitedPerson() + 1);
  271. materialTaskMaterialTaskMapper.updateById(materialTask);
  272. }
  273. materialTaskMaterialTaskAssignMapper.updateById(materialTaskAssign);
  274. if (oldStatus == 4) { // 重做删除原来的
  275. appendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignAppendixDto.getMaterialTaskAssignId()));
  276. }
  277. for (AddMaterialTaskAppendixDto materialTaskAppendixDto : materialTaskAssignAppendixDto.getMaterialTaskAppendixList()) {
  278. MaterialTaskAppendix materialTaskAppendix = new MaterialTaskAppendix();
  279. materialTaskAppendix.setMaterialTaskId(materialTaskAssignAppendixDto.getMaterialTaskAssignId());
  280. materialTaskAppendix.setFileId(materialTaskAppendixDto.getFileId());
  281. appendixMapper.insert(materialTaskAppendix);
  282. }
  283. }
  284. }
  285. if(materialTaskAssignAppendixDto.getMaterialCategory().equals(MaterialCategoryEnum.MT0002.getCode())){
  286. if (materialTaskAssignAppendixDto.getTemplateId() != null && !materialTaskAssignAppendixDto.getFormData().isEmpty()) {
  287. MaterialTaskAssign materialTaskAssign = materialTaskMaterialTaskAssignMapper.selectByIdDeep(materialTaskAssignAppendixDto.getMaterialTaskAssignId());
  288. Integer oldStatus = materialTaskAssign.getStatus();
  289. materialTaskAssign.setStatus(2);
  290. //状态 1=未提交 2=待审核 3=通过 4=重做
  291. if (oldStatus == 1) {
  292. MaterialTask materialTask = materialTaskMaterialTaskMapper.selectByIdDeep(materialTaskAssign.getMaterialTaskId());
  293. LocalDate requiredCompleteTime = materialTask.getRequiredCompleteTime();
  294. LocalDate today = LocalDate.now();
  295. int comparison = today.compareTo(requiredCompleteTime);
  296. if (comparison > 0) {//超时提交
  297. materialTaskAssign.setExecutiveStatus(3);
  298. materialTask.setTimeDelay(materialTask.getTimeDelay() + 1);
  299. } else {//准时提交(包含当天)
  300. materialTaskAssign.setExecutiveStatus(2);
  301. materialTask.setOnTimePerson(materialTask.getOnTimePerson() + 1);
  302. }
  303. materialTask.setSubmitedPerson(materialTask.getSubmitedPerson() + 1);
  304. materialTaskMaterialTaskMapper.updateById(materialTask);
  305. }
  306. materialTaskMaterialTaskAssignMapper.updateById(materialTaskAssign);
  307. if (oldStatus == 4) { // 重做删除原来的
  308. appendixMapper.delete(Wrappers.lambdaQuery(MaterialTaskAppendix.class).eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignAppendixDto.getMaterialTaskAssignId()));
  309. }
  310. long id = formExecuteService.addByTemplateId(new FormExecuteAddOrUpdateDto(){{
  311. setReleaseId(materialTaskAssignAppendixDto.getTemplateId());
  312. setFormData(materialTaskAssignAppendixDto.getFormData());
  313. }});
  314. MaterialTaskAppendix materialTaskAppendix = new MaterialTaskAppendix();
  315. materialTaskAppendix.setMaterialTaskId(materialTaskAssignAppendixDto.getMaterialTaskAssignId());
  316. materialTaskAppendix.setFileId(id);
  317. appendixMapper.insert(materialTaskAppendix);
  318. }
  319. }
  320. return true;
  321. }
  322. @Override
  323. public MaterialTaskVo getInfoById(Long id) {
  324. MPJLambdaWrapper<MaterialTask> queryWrapper = new MPJLambdaWrapper<>();
  325. queryWrapper
  326. .orderByDesc(MaterialTask::getId)
  327. .eq(MaterialTask::getId, id)
  328. .select(MaterialTask::getId)
  329. .selectAs(MaterialType::getName, MaterialTaskVo::getMaterialTypeIdCn)
  330. .selectAs(MaterialType::getCreateDate, MaterialTaskVo::getCreateDate)
  331. .selectAs(DictionaryDetail::getName, MaterialTaskVo::getMaterialCategoryCn)
  332. .select(MaterialTask.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskVo.class).contains(x.getProperty()))
  333. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, MaterialTask::getMaterialCategory)
  334. .leftJoin(MaterialType.class, MaterialType::getId, MaterialTask::getMaterialTypeId);
  335. MaterialTaskVo materialTaskVo = this.selectJoinOne(MaterialTaskVo.class, queryWrapper);
  336. if (materialTaskVo == null) {
  337. return materialTaskVo;
  338. }
  339. MaterialTypeVo materialTypeVo = materialTypeService.getInfoById(materialTaskVo.getMaterialTypeId());
  340. if(materialTypeVo == null){
  341. return materialTaskVo;
  342. }
  343. if(materialTaskVo.getMaterialCategory().equals(MaterialCategoryEnum.MT0001.getCode())){
  344. materialTaskVo.setFolderId(materialTypeVo.getFolderId());
  345. materialTaskVo.setFolderIdCn(materialTypeVo.getFolderIdCn());
  346. materialTaskVo.setFiles(materialTypeVo.getFiles());
  347. }
  348. if(materialTaskVo.getMaterialCategory().equals(MaterialCategoryEnum.MT0002.getCode())){
  349. materialTaskVo.setFormReleaseId(materialTypeVo.getFormReleaseId());
  350. materialTaskVo.setFormReleaseIdCn(materialTypeVo.getFormReleaseIdCn());
  351. }
  352. // MPJLambdaWrapper<MaterialTaskAssign> materialTaskAssignMPJLambdaWrapper = new MPJLambdaWrapper<>();
  353. // materialTaskAssignMPJLambdaWrapper
  354. // .orderByDesc(MaterialTaskAssign::getCreateDate)
  355. // .eq(MaterialTaskAssign::getMaterialTaskId, id)
  356. // .select(MaterialTask::getId)
  357. // .selectAs(MaterialType::getName, MaterialTaskVo::getMaterialTypeIdCn)
  358. // .selectAs(MaterialType::getCreateDate, MaterialTaskVo::getCreateDate)
  359. // .selectAs(DictionaryDetail::getName, MaterialTaskVo::getMaterialCategoryCn)
  360. // .select(MaterialTask.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskVo.class).contains(x.getProperty()))
  361. // .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, MaterialTask::getMaterialCategory)
  362. // .leftJoin(MaterialType.class, MaterialType::getId, MaterialTask::getMaterialTypeId);
  363. // MaterialTaskVo materialTaskVo = materialTaskMaterialTaskAssignMapper.selectJoinOne(MaterialTaskVo.class, queryWrapper);
  364. // List<MaterialTaskAppendixVo> newsAppendixVoList = materialTaskAppendixService.selectJoinList(MaterialTaskAppendixVo.class,
  365. // new MPJLambdaWrapper<MaterialTaskAppendix>().eq(MaterialTaskAppendix::getMaterialTaskId, id)
  366. // .select(MaterialTaskAppendix::getId)
  367. // .select(MaterialTaskAppendix.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAppendixVo.class).contains(x.getProperty()))
  368. // .leftJoin(File.class, File::getId, MaterialTaskAppendix::getFileId, ext -> ext.selectAs(File::getFileName, MaterialTaskAppendixVo::getFileName)
  369. // .selectAs(File::getFolderId, MaterialTaskAppendixVo::getFolderId)
  370. // .selectAs(File::getFileUrl, MaterialTaskAppendixVo::getFileUrl))
  371. // );
  372. //
  373. // if (newsAppendixVoList.size() > 0) {
  374. // materialTaskVo.setMaterialTaskAppendixList(newsAppendixVoList);
  375. // }
  376. return materialTaskVo;
  377. }
  378. @Override
  379. public MaterialTaskVo getInfoViewById(Long id) {
  380. MaterialTaskVo materialTaskVo = getInfoById(id);
  381. MPJLambdaWrapper<MaterialTaskAssign> materialTaskAssignMPJLambdaWrapper = new MPJLambdaWrapper<>();
  382. materialTaskAssignMPJLambdaWrapper
  383. .orderByDesc(MaterialTaskAssign::getCreateDate)
  384. .eq(MaterialTaskAssign::getMaterialTaskId, id)
  385. .eq(MaterialTaskAssign::getUserId, StpUtil.getLoginIdAsLong());
  386. MaterialTaskAssign materialTaskAssignVo = materialTaskMaterialTaskAssignMapper
  387. .selectOne(Wrappers.lambdaQuery(MaterialTaskAssign.class)
  388. .eq(MaterialTaskAssign::getMaterialTaskId, id)
  389. .eq(MaterialTaskAssign::getUserId, StpUtil.getLoginIdAsLong())
  390. );
  391. List<MaterialTaskAppendixVo> newsAppendixVoList = materialTaskAppendixService.selectJoinList(MaterialTaskAppendixVo.class,
  392. new MPJLambdaWrapper<MaterialTaskAppendix>()
  393. .eq(MaterialTaskAppendix::getMaterialTaskId, materialTaskAssignVo.getId())
  394. .select(MaterialTaskAppendix::getId)
  395. .select(MaterialTaskAppendix.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAppendixVo.class).contains(x.getProperty()))
  396. .leftJoin(File.class, File::getId, MaterialTaskAppendix::getFileId, ext -> ext.selectAs(File::getFileName, MaterialTaskAppendixVo::getFileName)
  397. .selectAs(File::getFolderId, MaterialTaskAppendixVo::getFolderId)
  398. .selectAs(File::getFileUrl, MaterialTaskAppendixVo::getFileUrl))
  399. );
  400. if (newsAppendixVoList.size() > 0) {
  401. materialTaskVo.setMaterialTaskAppendixList(newsAppendixVoList);
  402. }
  403. return materialTaskVo;
  404. }
  405. @Override
  406. public void sendMessage(Long materialTaskId) {
  407. MaterialTask materialTask = this.getById(materialTaskId);
  408. if(materialTask == null){
  409. return;
  410. }
  411. LambdaQueryWrapper<MaterialTaskAssign> materialTaskAssignLambdaQueryWrapper = new LambdaQueryWrapper<>();
  412. materialTaskAssignLambdaQueryWrapper
  413. .orderByDesc(MaterialTaskAssign::getCreateDate)
  414. .eq(MaterialTaskAssign::getMaterialTaskId, materialTaskId)
  415. .select(MaterialTaskAssign::getId)
  416. .select(MaterialTaskAssign.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAssign.class).contains(x.getProperty()));
  417. List<MaterialTaskAssign> materialTaskAssignList = materialTaskMaterialTaskAssignMapper.selectList(materialTaskAssignLambdaQueryWrapper);
  418. if(!materialTaskAssignList.isEmpty()){
  419. materialTask.setMaterialTaskAssignList(materialTaskAssignList);
  420. }
  421. CompletableFuture.runAsync(() -> {
  422. this.sendMessageUtil(materialTask);
  423. });
  424. }
  425. @Override
  426. public List<MaterialTaskAssignListVo> assignList(MaterialTaskAssignListDto dto) {
  427. MPJLambdaWrapper<MaterialTaskAssign> queryWrapper = new MPJLambdaWrapper<>();
  428. queryWrapper
  429. .select(MaterialTaskAssign::getMaterialTaskId)
  430. .select(MaterialTaskAssign.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAssign.class).contains(x.getProperty()))
  431. .selectAs(XjrUser::getName, MaterialTaskAssignListVo::getName)
  432. .selectAs(XjrUser::getUserName, MaterialTaskAssignListVo::getUserName)
  433. .selectAs(XjrUser::getUserName, MaterialTaskAssignListVo::getUserNumber)
  434. .selectAs(Department::getName, MaterialTaskAssignListVo::getDeptName)
  435. .leftJoin(XjrUser.class, XjrUser::getId, MaterialTaskAssign::getUserId)
  436. .leftJoin(UserDeptRelation.class, UserDeptRelation::getUserId, MaterialTaskAssign::getUserId)
  437. .leftJoin(Department.class, Department::getId, UserDeptRelation::getDeptId)
  438. .eq(MaterialTaskAssign::getMaterialTaskId, dto.getMaterialTaskId())
  439. ;
  440. List<MaterialTaskAssignListVo> pageOutput = materialTaskMaterialTaskAssignMapper.selectJoinList(MaterialTaskAssignListVo.class, queryWrapper);
  441. List<MaterialTaskAppendix> appendixList = appendixMapper.selectJoinList(MaterialTaskAppendix.class,
  442. new MPJLambdaWrapper<MaterialTaskAppendix>()
  443. .select(MaterialTaskAppendix::getMaterialTaskId)
  444. .select(MaterialTaskAppendix.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAppendix.class).contains(x.getProperty()))
  445. .innerJoin(MaterialTaskAssign.class, MaterialTaskAssign::getId, MaterialTaskAppendix::getMaterialTaskId)
  446. .eq(MaterialTaskAssign::getMaterialTaskId, dto.getMaterialTaskId())
  447. );
  448. Map<Long, List<MaterialTaskAppendix>> appendixFileMap = appendixList.stream().collect(Collectors.groupingBy(MaterialTaskAppendix::getMaterialTaskId));
  449. for (MaterialTaskAssignListVo el : pageOutput){
  450. materialTypeService.handleFileAndTemplate(el, el.getMaterialCategory());
  451. List<Long> fileIds = appendixFileMap.get(el.getId()).stream().map(MaterialTaskAppendix::getFileId).collect(Collectors.toList());
  452. List<File> fileList = fileService.list(Wrappers.<File>query().lambda().in(File::getFolderId, fileIds));
  453. el.setFiles(fileList);
  454. }
  455. return pageOutput;
  456. }
  457. @Override
  458. public ByteArrayOutputStream formDataExportQuery(FormDataExportQueryDto dto) {
  459. //自定义表单数据
  460. FormTemplate template = formTemplateMapper.selectById(dto.getTemplateId());
  461. String formJson = template.getFormJson();
  462. //自定义表单配置
  463. FormDesignConfig formDesignConfig = JSONUtil.toBean(formJson, FormDesignConfig.class);
  464. //表关系配置
  465. List<TableConfig> tableConfigs = formDesignConfig.getTableConfigs();
  466. //主表
  467. Optional<TableConfig> mainTable = tableConfigs.stream().filter(TableConfig::getIsMain).findFirst();
  468. if (mainTable.isPresent()) {
  469. TableConfig tableConfig = mainTable.get();
  470. String tableName = tableConfig.getTableName();
  471. Map<String, List<ComponentConfig>> formComponentListMap = GeneratorUtil.buildFormComponentList(formDesignConfig.getFormJson().getList());
  472. List<String> fieldsList = new ArrayList<>();
  473. for (ComponentConfig config : formComponentListMap.get(tableName)) {
  474. String type = config.getType();
  475. if (StrUtil.equalsIgnoreCase(type, ComponentTypeConstant.TIME_RANGE) || StrUtil.equalsIgnoreCase(type, ComponentTypeConstant.DATE_RANGE)) {
  476. fieldsList.add(config.getBindStartTime());
  477. fieldsList.add(config.getBindEndTime());
  478. } else {
  479. fieldsList.add(config.getBindField());
  480. }
  481. }
  482. //return getFormData(tableName, fieldsList, formDesignConfig, dto.getId());
  483. } else {
  484. throw new MyException("主表不存在");
  485. }
  486. return null;
  487. }
  488. @Override
  489. public byte[] downloadFile(MaterialTaskAssignListDto dto) {
  490. MPJLambdaWrapper<MaterialTaskAppendix> queryWrapper = new MPJLambdaWrapper<>();
  491. queryWrapper
  492. .disableSubLogicDel()
  493. .distinct()
  494. .select(MaterialTaskAppendix::getId)
  495. .select(MaterialTaskAppendix.class, x -> VoToColumnUtil.fieldsToColumns(MaterialTaskAppendix.class).contains(x.getProperty()))
  496. .innerJoin(MaterialTaskAssign.class, MaterialTaskAssign::getId, MaterialTaskAppendix::getMaterialTaskId)
  497. .eq(MaterialTaskAssign::getMaterialTaskId, dto.getMaterialTaskId())
  498. .eq(MaterialTaskAssign::getStatus, dto.getState())
  499. ;
  500. List<MaterialTaskAppendix> appendices = appendixMapper.selectJoinList(MaterialTaskAppendix.class, queryWrapper);
  501. if(appendices.isEmpty()){
  502. throw new MyException("未能查询到附件");
  503. }
  504. List<Long> userIds = appendices.stream().map(MaterialTaskAppendix::getCreateUserId).collect(Collectors.toList());
  505. List<User> userList = userService.listByIds(userIds);
  506. Map<Long, User> userMap = userList.stream().collect(Collectors.toMap(User::getId, x -> x));
  507. Map<String, byte[]> byteAryMap = new HashMap<>();
  508. MaterialTask task = this.getById(dto.getMaterialTaskId());
  509. int sortCode = 1;
  510. for (MaterialTaskAppendix appendix : appendices) {
  511. List<File> fileList = fileService.list(Wrappers.<File>query().lambda().eq(File::getId, appendix.getFileId()));
  512. User user = userMap.get(appendix.getCreateUserId());
  513. for (int i = 0; i < fileList.size(); i++) {
  514. try {
  515. URL url = new URL(fileList.get(i).getFileUrl());
  516. URLConnection conn = url.openConnection();
  517. InputStream in = conn.getInputStream();
  518. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  519. byte[] buffer = new byte[1024];
  520. int bytesRead;
  521. while ((bytesRead = in.read(buffer)) != -1) {
  522. outputStream.write(buffer, 0, bytesRead);
  523. }
  524. byte[] byteArray = outputStream.toByteArray();
  525. String fileName = sortCode + "-" + user.getName() + "-" + user.getUserName() + "-" + task.getName();
  526. if(fileList.size() > 1){
  527. fileName += "-" + (i + 1);
  528. }
  529. fileName += fileList.get(i).getFileType();
  530. byteAryMap.put(fileName, byteArray);
  531. in.close();
  532. outputStream.close();
  533. sortCode ++;
  534. } catch (IOException e) {
  535. throw new MyException("文件下载失败", e);
  536. }
  537. }
  538. }
  539. return FileZipUtil.byteAryMap2Zip(byteAryMap);
  540. }
  541. private void sendMessageUtil(MaterialTask materialTask ) {
  542. IUserService userService = SpringUtil.getBean(IUserService.class);
  543. RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);
  544. List<User> userList = redisUtil.get(GlobalConstant.USER_CACHE_KEY, new TypeReference<List<User>>() {
  545. });
  546. //如果缓存中不存在用户信息,就直接去数据库查询,并保存到缓存中去
  547. if (userList.size() == 0) {
  548. userList = userService.list();
  549. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  550. }
  551. if(materialTask.getCreateUserId() == null){
  552. return;
  553. }
  554. User createUser = userList.stream().filter(u -> materialTask.getCreateUserId().equals(u.getId())).findFirst().orElse(new User());
  555. for (MaterialTaskAssign materialTaskAssign : materialTask.getMaterialTaskAssignList()) {
  556. User materialTaskAssignUser = userList.stream().filter(u -> materialTaskAssign.getUserId().equals(u.getId())).findFirst().orElse(new User());
  557. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  558. weChatSendMessageDto.setUserId(materialTaskAssignUser.getOpenId());
  559. weChatSendMessageDto.setTemplateId("qmpXORPM1Cocqn503Qa4On6BJhR92UZ00eod2-6IcGo");
  560. //weChatSendMessageDto.setUrl(StrUtil.format("{}/pages/message/notice/detail?id={}", commonPropertiesConfig.getDomainApp(), id));
  561. weChatSendMessageDto.setMsgId(materialTask.getId().toString());
  562. JSONObject data = new JSONObject();
  563. JSONObject data1 = new JSONObject();
  564. data1.put("value", materialTask.getName());
  565. data.put("thing23", data1);
  566. JSONObject data2 = new JSONObject();
  567. data2.put("value", createUser.getName());
  568. data.put("thing29", data2);
  569. JSONObject data3 = new JSONObject();
  570. data3.put("value", materialTask.getRequiredCompleteTime());
  571. data.put("time17", data3);
  572. weChatSendMessageDto.setContent(data);
  573. weChatService.sendTemplateMessage(weChatSendMessageDto);
  574. };
  575. }
  576. }