KnowledgeApproveServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. package com.redxun.knowledge.service;
  2. import cn.hutool.core.date.DatePattern;
  3. import cn.hutool.core.date.DateUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.metadata.IPage;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.github.xiaoymin.knife4j.spring.configuration.Knife4jHttpBasic;
  9. import com.redxun.common.base.db.BaseDao;
  10. import com.redxun.common.base.db.BaseService;
  11. import com.redxun.common.base.db.PageHelper;
  12. import com.redxun.common.base.search.QueryFilter;
  13. import com.redxun.common.model.JPaasUser;
  14. import com.redxun.common.service.impl.SuperServiceImpl;
  15. import com.redxun.common.tool.DateUtils;
  16. import com.redxun.common.tool.StringUtils;
  17. import com.redxun.common.utils.ContextUtil;
  18. import com.redxun.dto.user.OsUserDto;
  19. import com.redxun.knowledge.common.MessageService;
  20. import com.redxun.knowledge.common.UserService;
  21. import com.redxun.knowledge.entity.dao.Knowledge;
  22. import com.redxun.knowledge.entity.dao.KnowledgeApprove;
  23. import com.redxun.knowledge.entity.dto.KnowledgeApproveDto;
  24. import com.redxun.knowledge.entity.dto.OrganizationDto;
  25. import com.redxun.knowledge.entity.vo.KnowledgeApprovalListVo;
  26. import com.redxun.knowledge.entity.vo.KnowledgeCategoryAdminVo;
  27. import com.redxun.knowledge.mapper.KnowledgeApproveMapper;
  28. import com.redxun.knowledge.mapper.KnowledgeMapper;
  29. import com.redxun.knowledge.qywexin.QYWechatUtils;
  30. import com.redxun.knowledge.utils.ObjectUtil;
  31. import com.redxun.knowledge.utils.PageListUtils;
  32. import com.redxun.search.service.SearchService;
  33. import com.redxun.search.utils.FileInputStreamUtils;
  34. import com.redxun.search.utils.MD5;
  35. import lombok.extern.slf4j.Slf4j;
  36. import org.springframework.beans.BeanUtils;
  37. import org.springframework.beans.factory.annotation.Autowired;
  38. import org.springframework.beans.factory.annotation.Value;
  39. import org.springframework.scheduling.annotation.Async;
  40. import org.springframework.stereotype.Service;
  41. import org.springframework.transaction.annotation.Transactional;
  42. import javax.annotation.Resource;
  43. import java.util.*;
  44. import java.util.stream.Collectors;
  45. /**
  46. * [业务--知识审批表]业务服务类
  47. */
  48. @Service
  49. @Slf4j
  50. public class KnowledgeApproveServiceImpl extends SuperServiceImpl<KnowledgeApproveMapper, KnowledgeApprove> implements BaseService<KnowledgeApprove> {
  51. @Value("${file.documentUrl}")
  52. private String documentUrl;
  53. @Value("${file.downloadUrl}")
  54. private String downloadUrl;
  55. @Value("${uploaderHead.male}")
  56. private String uploaderHeadMale;
  57. @Value("${uploaderHead.female}")
  58. private String uploaderHeadFemale;
  59. @Value("${qywx.approvePage}")
  60. private String qywxApprovePage;
  61. @Resource
  62. private KnowledgeApproveMapper knowledgeApproveMapper;
  63. @Autowired
  64. private KnowledgeCategoryServiceImpl knowledgeCategoryService;
  65. @Autowired
  66. private KnowledgeMapper knowledgeMapper;
  67. @Autowired
  68. private MessageService messageService;
  69. @Autowired
  70. private UserService userService;
  71. @Autowired
  72. private SearchService searchService;
  73. @Autowired
  74. private KnowledgeAgentServiceImpl knowledgeAgentService;
  75. @Override
  76. public BaseDao<KnowledgeApprove> getRepository() {
  77. return knowledgeApproveMapper;
  78. }
  79. /**
  80. * 审核管理列表(分页查询)
  81. *
  82. * @param filter
  83. * @return
  84. */
  85. public IPage findAllKnowledgeApprove(QueryFilter filter) {
  86. Map<String, Object> params = PageHelper.constructParams(filter);
  87. //查询出全部记录
  88. List<KnowledgeApprovalListVo> allKnowledgeApprove = knowledgeApproveMapper.findAllKnowledgeApprove(filter.getParams(), params);
  89. //数据处理
  90. String userNo = userService.queryLoginUsername();
  91. List<KnowledgeApprovalListVo> collectList = this.allApproveList(allKnowledgeApprove);
  92. //查询知识管理员
  93. List<String> knowledgeManager = knowledgeApproveMapper.findKnowledgeManager();
  94. String user = userService.queryLoginUser();
  95. //如果是知识管理员,展示全部 不是 查看自己能审核的记录
  96. if(!knowledgeManager.contains(user) && !"admin".equals(userNo)){
  97. //只查看当前登陆人能审核的记录(isAudit=0)
  98. collectList = collectList.stream().filter(e -> e.getIsAudit() == 0 && (e.getApprovalStatus() == 1 || e.getApprovalStatus() == 3)).collect(Collectors.toList());
  99. log.info("能审核的数量 -> {}",collectList.size());
  100. }
  101. //如果是admin,全部能审核
  102. if ("admin".equals(userNo)){
  103. collectList.forEach(e -> e.setIsAudit(0));
  104. }
  105. //数据分页
  106. Page pages = PageListUtils.getPages(filter.getPage().getCurrent(), filter.getPage().getSize(), collectList);
  107. List<KnowledgeApprovalListVo> collect = pages.getRecords();
  108. //组织架构信息解析
  109. collect.forEach(e -> {
  110. String categoryId = e.getCategoryId();
  111. KnowledgeCategoryAdminVo knowledgeCategoryAdminVo = knowledgeCategoryService.findAllParentByCategoryId(categoryId);
  112. e.setKnowledgeCategoryAdminVo(knowledgeCategoryAdminVo);
  113. if (StringUtils.isNotEmpty(e.getOrganizationId())){
  114. OrganizationDto organizationDto = JSON.parseObject(e.getOrganizationId(), OrganizationDto.class);
  115. e.setOrganizationIds(organizationDto);
  116. }
  117. //处理默认节点有两个领导的情况(默认节点默认在第一位,sort=1)
  118. String[] split = e.getApproverId().split(",");
  119. if (split.length > 1){
  120. String approverNameTager = Arrays.stream(split).map(h -> userService.queryByUsername(h).getFullName()).collect(Collectors.joining(","));
  121. e.setApproverName(approverNameTager);
  122. }
  123. // 判断是否有代理人,有,approverName赋值代理人
  124. if (hasTager(e)){
  125. e.setApproverName(userService.queryByUsername(e.getApproverId()).getFullName());
  126. }
  127. });
  128. return pages;
  129. }
  130. /**
  131. * 未分页前全部审核记录
  132. * @param allKnowledgeApprove
  133. * @return
  134. */
  135. public List<KnowledgeApprovalListVo> allApproveList(List<KnowledgeApprovalListVo> allKnowledgeApprove){
  136. // 根据知识Id进行数据分组
  137. Map<String, List<KnowledgeApprovalListVo>> result =
  138. allKnowledgeApprove.stream().collect(Collectors.groupingBy(KnowledgeApprovalListVo::getKnowledgerId));
  139. // 结果集
  140. List<KnowledgeApprovalListVo> knowledgeApprovalListVoList = new ArrayList<>();
  141. // 遍历每组的数据
  142. Set<Map.Entry<String, List<KnowledgeApprovalListVo>>> entries = result.entrySet();
  143. for (Map.Entry<String, List<KnowledgeApprovalListVo>> entry : entries) {
  144. List<KnowledgeApprovalListVo> value = entry.getValue();
  145. for (int i = 0; i < value.size(); i++) {
  146. // 如果是最终审核通过,直接放入记录
  147. // && value.get(i).getIsFinal() == 1
  148. if (value.get(i).getApprovalStatus() == 5) {
  149. knowledgeApprovalListVoList.add(value.get(i));
  150. break;
  151. }
  152. // 判断审批结果是否为null(如果审批结果没有null,证明审批已结束;如果等于0,证明审批没通过)
  153. if (value.get(i).getResult() == null || value.get(i).getResult() == 0) {
  154. if (i != 0) {
  155. // 如果不是第一条数据,取前一条数据的审批时间
  156. Date approvalTime = value.get(i - 1).getApprovalTime();
  157. value.get(i).setApprovalTime(approvalTime);
  158. }
  159. // 把该记录加到结果集中
  160. knowledgeApprovalListVoList.add(value.get(i));
  161. break;
  162. }
  163. }
  164. }
  165. //按照时间排序
  166. List<KnowledgeApprovalListVo> collectList = knowledgeApprovalListVoList.stream().
  167. sorted((t1, t2) -> t2.getCreateTime().compareTo(t1.getCreateTime())).collect(Collectors.toList());
  168. //数据处理
  169. String userNo = userService.queryLoginUsername();
  170. String userId = userService.queryLoginUser();
  171. List<String> deptAuthority = knowledgeApproveMapper.deptAuthority(userId); //部门权限字符串
  172. collectList.forEach(e -> {
  173. String[] split = e.getApproverId().split(",");
  174. //处理默认节点有两个领导的情况(默认节点默认在第一位,sort=1)
  175. if (split.length > 1){
  176. String approverIdTager = knowledgeAgentService.hasLeaderMore(split);
  177. e.setApproverId(approverIdTager);
  178. }
  179. // 判断是否有代理人,有, approverId赋值代理人
  180. if (hasTager(e)){
  181. e.setApproverId(e.getTagerNo());
  182. }
  183. // 判断当前登录人是否可以审核每一条知识
  184. boolean flag = false;
  185. for (int i = 0; i < deptAuthority.size(); i++) {
  186. if (deptAuthority.get(i).contains(e.getApproverId())) {
  187. flag = true;
  188. break;
  189. }
  190. }
  191. List<String> approverIdList = Arrays.asList(e.getApproverId().split(","));
  192. // 如果有权限
  193. if (!approverIdList.contains(userNo) && !flag) {
  194. // 不是该部门的人,不能审核
  195. e.setIsAudit(1);
  196. } else {
  197. e.setIsAudit(0);
  198. }
  199. });
  200. return collectList;
  201. }
  202. /**
  203. * 判断是否有代理人且生效中(审核列表使用)
  204. * @param knowledgeApprovalListVo
  205. * @return
  206. */
  207. private boolean hasTager(KnowledgeApprovalListVo knowledgeApprovalListVo){
  208. if (StringUtils.isNotEmpty(knowledgeApprovalListVo.getTagerNo())){
  209. Calendar date = Calendar.getInstance();
  210. date.setTime(new Date());
  211. Calendar begin = Calendar.getInstance();
  212. begin.setTime(knowledgeApprovalListVo.getStartTime());
  213. Calendar end = Calendar.getInstance();
  214. end.setTime(knowledgeApprovalListVo.getEndTime());
  215. return date.after(begin) && date.before(end);
  216. } else {
  217. return false;
  218. }
  219. }
  220. /**
  221. * 知识审核
  222. *
  223. * @param entity
  224. * @return
  225. */
  226. @Transactional(rollbackFor = Exception.class)
  227. @Override
  228. public int update(KnowledgeApprove entity) {
  229. String userNo = userService.queryLoginUsername();
  230. String userId = userService.queryLoginUser();
  231. // 如果审批结论为null,置位空字符串
  232. if (StringUtils.isEmpty(entity.getRemark())) {
  233. entity.setRemark("");
  234. }
  235. // 当前记录
  236. KnowledgeApprove knowledgeApprove = knowledgeApproveMapper.selectByIdAndSort(entity.getPkId(), null,null);
  237. //把最初的审核人记录下来
  238. String startApproverId = knowledgeApprove.getApproverId();
  239. // 判断是否重复审核
  240. if (knowledgeApprove.getResult() != null) {
  241. return -1;
  242. }
  243. //判断是否有代理人 有 approverId赋值为代理人id
  244. String[] split = knowledgeApprove.getApproverId().split(",");
  245. //处理默认节点有两个领导的情况(默认节点默认在第一位,sort=1)
  246. if (split.length > 1){
  247. String approverIdTager = knowledgeAgentService.hasLeaderMore(split);
  248. knowledgeApprove.setApproverId(approverIdTager);
  249. //当前登陆人不在里面,一定为代理人
  250. if (!startApproverId.contains(userNo)){
  251. entity.setActualApproverName(userService.queryLoginFullName() + "(代" + knowledgeApprove.getApproverName() + ")");
  252. }
  253. }
  254. boolean hasTager = knowledgeAgentService.hasTager(knowledgeApprove);
  255. if (hasTager){
  256. knowledgeApprove.setApproverId(knowledgeApprove.getTagerNo());
  257. //有代理人,实际审核人赋值特殊处理
  258. entity.setActualApproverName(userService.queryByUsername(knowledgeApprove.getApproverId()).getFullName() + "(代"
  259. + knowledgeApprove.getApproverName() + ")");
  260. }
  261. // 判断组织架构(权限)是否变更
  262. //部门权限字符串
  263. List<String> deptAuthority = knowledgeApproveMapper.deptAuthority(userId);
  264. boolean flag = false;
  265. for (int i = 0; i < deptAuthority.size(); i++) {
  266. if (deptAuthority.get(i).contains(knowledgeApprove.getApproverId())) {
  267. flag = true;
  268. break;
  269. }
  270. }
  271. List<String> approverIdList = Arrays.asList(knowledgeApprove.getApproverId().split(","));
  272. if (!approverIdList.contains(userNo) && !flag && !"admin".equals(userNo)) {
  273. // 不是该部门的人,不能审核
  274. return -2;
  275. }
  276. // 查询当前记录的下一条记录(发站内信)
  277. KnowledgeApprove knowledgeApproveNext = knowledgeApproveMapper.selectByIdAndSort(null, knowledgeApprove.getKnowledgerId(), knowledgeApprove.getSort() + 1);
  278. // 如果审核节点不是终审节点且知识未通过,修改知识状态为节点驳回 2
  279. if (knowledgeApprove.getIsFinal() != 1 && entity.getResult() == 0) {
  280. Knowledge knowledge = new Knowledge();
  281. knowledge.setPkId(knowledgeApprove.getKnowledgerId());
  282. knowledge.setApprovalStatus(2);
  283. knowledgeMapper.updateById(knowledge);
  284. //给知识创建人发送站内信和企业微信消息
  285. Knowledge knowledgeEnd = knowledgeMapper.selectById(knowledgeApprove.getKnowledgerId());
  286. String createBy = knowledgeEnd.getCreateBy();
  287. sendMessage(createBy, knowledgeEnd.getTitles(), entity.getRemark(), false);
  288. }
  289. // 如果审核节点是终审节点且知识未通过,修改知识状态为最终驳回 4
  290. if (knowledgeApprove.getIsFinal() == 1 && entity.getResult() == 0) {
  291. Knowledge knowledge = new Knowledge();
  292. knowledge.setPkId(knowledgeApprove.getKnowledgerId());
  293. knowledge.setApprovalStatus(4);
  294. knowledgeMapper.updateById(knowledge);
  295. //给知识创建人发送站内信和企业微信消息
  296. Knowledge knowledgeEnd = knowledgeMapper.selectById(knowledgeApprove.getKnowledgerId());
  297. String createBy = knowledgeEnd.getCreateBy();
  298. sendMessage(createBy, knowledgeEnd.getTitles(), entity.getRemark(), false);
  299. }
  300. // 如果审核节点是终审节点且知识通过,修改知识状态为最终通过 5
  301. if ((knowledgeApprove.getIsFinal() == 1 || knowledgeApproveNext == null) && entity.getResult() == 1) {
  302. Knowledge knowledge = new Knowledge();
  303. knowledge.setPkId(knowledgeApprove.getKnowledgerId());
  304. knowledge.setApprovalStatus(5);
  305. knowledgeMapper.updateById(knowledge);
  306. //给知识创建人发送站内信和企业微信消息
  307. Knowledge knowledgeEnd = knowledgeMapper.selectById(knowledgeApprove.getKnowledgerId());
  308. String createBy = knowledgeEnd.getCreateBy();
  309. sendMessage(createBy, knowledgeEnd.getTitles(), entity.getRemark(), true);
  310. //把该知识附件信息传入搜索平台
  311. Knowledge knowledges = knowledgeMapper.selectById(knowledgeApprove.getKnowledgerId());
  312. // 获取知识上传人头像
  313. String uploaderHead = null;
  314. Map<String, Object> map = userService.querySexAndPhoto(knowledges.getCreateBy());
  315. if (map.get("photo") == null) {
  316. if (map.get("sex").equals("male")) {
  317. uploaderHead = uploaderHeadMale;
  318. } else {
  319. uploaderHead = uploaderHeadFemale;
  320. }
  321. } else {
  322. uploaderHead = downloadUrl + map.get("photo");
  323. }
  324. // 判断是否有附件文件
  325. if (knowledges.getAttachment() != null) {
  326. // 有文件,截取文件名后缀
  327. String attachmentName = knowledges.getAttachmentName();
  328. String[] strArray = attachmentName.split("\\.");
  329. int suffixIndex = strArray.length - 1;
  330. String titles = knowledges.getTitles();
  331. // 拼接新文件名(知识标题 + 文件名后缀)
  332. String newFileName = titles + "." + strArray[suffixIndex];
  333. // 文件加密
  334. String fileStream = FileInputStreamUtils.getInputStreamString(downloadUrl + knowledges.getAttachment());
  335. String fileMD5 = MD5.encrypt(fileStream);
  336. searchService.notice(knowledges.getPkId(), knowledges.getDocumentId(), knowledges.getTitles(), knowledges.getAttachmentName(), knowledges.getAttachmentName(),
  337. documentUrl + knowledges.getPkId(), downloadUrl + knowledges.getAttachment(), fileMD5,
  338. knowledges.getAuthor(),
  339. knowledges.getCreateBy(), uploaderHead, knowledges.getSummary(), 1);
  340. } else {
  341. // 没有文件,直接传入知识标题
  342. String titles = knowledges.getTitles();
  343. searchService.notice(knowledges.getPkId(), knowledges.getDocumentId(), knowledges.getTitles(), titles, "",
  344. documentUrl + knowledges.getPkId(), "", "",
  345. knowledges.getAuthor(),
  346. knowledges.getCreateBy(), uploaderHead, knowledges.getSummary(), 1);
  347. }
  348. }
  349. // 如果当前节点的下个节点为终审节点通过且当前节点审核通过,修改状态为待最终审核
  350. if (knowledgeApproveNext != null && knowledgeApproveNext.getIsFinal() == 1 && entity.getResult() == 1) {
  351. Knowledge knowledge = new Knowledge();
  352. knowledge.setPkId(knowledgeApprove.getKnowledgerId());
  353. knowledge.setApprovalStatus(3);
  354. knowledgeMapper.updateById(knowledge);
  355. }
  356. // 如果审核通过了,发送短信通知下一个人审核
  357. if (knowledgeApproveNext != null && entity.getResult() == 1) {
  358. // 根据工号查询用户id(有代理人用代理人的)
  359. if (knowledgeAgentService.hasTager(knowledgeApproveNext)){
  360. knowledgeApproveNext.setApproverId(knowledgeApproveNext.getTagerNo());
  361. }
  362. String approverId = knowledgeApproveNext.getApproverId();
  363. JPaasUser jPaasUser = userService.queryByUsername(approverId);
  364. if (jPaasUser != null) {
  365. Knowledge knowledge = knowledgeMapper.selectById(knowledgeApprove.getKnowledgerId());
  366. sendMessage(jPaasUser.getUserId(), knowledge.getTitles(), knowledge.getCreateBy(), knowledge.getCreateTime());
  367. }
  368. }
  369. // 修改该知识的组织架构信息
  370. Knowledge knowledge = knowledgeMapper.selectById(knowledgeApprove.getKnowledgerId());
  371. knowledge.setPkId(knowledge.getPkId());
  372. if (StringUtils.isNotEmpty(entity.getOrganizationId())){
  373. knowledge.setOrganizationId(entity.getOrganizationId());
  374. }
  375. knowledgeMapper.updateById(knowledge);
  376. //权限判断完成,把approverId变更回来
  377. knowledgeApprove.setApproverId(startApproverId);
  378. return this.getRepository().updateById(entity);
  379. }
  380. /**
  381. * 给知识创建人发送站内信和企业微信消息(知识被驳回时,或者最终节点审核通过时)(flag为true,知识通过;为false,知识不通过)
  382. *
  383. * @param createBy,remark,flag
  384. */
  385. private void sendMessage(String createBy, String titles, String remark, Boolean flag) {
  386. String[] qyUser = new String[]{createBy};
  387. List<OsUserDto> osUserDtoList = new ArrayList<>();
  388. //查询用户信息
  389. OsUserDto osUserDto = userService.queryOsUserDto(createBy);
  390. osUserDtoList.add(osUserDto);
  391. // 知识通过
  392. if (flag) {
  393. QYWechatUtils.send(qyUser,"您提交的申请已经通过审批!" + "<br>" +
  394. "提交内容:" + titles + "<br>" + "审批时间:" + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));
  395. messageService.sendInnerMsg("您提交的申请已经通过审批!",
  396. "提交内容:" + titles + "<br>" +
  397. "审批时间:" + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN), osUserDtoList);
  398. } else {
  399. // 知识不通过
  400. QYWechatUtils.send(qyUser,"您提交的申请已被驳回!" + "<br>" +
  401. "提交内容:" + titles + "<br>" + "审批时间:" + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN));
  402. messageService.sendInnerMsg("您提交的申请已被驳回!",
  403. "提交内容:" + titles + "<br>" +
  404. "驳回原因:" + remark + "<br>" +
  405. "审核人:" + ContextUtil.getCurrentUser().getFullName() + "<br>" +
  406. "审批时间:" + DateUtil.format(new Date(), DatePattern.NORM_DATETIME_PATTERN), osUserDtoList);
  407. }
  408. }
  409. /**
  410. * 给下一节点审核人发消息(不包含部门)(给审批地址)
  411. *
  412. * @param
  413. */
  414. public void sendMessage(String sender, String titles, String userId, Date date) {
  415. String[] qyUser = new String[]{sender};
  416. List<OsUserDto> osUserDtoList = new ArrayList<>();
  417. //查询用户信息
  418. OsUserDto osUserDto = userService.queryOsUserDto(sender);
  419. osUserDtoList.add(osUserDto);
  420. // 发消息通过前来审核
  421. QYWechatUtils.send(qyUser,"您有一条待审核任务,请尽快完成审核!" + "<br>" +
  422. "审核类型:知识审核" + "<br>" +
  423. "提交内容:" + titles + "<br>" +
  424. "提交人:" + userService.queryUser(userId).getFullName() + "<br>" +
  425. "提交时间:" + DateUtil.format(date, DatePattern.NORM_DATETIME_PATTERN)+ "<br>" +
  426. "审批地址:" + "<a href=" + qywxApprovePage + ">查看</a>");
  427. messageService.sendInnerMsg("您有一条待审核任务,请尽快完成审核!", "审核类型:知识审核" + "<br>" +
  428. "提交内容:" + titles + "<br>" +
  429. "提交人:" + userService.queryUser(userId).getFullName() + "<br>" +
  430. "提交时间:" + DateUtil.format(date, DatePattern.NORM_DATETIME_PATTERN) + "<br>" +
  431. "审批地址:" + "<a href=" + qywxApprovePage + ">查看</a>", osUserDtoList);
  432. }
  433. }