WfMeetingApplyServiceImpl.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824
  1. package com.xjrsoft.module.oa.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.util.IdUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  8. import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
  9. import com.baomidou.mybatisplus.core.metadata.IPage;
  10. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  11. import com.github.yulichang.base.MPJBaseServiceImpl;
  12. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  13. import com.xjrsoft.common.enums.MeetingTypeEnum;
  14. import com.xjrsoft.common.page.ConventPage;
  15. import com.xjrsoft.common.page.PageOutput;
  16. import com.xjrsoft.common.utils.LocalDateTimeUtil;
  17. import com.xjrsoft.common.utils.VoToColumnUtil;
  18. import com.xjrsoft.module.base.entity.BaseOfficeBuild;
  19. import com.xjrsoft.module.ledger.vo.WorkflowRecordVo;
  20. import com.xjrsoft.module.oa.dto.*;
  21. import com.xjrsoft.module.oa.entity.*;
  22. import com.xjrsoft.module.oa.mapper.MeetingConfereeMapper;
  23. import com.xjrsoft.module.oa.mapper.MeetingConfereeOpinionMapper;
  24. import com.xjrsoft.module.oa.mapper.MeetingRoomMapper;
  25. import com.xjrsoft.module.oa.mapper.WfMeetingApplyMapper;
  26. import com.xjrsoft.module.oa.service.IWfMeetingApplyService;
  27. import com.xjrsoft.module.oa.vo.*;
  28. import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
  29. import com.xjrsoft.module.organization.entity.User;
  30. import com.xjrsoft.module.organization.service.IUserService;
  31. import com.xjrsoft.module.organization.service.IWeChatService;
  32. import com.xjrsoft.module.schedule.vo.TodayScheduleVo;
  33. import com.xjrsoft.module.system.entity.DictionaryDetail;
  34. import com.xjrsoft.module.system.entity.File;
  35. import com.xjrsoft.module.system.mapper.FileMapper;
  36. import com.xjrsoft.module.teacher.entity.XjrUser;
  37. import com.xjrsoft.module.workflow.entity.WorkflowExtra;
  38. import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
  39. import com.xjrsoft.module.workflow.entity.WorkflowRecord;
  40. import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
  41. import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
  42. import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
  43. import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
  44. import lombok.AllArgsConstructor;
  45. import org.apache.commons.collections.CollectionUtils;
  46. import org.apache.commons.lang3.ObjectUtils;
  47. import org.apache.commons.lang3.StringUtils;
  48. import org.camunda.bpm.engine.history.HistoricProcessInstance;
  49. import org.springframework.stereotype.Service;
  50. import org.springframework.transaction.annotation.Transactional;
  51. import java.time.LocalDate;
  52. import java.time.LocalDateTime;
  53. import java.time.LocalTime;
  54. import java.time.format.DateTimeFormatter;
  55. import java.util.*;
  56. import java.util.stream.Collectors;
  57. /**
  58. * @title: 物品申购
  59. * @Author dzx
  60. * @Date: 2024-02-19
  61. * @Version 1.0
  62. */
  63. @Service
  64. @AllArgsConstructor
  65. public class WfMeetingApplyServiceImpl extends MPJBaseServiceImpl<WfMeetingApplyMapper, WfMeetingApply> implements IWfMeetingApplyService {
  66. private final IUserService userService;
  67. private final IWeChatService weChatService;
  68. private final IWorkflowExtraService extraService;
  69. private final MeetingRoomMapper meetingRoomMapper;
  70. private final WorkflowFormRelationMapper workflowFormRelationMapper;
  71. private final MeetingConfereeMapper meetingConfereeMapper;
  72. private final MeetingConfereeOpinionMapper meetingConfereeOpinionMapper;
  73. private final WorkflowRecordMapper workflowRecordMapper;
  74. private final WorkflowExtraMapper workflowExtraMapper;
  75. private final FileMapper fileMapper;
  76. @Override
  77. public List<MeetingRoomListVo> listMeetingRoom(MeetingRoomListDto dto) {
  78. List<MeetingRoomListVo> usableResult = new ArrayList<>();
  79. if (ObjectUtils.isEmpty(dto.getMeetingApplyDate())
  80. || ObjectUtils.isEmpty(dto.getMeetingApplyS())
  81. || ObjectUtils.isEmpty(dto.getMeetingApplyE())
  82. ) {
  83. return usableResult;
  84. }
  85. // 处理时间
  86. LocalDate meetingApplyDate = LocalDate.parse(dto.getMeetingApplyDate());
  87. LocalTime startTime = LocalTime.parse(dto.getMeetingApplyS());
  88. LocalTime endTime = LocalTime.parse(dto.getMeetingApplyE());
  89. // 获取所有的教室
  90. MPJLambdaWrapper<MeetingRoom> meetingRoomMPJLambdaWrapper = new MPJLambdaWrapper<>();
  91. meetingRoomMPJLambdaWrapper
  92. .select(MeetingRoom::getId)
  93. .selectAs(MeetingRoom::getName, MeetingRoomListVo::getName)
  94. .selectAs(MeetingRoom::getFloorNum, MeetingRoomListVo::getFloorNum)
  95. .selectAs(MeetingRoom::getCapacity, MeetingRoomListVo::getCapacity)
  96. .selectAs(BaseOfficeBuild::getName, MeetingRoomListVo::getOfficeBuildIdCn)
  97. .leftJoin(BaseOfficeBuild.class, BaseOfficeBuild::getId, MeetingRoom::getOfficeBuildId)
  98. .like(StringUtils.isNotEmpty(dto.getName()), MeetingRoom::getName, dto.getName())
  99. .like(StringUtils.isNotEmpty(dto.getOfficeBuildIdCn()), BaseOfficeBuild::getName, dto.getOfficeBuildIdCn())
  100. .eq(MeetingRoom::getStatus, 1)
  101. ;
  102. List<MeetingRoomListVo> result = meetingRoomMapper.selectJoinList(MeetingRoomListVo.class, meetingRoomMPJLambdaWrapper);
  103. // 获取会议申请日期已经预约的会议
  104. List<WfMeetingApply> wfMeetingApplyList = this.list(Wrappers.lambdaQuery(WfMeetingApply.class)
  105. .eq(WfMeetingApply::getMeetingApplyDate, meetingApplyDate)
  106. .eq(WfMeetingApply::getMeetingApplyFormat, MeetingTypeEnum.HMT0002.getCode())// 线下会议
  107. .ne(WfMeetingApply::getMeetingStatus, 1)
  108. .ne(WfMeetingApply::getWorkflowStatus, 2)
  109. );
  110. // 根据会议室id分组
  111. Map<Long, List<WfMeetingApply>> mapByMeetingRoomId = wfMeetingApplyList.stream()
  112. .collect(Collectors.groupingBy(WfMeetingApply::getMeetingRoomId));
  113. // 处理已经预约的会议室
  114. Map<Long, MeetingRoomListVo> reservationMap = new LinkedHashMap<>();
  115. MeetingRoomListVo meetingRoomListVo;
  116. for (Map.Entry<Long, List<WfMeetingApply>> entry : mapByMeetingRoomId.entrySet()) {
  117. Long key = entry.getKey();
  118. List<WfMeetingApply> value = entry.getValue();
  119. StringBuilder reservationDetail = new StringBuilder();
  120. boolean isReservation = false;
  121. meetingRoomListVo = new MeetingRoomListVo();
  122. for (WfMeetingApply wfMeetingApply : value) {
  123. // 会议时间是否重叠
  124. if (startTime.isBefore(wfMeetingApply.getMeetingApplyE()) && wfMeetingApply.getMeetingApplyS().isBefore(endTime)) {
  125. isReservation = true;
  126. }
  127. reservationDetail.append(wfMeetingApply.getMeetingApplyS()).append("-").append(wfMeetingApply.getMeetingApplyE()).append("\r\n");
  128. }
  129. meetingRoomListVo.setReservationDetail(reservationDetail.toString());
  130. meetingRoomListVo.setStatus(isReservation ? 1 : 0);
  131. reservationMap.put(key, meetingRoomListVo);
  132. }
  133. for (MeetingRoomListVo vo : result) {
  134. vo.setStatus(0);
  135. MeetingRoomListVo reservationRoom = reservationMap.get(vo.getId());
  136. if (ObjectUtils.isEmpty(reservationRoom)) {
  137. usableResult.add(vo);
  138. }
  139. if (ObjectUtils.isNotEmpty(reservationRoom) && reservationRoom.getStatus() == 0) {
  140. usableResult.add(vo);
  141. }
  142. }
  143. // 根据可用排序
  144. usableResult.sort(Comparator.comparing(MeetingRoomListVo::getName));
  145. return usableResult;
  146. }
  147. @Override
  148. public IPage<WfMeetingApplyPageVo> pageRabAndHand(WfMeetingApplyPageDto dto) {
  149. // 权限设置
  150. Long loginId = StpUtil.getLoginIdAsLong();
  151. int permission = 1;
  152. if (StpUtil.hasRole("Conference") || StpUtil.hasRole("ADMIN")) {
  153. permission = 2;
  154. }
  155. // 当前时间
  156. LocalDate nowLocalDate = LocalDate.now();
  157. LocalTime nowLocalTime = LocalTime.now();
  158. MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
  159. wfMeetingApplyPageVoMPJLambdaWrapper
  160. .disableSubLogicDel()
  161. .select(WfMeetingApply::getId)
  162. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(WfMeetingApplyPageVo.class).contains(x.getProperty()))
  163. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
  164. wrapper -> wrapper
  165. .selectAs(DictionaryDetail::getName, WfMeetingApplyPageVo::getMeetingApplyFormatCn)
  166. )
  167. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
  168. wrapper -> wrapper
  169. .selectAs(MeetingRoom::getName, WfMeetingApplyPageVo::getMeetingRoomIdCn)
  170. )
  171. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getMeetingApplyHost,
  172. wrapper -> wrapper
  173. .selectAs(XjrUser::getName, WfMeetingApplyPageVo::getMeetingApplyHostCn)
  174. .like(StringUtils.isNotEmpty(dto.getMeetingApplyHostCn()), XjrUser::getName, dto.getMeetingApplyHostCn())
  175. )
  176. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId,
  177. wrapper -> wrapper
  178. .selectAs(XjrUser::getName, WfMeetingApplyPageVo::getSponsorIdCn)
  179. )
  180. .eq(permission == 1, WfMeetingApply::getSponsorId, loginId)
  181. .eq(WfMeetingApply::getWorkflowStatus, 1)
  182. .ge(ObjectUtils.isNotEmpty(dto.getStartMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getStartMeetingApplyDate())
  183. .le(ObjectUtils.isNotEmpty(dto.getEndMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getEndMeetingApplyDate())
  184. .eq(StringUtils.isNotEmpty(dto.getMeetingApplyFormat()), WfMeetingApply::getMeetingApplyFormat, dto.getMeetingApplyFormat())
  185. .like(StringUtils.isNotEmpty(dto.getMeetingApplyTheme()), WfMeetingApply::getMeetingApplyTheme, dto.getMeetingApplyTheme())
  186. .orderByDesc(WfMeetingApply::getMeetingApplyDate)
  187. .orderByAsc(WfMeetingApply::getMeetingApplyS)
  188. ;
  189. if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 0) {
  190. wfMeetingApplyPageVoMPJLambdaWrapper
  191. .ge(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
  192. .gt(WfMeetingApply::getMeetingApplyS, nowLocalTime)
  193. .ne(WfMeetingApply::getMeetingStatus, 1)
  194. ;
  195. }
  196. if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 1) {
  197. wfMeetingApplyPageVoMPJLambdaWrapper
  198. .eq(WfMeetingApply::getMeetingStatus, 1)
  199. ;
  200. }
  201. if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 2) {
  202. wfMeetingApplyPageVoMPJLambdaWrapper
  203. .le(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
  204. .lt(WfMeetingApply::getMeetingApplyE, nowLocalTime)
  205. .ne(WfMeetingApply::getMeetingStatus, 1)
  206. ;
  207. }
  208. if (ObjectUtils.isNotEmpty(dto.getMeetingStatus()) && dto.getMeetingStatus() == 3) {
  209. wfMeetingApplyPageVoMPJLambdaWrapper
  210. .eq(WfMeetingApply::getMeetingApplyDate, nowLocalDate)
  211. .le(WfMeetingApply::getMeetingApplyS, nowLocalTime)
  212. .ge(WfMeetingApply::getMeetingApplyE, nowLocalTime)
  213. .ne(WfMeetingApply::getMeetingStatus, 1)
  214. ;
  215. }
  216. IPage<WfMeetingApplyPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), WfMeetingApplyPageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
  217. // 判断会议状态
  218. for (WfMeetingApplyPageVo vo : page.getRecords()) {
  219. if (vo.getMeetingStatus() != 1) {
  220. if (vo.getMeetingApplyDate().isBefore(nowLocalDate)) {
  221. vo.setMeetingStatus(2);
  222. } else if (vo.getMeetingApplyDate().isAfter(nowLocalDate)) {
  223. vo.setMeetingStatus(0);
  224. } else {
  225. if (vo.getMeetingApplyE().isBefore(nowLocalTime)) {
  226. vo.setMeetingStatus(2);
  227. } else if (vo.getMeetingApplyS().isAfter(nowLocalTime)) {
  228. vo.setMeetingStatus(0);
  229. } else {
  230. vo.setMeetingStatus(3);
  231. }
  232. }
  233. }
  234. }
  235. return page;
  236. }
  237. @Override
  238. public IPage<TodayMeetingMobilePageVo> todayMeetingMobilePage(TodayMeetingMobilePageDto dto) {
  239. LocalTime nowLocalTime = LocalTime.now();
  240. if(ObjectUtils.isEmpty(dto.getMeetingApplyDate())){
  241. dto.setMeetingApplyDate(LocalDate.now());
  242. }
  243. Long loginId = StpUtil.getLoginIdAsLong();
  244. MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
  245. wfMeetingApplyPageVoMPJLambdaWrapper
  246. .disableSubLogicDel()
  247. .select(WfMeetingApply::getId)
  248. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(TodayMeetingMobilePageVo.class).contains(x.getProperty()))
  249. .innerJoin(MeetingConferee.class, MeetingConferee::getWfMeetingApplyId, WfMeetingApply::getId,
  250. wrapper -> wrapper
  251. .selectAs(MeetingConferee::getCheckInStatus, TodayMeetingMobilePageVo::getCheckInStatus)
  252. )
  253. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
  254. wrapper -> wrapper
  255. .selectAs(DictionaryDetail::getName, TodayMeetingMobilePageVo::getMeetingApplyFormatCn)
  256. )
  257. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
  258. wrapper -> wrapper
  259. .selectAs(MeetingRoom::getName, TodayMeetingMobilePageVo::getMeetingRoomIdCn)
  260. )
  261. .eq(WfMeetingApply::getMeetingApplyDate, dto.getMeetingApplyDate())
  262. .eq(MeetingConferee::getUserId, loginId)
  263. .eq(WfMeetingApply::getWorkflowStatus, 1)
  264. .orderByAsc(WfMeetingApply::getMeetingApplyS)
  265. ;
  266. IPage<TodayMeetingMobilePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), TodayMeetingMobilePageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
  267. List<TodayMeetingMobilePageVo> record = page.getRecords();
  268. Map<String, LocalTime> startTimeMap = record.stream().collect(Collectors.toMap(TodayMeetingMobilePageVo::getId, TodayMeetingMobilePageVo::getMeetingApplyS));
  269. Map<String, LocalTime> endTimeMap = record.stream().collect(Collectors.toMap(TodayMeetingMobilePageVo::getId, TodayMeetingMobilePageVo::getMeetingApplyE));
  270. for (TodayMeetingMobilePageVo vo : record) {
  271. int adjustType = 1;
  272. LocalTime oneStartTime = vo.getMeetingApplyS();
  273. LocalTime oneEndTime = vo.getMeetingApplyE();
  274. for (String id : startTimeMap.keySet()) {
  275. if(vo.getId().equals(id)){
  276. continue;
  277. }
  278. LocalTime startTime = startTimeMap.get(id);
  279. LocalTime endTime = endTimeMap.get(id);
  280. if (oneStartTime.isBefore(endTime) && oneEndTime.isAfter(startTime)) {
  281. adjustType = 0;
  282. }
  283. }
  284. vo.setConflictStatus(adjustType);
  285. }
  286. // 分割并重组列表
  287. List<TodayMeetingMobilePageVo> futureVo = new ArrayList<>(); // 当前时间之后的事件
  288. List<TodayMeetingMobilePageVo> pastVo = new ArrayList<>(); // 当前时间之前的事件
  289. // 处理状态
  290. for (TodayMeetingMobilePageVo vo : record){
  291. if (vo.getMeetingStatus() != 1) {
  292. if (vo.getMeetingApplyE().isBefore(nowLocalTime)) {
  293. if(vo.getCheckInStatus() == 0){
  294. vo.setMeetingStatus(4);
  295. }
  296. if(vo.getCheckInStatus() == 1){
  297. vo.setMeetingStatus(2);
  298. }
  299. } else if (vo.getMeetingApplyS().isAfter(nowLocalTime)) {
  300. vo.setMeetingStatus(0);
  301. } else {
  302. vo.setMeetingStatus(3);
  303. }
  304. }
  305. if (vo.getMeetingApplyS().isBefore(nowLocalTime)) {
  306. pastVo.add(vo); // 过去的事件
  307. } else {
  308. futureVo.add(vo); // 未来的事件
  309. }
  310. }
  311. List<TodayMeetingMobilePageVo> result = new ArrayList<>();
  312. result.addAll(futureVo);
  313. result.addAll(pastVo);
  314. page.setRecords(result);
  315. return page;
  316. }
  317. @Override
  318. public IPage<SponsorMeetingMobilePageVo> sponsorMeetingMobilePage(SponsorMeetingMobilePageDto dto) {
  319. Long loginId = StpUtil.getLoginIdAsLong();
  320. // 当前时间
  321. LocalDate nowLocalDate = LocalDate.now();
  322. LocalTime nowLocalTime = LocalTime.now();
  323. MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
  324. wfMeetingApplyPageVoMPJLambdaWrapper
  325. .disableSubLogicDel()
  326. .select(WfMeetingApply::getId)
  327. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(SponsorMeetingMobilePageVo.class).contains(x.getProperty()))
  328. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
  329. wrapper -> wrapper
  330. .selectAs(DictionaryDetail::getName, SponsorMeetingMobilePageVo::getMeetingApplyFormatCn)
  331. )
  332. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
  333. wrapper -> wrapper
  334. .selectAs(MeetingRoom::getName, SponsorMeetingMobilePageVo::getMeetingRoomIdCn)
  335. )
  336. .eq(WfMeetingApply::getSponsorId, loginId)
  337. .ge(ObjectUtils.isNotEmpty(dto.getStartMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getStartMeetingApplyDate())
  338. .le(ObjectUtils.isNotEmpty(dto.getEndMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getEndMeetingApplyDate())
  339. .eq(WfMeetingApply::getWorkflowStatus, 1)
  340. .orderByAsc("meeting_apply_date", "meeting_apply_s")
  341. ;
  342. IPage<SponsorMeetingMobilePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), SponsorMeetingMobilePageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
  343. // 判断会议状态
  344. for (SponsorMeetingMobilePageVo vo : page.getRecords()) {
  345. if (vo.getMeetingStatus() != 1) {
  346. if (vo.getMeetingApplyDate().isBefore(nowLocalDate)) {
  347. vo.setMeetingStatus(2);
  348. } else if (vo.getMeetingApplyDate().isAfter(nowLocalDate)) {
  349. vo.setMeetingStatus(0);
  350. } else {
  351. if (vo.getMeetingApplyE().isBefore(nowLocalTime)) {
  352. vo.setMeetingStatus(2);
  353. } else if (vo.getMeetingApplyS().isAfter(nowLocalTime)) {
  354. vo.setMeetingStatus(0);
  355. } else {
  356. vo.setMeetingStatus(3);
  357. }
  358. }
  359. }
  360. }
  361. return page;
  362. }
  363. @Override
  364. public IPage<HistoryMeetingMobilePageVo> historyMeetingMobilePage(HistoryMeetingMobilePageDto dto) {
  365. Long loginId = StpUtil.getLoginIdAsLong();
  366. if(ObjectUtils.isEmpty(dto.getEndMeetingApplyDate())){
  367. dto.setEndMeetingApplyDate(LocalDate.now().minusDays(1));
  368. }
  369. MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
  370. wfMeetingApplyPageVoMPJLambdaWrapper
  371. .disableSubLogicDel()
  372. .select(WfMeetingApply::getId)
  373. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(HistoryMeetingMobilePageVo.class).contains(x.getProperty()))
  374. .innerJoin(MeetingConferee.class, MeetingConferee::getWfMeetingApplyId, WfMeetingApply::getId)
  375. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
  376. wrapper -> wrapper
  377. .selectAs(DictionaryDetail::getName, HistoryMeetingMobilePageVo::getMeetingApplyFormatCn)
  378. )
  379. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
  380. wrapper -> wrapper
  381. .selectAs(MeetingRoom::getName, HistoryMeetingMobilePageVo::getMeetingRoomIdCn)
  382. )
  383. .eq(MeetingConferee::getUserId, loginId)
  384. .ge(ObjectUtils.isNotEmpty(dto.getStartMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getStartMeetingApplyDate())
  385. .le(ObjectUtils.isNotEmpty(dto.getEndMeetingApplyDate()), WfMeetingApply::getMeetingApplyDate, dto.getEndMeetingApplyDate())
  386. .eq(WfMeetingApply::getWorkflowStatus, 1)
  387. .orderByAsc("meeting_apply_date", "meeting_apply_s")
  388. ;
  389. return this.selectJoinListPage(ConventPage.getPage(dto), HistoryMeetingMobilePageVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
  390. }
  391. @Override
  392. public MeetingMobileInfoVo mobileInfo(Long id) {
  393. Long loginId = StpUtil.getLoginIdAsLong();
  394. MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
  395. wfMeetingApplyPageVoMPJLambdaWrapper
  396. .disableSubLogicDel()
  397. .select(WfMeetingApply::getId)
  398. .select(" (SELECT GROUP_CONCAT(a.name) FROM xjr_user a" +
  399. " LEFT JOIN meeting_conferee b ON b.user_id = a.id" +
  400. " WHERE b.delete_mark = 0 AND b.wf_meeting_apply_id = t.id) as meetingApplyParticipantsCn")
  401. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(MeetingMobileInfoVo.class).contains(x.getProperty()))
  402. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
  403. wrapper -> wrapper
  404. .selectAs(DictionaryDetail::getName, MeetingMobileInfoVo::getMeetingApplyFormatCn)
  405. )
  406. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
  407. wrapper -> wrapper
  408. .selectAs(MeetingRoom::getName, MeetingMobileInfoVo::getMeetingRoomIdCn)
  409. )
  410. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getMeetingApplyHost,
  411. wrapper -> wrapper
  412. .selectAs(XjrUser::getName, MeetingMobileInfoVo::getMeetingApplyHostCn)
  413. )
  414. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId,
  415. wrapper -> wrapper
  416. .selectAs(XjrUser::getName, MeetingMobileInfoVo::getSponsorIdCn)
  417. )
  418. .eq(WfMeetingApply::getId, id)
  419. ;
  420. MeetingMobileInfoVo info = this.selectJoinOne(MeetingMobileInfoVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
  421. if (ObjectUtils.isNotEmpty(info)) {
  422. // 判断当前用户是否是当前会议的参与人
  423. LambdaQueryWrapper<MeetingConferee> isMeetingConferee = new LambdaQueryWrapper<>();
  424. isMeetingConferee
  425. .eq(MeetingConferee::getWfMeetingApplyId, id)
  426. .eq(MeetingConferee::getUserId, loginId)
  427. ;
  428. List<MeetingConferee> meetingConfereeList = meetingConfereeMapper.selectList(isMeetingConferee);
  429. // 既不是发起人也不是参与人
  430. if(CollectionUtils.isEmpty(meetingConfereeList) && !info.getSponsorId().equals(loginId)){
  431. return new MeetingMobileInfoVo();
  432. }
  433. List<File> fileList = fileMapper.selectList(Wrappers.<File>query().lambda().eq(File::getFolderId, info.getPreMeetingInfoFileId()));
  434. info.setFileInfos(fileList);
  435. // 如果是会议参会人员,应该处理签到状态
  436. LambdaQueryWrapper<MeetingConferee> meetingConfereeLambdaQueryWrapper = new LambdaQueryWrapper<>();
  437. meetingConfereeLambdaQueryWrapper
  438. .eq(MeetingConferee::getUserId, StpUtil.getLoginIdAsLong())
  439. .eq(MeetingConferee::getWfMeetingApplyId, id)
  440. ;
  441. MeetingConferee meetingConferee = meetingConfereeMapper.selectOne(meetingConfereeLambdaQueryWrapper);
  442. if(ObjectUtils.isNotEmpty(meetingConferee)){
  443. info.setCheckInStatus(meetingConferee.getCheckInStatus());
  444. }
  445. // 处理状态
  446. LocalTime nowLocalTime = LocalTime.now();
  447. LocalDate nowLocalDate = LocalDate.now();
  448. if (info.getMeetingStatus() != 1) {
  449. if (info.getMeetingApplyDate().isBefore(nowLocalDate)) {
  450. info.setMeetingStatus(2);
  451. } else if (info.getMeetingApplyDate().isAfter(nowLocalDate)) {
  452. info.setMeetingStatus(0);
  453. } else {
  454. if (info.getMeetingApplyE().isBefore(nowLocalTime)) {
  455. info.setMeetingStatus(2);
  456. } else if (info.getMeetingApplyS().isAfter(nowLocalTime)) {
  457. info.setMeetingStatus(0);
  458. } else {
  459. info.setMeetingStatus(3);
  460. }
  461. }
  462. }
  463. }
  464. return info;
  465. }
  466. @Override
  467. public WfMeetingApplyInWorkflowVo infoInWorkflow(Long id) {
  468. MPJLambdaWrapper<WfMeetingApply> wfMeetingApplyPageVoMPJLambdaWrapper = new MPJLambdaWrapper<>();
  469. wfMeetingApplyPageVoMPJLambdaWrapper
  470. .disableSubLogicDel()
  471. .select(WfMeetingApply::getId)
  472. .select(" (SELECT GROUP_CONCAT(a.name) FROM xjr_user a" +
  473. " LEFT JOIN meeting_conferee b ON b.user_id = a.id" +
  474. " WHERE b.delete_mark = 0 AND b.wf_meeting_apply_id = t.id) as meetingApplyParticipantsCn")
  475. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(WfMeetingApplyInWorkflowVo.class).contains(x.getProperty()))
  476. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfMeetingApply::getMeetingApplyFormat,
  477. wrapper -> wrapper
  478. .selectAs(DictionaryDetail::getName, WfMeetingApplyInWorkflowVo::getMeetingApplyFormatCn)
  479. )
  480. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId,
  481. wrapper -> wrapper
  482. .selectAs(MeetingRoom::getName, WfMeetingApplyInWorkflowVo::getMeetingRoomIdCn)
  483. )
  484. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getMeetingApplyHost,
  485. wrapper -> wrapper
  486. .selectAs(XjrUser::getName, WfMeetingApplyInWorkflowVo::getMeetingApplyHostCn)
  487. )
  488. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId,
  489. wrapper -> wrapper
  490. .selectAs(XjrUser::getName, WfMeetingApplyInWorkflowVo::getSponsorIdCn)
  491. )
  492. .eq(WfMeetingApply::getId, id)
  493. ;
  494. WfMeetingApplyInWorkflowVo info = this.selectJoinOne(WfMeetingApplyInWorkflowVo.class, wfMeetingApplyPageVoMPJLambdaWrapper);
  495. if (ObjectUtils.isNotEmpty(info)) {
  496. List<File> fileList = fileMapper.selectList(Wrappers.<File>query().lambda().eq(File::getFolderId, info.getPreMeetingInfoFileId()));
  497. info.setFileInfos(fileList);
  498. List<WorkflowRecord> recordList = workflowRecordMapper.selectList(
  499. new MPJLambdaWrapper<WorkflowRecord>()
  500. .select(WorkflowRecord.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowRecordVo.class).contains(x.getProperty()))
  501. .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getProcessId, WorkflowRecord::getProcessId)
  502. .eq(WorkflowFormRelation::getFormKeyValue, id)
  503. );
  504. info.setWorkflowRecordList(BeanUtil.copyToList(recordList, WorkflowRecordVo.class));
  505. List<WorkflowFormRelation> relations = workflowFormRelationMapper.selectList(new QueryWrapper<WorkflowFormRelation>().lambda().eq(WorkflowFormRelation::getFormKeyValue, id.toString()));
  506. if (!relations.isEmpty()) {
  507. info.setProcessId(relations.get(0).getProcessId());
  508. }
  509. //查询最后一个节点的taskId
  510. List<WorkflowExtra> taskList = workflowExtraMapper.selectList(
  511. new QueryWrapper<WorkflowExtra>().lambda()
  512. .eq(WorkflowExtra::getProcessId, info.getProcessId())
  513. .orderByDesc(WorkflowExtra::getStartTime)
  514. );
  515. if (!taskList.isEmpty()) {
  516. info.setTaskId(taskList.get(0).getTaskId());
  517. }
  518. }
  519. return info;
  520. }
  521. @Override
  522. public List<MeetingConfereeListVo> listMeetingConferee(MeetingConfereeListDto dto) {
  523. MPJLambdaWrapper<MeetingConferee> meetingConfereeMPJLambdaWrapper = new MPJLambdaWrapper<>();
  524. meetingConfereeMPJLambdaWrapper
  525. .disableSubLogicDel()
  526. .select(MeetingConferee::getId)
  527. .select(MeetingConferee.class, x -> VoToColumnUtil.fieldsToColumns(MeetingConfereeListVo.class).contains(x.getProperty()))
  528. .leftJoin(XjrUser.class, XjrUser::getId, MeetingConferee::getUserId,
  529. wrapper -> wrapper
  530. .selectAs(XjrUser::getName, MeetingConfereeListVo::getUserIdCn)
  531. .selectAs(XjrUser::getUserName, MeetingConfereeListVo::getUserName)
  532. )
  533. .eq(MeetingConferee::getWfMeetingApplyId, dto.getWfMeetingApplyId())
  534. ;
  535. return meetingConfereeMapper.selectJoinList(MeetingConfereeListVo.class, meetingConfereeMPJLambdaWrapper);
  536. }
  537. @Override
  538. public List<MeetingConfereeOpinionListVo> listMeetingConfereeOpinion(MeetingConfereeOpinionListDto dto) {
  539. MPJLambdaWrapper<MeetingConfereeOpinion> meetingConfereeOpinionMPJLambdaWrapper = new MPJLambdaWrapper<>();
  540. meetingConfereeOpinionMPJLambdaWrapper
  541. .disableSubLogicDel()
  542. .select(MeetingConfereeOpinion::getId)
  543. .select(MeetingConfereeOpinion.class, x -> VoToColumnUtil.fieldsToColumns(MeetingConfereeOpinionListVo.class).contains(x.getProperty()))
  544. .leftJoin(XjrUser.class, XjrUser::getId, MeetingConfereeOpinion::getUserId,
  545. wrapper -> wrapper
  546. .selectAs(XjrUser::getName, MeetingConfereeOpinionListVo::getUserIdCn)
  547. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, XjrUser::getGender,
  548. wrap -> wrap
  549. .selectAs(DictionaryDetail::getName, MeetingConfereeOpinionListVo::getGenderCn)
  550. )
  551. )
  552. .eq(MeetingConfereeOpinion::getWfMeetingApplyId, dto.getWfMeetingApplyId())
  553. ;
  554. return meetingConfereeOpinionMapper.selectJoinList(MeetingConfereeOpinionListVo.class, meetingConfereeOpinionMPJLambdaWrapper);
  555. }
  556. @Override
  557. @Transactional(rollbackFor = Exception.class)
  558. public void noticeParticipants(Long id) {
  559. MPJLambdaWrapper<WfMeetingApply> wrapper = new MPJLambdaWrapper<>();
  560. wrapper
  561. .disableSubLogicDel()
  562. .select(WfMeetingApply::getId)
  563. .selectAs(MeetingRoom::getName, WfMeetingApply::getMeetingSummary) // 将会议室的名称暂时放在会议纪要字段中
  564. .selectAs(XjrUser::getName, WfMeetingApply::getMonogramTheme) // 将会议发起人名称暂时放在会标主题字段中
  565. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
  566. .leftJoin(MeetingRoom.class, MeetingRoom::getId, WfMeetingApply::getMeetingRoomId)
  567. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId)
  568. .eq(WfMeetingApply::getId, id)
  569. ;
  570. WfMeetingApply meetingApply = this.selectJoinOne(WfMeetingApply.class, wrapper);
  571. // 根据数据id找到所在流程得状态
  572. WorkflowFormRelation workflowFormRelation = workflowFormRelationMapper.selectOne(
  573. Wrappers.lambdaQuery(WorkflowFormRelation.class)
  574. .eq(WorkflowFormRelation::getFormKeyValue, id)
  575. );
  576. if (ObjectUtils.isNotEmpty(meetingApply)
  577. && ObjectUtils.isNotEmpty(workflowFormRelation)
  578. && HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
  579. ) {
  580. // 修改会议申请流程状态为正常通过结束
  581. WfMeetingApply updateWorkflowStatus = new WfMeetingApply();
  582. updateWorkflowStatus.setId(meetingApply.getId());
  583. updateWorkflowStatus.setWorkflowStatus(1);
  584. this.updateById(updateWorkflowStatus);
  585. if (meetingApply.getMeetingApplyParticipants() == null || meetingApply.getMeetingApplyParticipants().isEmpty()) {
  586. return;
  587. }
  588. List<String> userIds = Arrays.asList(meetingApply.getMeetingApplyParticipants().split(","));
  589. // 处理会议时间
  590. List<User> userList = userService.list(new QueryWrapper<User>().lambda().in(User::getId, userIds));
  591. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  592. LocalDateTime startLocalDateTime = LocalDateTime.of(meetingApply.getMeetingApplyDate(), meetingApply.getMeetingApplyS());
  593. LocalDateTime endLocalDateTime = LocalDateTime.of(meetingApply.getMeetingApplyDate(), meetingApply.getMeetingApplyE());
  594. String startTime = startLocalDateTime.format(formatter);
  595. String endTime = endLocalDateTime.format(formatter);
  596. // 获取申请人
  597. // List<WorkflowExtra> list = extraService.list(
  598. // new MPJLambdaWrapper<WorkflowExtra>()
  599. // .select(WorkflowExtra.class, x -> VoToColumnUtil.fieldsToColumns(WorkflowExtra.class).contains(x.getProperty()))
  600. // .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getProcessId, WorkflowExtra::getProcessId)
  601. // .eq(WorkflowFormRelation::getFormId, id)
  602. // .orderByAsc(WorkflowExtra::getStartTime)
  603. // );
  604. // String startUserName = list.get(0).getStartUserName();
  605. MeetingConferee meetingConferee;
  606. // 添加参会人员到参会人员表
  607. for (User user : userList) {
  608. meetingConferee = new MeetingConferee();
  609. meetingConferee.setWfMeetingApplyId(id);
  610. meetingConferee.setUserId(user.getId());
  611. meetingConferee.setCheckInStatus(0);
  612. meetingConfereeMapper.insert(meetingConferee);
  613. }
  614. // 发送微信通知,和添加到记录分开是预防添加出现异常只通知一部人。
  615. for (User user : userList) {
  616. if (ObjectUtils.isNotEmpty(user.getOpenId())) {
  617. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  618. weChatSendMessageDto.setUserId(user.getOpenId());
  619. weChatSendMessageDto.setTemplateId("Hign0b3e4WSXe__YmBKyDsBgAjkfNYC7c6yIUHjk3Hg");
  620. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  621. JSONObject paramJson = new JSONObject();
  622. JSONObject thing2 = new JSONObject();
  623. thing2.put("value", meetingApply.getMeetingApplyTheme());
  624. paramJson.put("thing2", thing2);
  625. JSONObject time5 = new JSONObject();
  626. time5.put("value", startTime);
  627. paramJson.put("time5", time5);
  628. JSONObject time6 = new JSONObject();
  629. time6.put("value", endTime);
  630. paramJson.put("time6", time6);
  631. JSONObject thing7 = new JSONObject();
  632. thing7.put("value", meetingApply.getMeetingSummary());
  633. paramJson.put("thing7", thing7);
  634. JSONObject thing8 = new JSONObject();
  635. thing8.put("value", meetingApply.getMonogramTheme());
  636. paramJson.put("thing8", thing8);
  637. weChatSendMessageDto.setContent(paramJson);
  638. weChatService.sendTemplateMessage(weChatSendMessageDto);
  639. }
  640. }
  641. }
  642. if (ObjectUtils.isNotEmpty(meetingApply)
  643. && ObjectUtils.isNotEmpty(workflowFormRelation)
  644. && !HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
  645. && !HistoricProcessInstance.STATE_ACTIVE.equals(workflowFormRelation.getCurrentState())
  646. ) {
  647. // 修改会议申请流程状态为不正常的结束
  648. WfMeetingApply updateWorkflowStatus = new WfMeetingApply();
  649. updateWorkflowStatus.setId(meetingApply.getId());
  650. updateWorkflowStatus.setWorkflowStatus(2);
  651. this.updateById(updateWorkflowStatus);
  652. }
  653. }
  654. @Override
  655. @Transactional(rollbackFor = Exception.class)
  656. public Boolean updateRevocationMeeting(UpdateRevocationMeetingDto dto) {
  657. MPJLambdaWrapper<WfMeetingApply> wrapper = new MPJLambdaWrapper<>();
  658. wrapper
  659. .disableSubLogicDel()
  660. .select(WfMeetingApply::getId)
  661. .selectAs(XjrUser::getName, WfMeetingApply::getMonogramTheme) // 将会议发起人名称暂时放在会标主题字段中
  662. .select(WfMeetingApply.class, x -> VoToColumnUtil.fieldsToColumns(WfMeetingApply.class).contains(x.getProperty()))
  663. .leftJoin(XjrUser.class, XjrUser::getId, WfMeetingApply::getSponsorId)
  664. .eq(WfMeetingApply::getId, dto.getId())
  665. ;
  666. WfMeetingApply oldWfMeetingApply = this.selectJoinOne(WfMeetingApply.class, wrapper);
  667. WfMeetingApply updateWfMeetingApply = new WfMeetingApply();
  668. updateWfMeetingApply.setId(dto.getId());
  669. updateWfMeetingApply.setMeetingStatus(1);
  670. this.updateById(updateWfMeetingApply);
  671. if (StringUtils.isNotEmpty(oldWfMeetingApply.getMeetingApplyParticipants())) {
  672. List<String> userIds = Arrays.asList(oldWfMeetingApply.getMeetingApplyParticipants().split(","));
  673. List<User> userList = userService.list(new QueryWrapper<User>().lambda().in(User::getId, userIds).isNotNull(User::getOpenId));
  674. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  675. LocalDateTime startLocalDateTime = LocalDateTime.of(oldWfMeetingApply.getMeetingApplyDate(), oldWfMeetingApply.getMeetingApplyS());
  676. String startTime = startLocalDateTime.format(formatter);
  677. // 发送消息通知
  678. for (User user : userList) {
  679. WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
  680. weChatSendMessageDto.setUserId(user.getOpenId());
  681. weChatSendMessageDto.setTemplateId("sZcnORXfcQZf8zy5K16N3dsPgQomyQALqUeEzYvTwxo");
  682. weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
  683. JSONObject paramJson = new JSONObject();
  684. JSONObject thing1 = new JSONObject();
  685. thing1.put("value", oldWfMeetingApply.getMeetingApplyTheme());
  686. paramJson.put("thing1", thing1);
  687. JSONObject time6 = new JSONObject();
  688. time6.put("value", startTime);
  689. paramJson.put("time6", time6);
  690. JSONObject thing8 = new JSONObject();
  691. thing8.put("value", oldWfMeetingApply.getMonogramTheme());
  692. paramJson.put("thing8", thing8);
  693. weChatSendMessageDto.setContent(paramJson);
  694. weChatService.sendTemplateMessage(weChatSendMessageDto);
  695. }
  696. }
  697. return true;
  698. }
  699. @Override
  700. @Transactional(rollbackFor = Exception.class)
  701. public Boolean updateMeetingCheckIn(UpdateMeetingCheckInDto dto) {
  702. Long loginId = StpUtil.getLoginIdAsLong();
  703. LambdaUpdateWrapper<MeetingConferee> meetingConfereeLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
  704. meetingConfereeLambdaUpdateWrapper
  705. .eq(MeetingConferee::getWfMeetingApplyId, dto.getId())
  706. .eq(MeetingConferee::getUserId, loginId)
  707. ;
  708. MeetingConferee meetingConferee = new MeetingConferee();
  709. meetingConferee.setCheckInStatus(1);
  710. meetingConferee.setCheckInDate(new Date());
  711. meetingConferee.setModifyDate(new Date());
  712. meetingConferee.setModifyUserId(loginId);
  713. meetingConfereeMapper.update(meetingConferee, meetingConfereeLambdaUpdateWrapper);
  714. return true;
  715. }
  716. @Override
  717. @Transactional(rollbackFor = Exception.class)
  718. public Boolean addMeetingConfereeOpinion(AddMeetingConfereeOpinionDto dto) {
  719. MeetingConfereeOpinion insert = new MeetingConfereeOpinion();
  720. insert.setWfMeetingApplyId(dto.getWfMeetingApplyId());
  721. insert.setUserId(StpUtil.getLoginIdAsLong());
  722. insert.setOpinion(dto.getOpinion());
  723. insert.setCreateDate(new Date());
  724. insert.setCreateUserId(StpUtil.getLoginIdAsLong());
  725. meetingConfereeOpinionMapper.insert(insert);
  726. return true;
  727. }
  728. }