MaterialTaskServiceImpl.java 37 KB

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