PageRenderTime 62ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/com/wcs/tms/service/process/payproject/PayProjectService.java

https://github.com/YuanZhencai/tms
Java | 530 lines | 387 code | 23 blank | 120 comment | 47 complexity | 3f304a21f3c3401049116ae7b96e8e47 MD5 | raw file
  1. package com.wcs.tms.service.process.payproject;
  2. import java.io.Serializable;
  3. import java.text.DecimalFormat;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import javax.ejb.EJB;
  10. import javax.ejb.Stateless;
  11. import javax.faces.model.SelectItem;
  12. import javax.inject.Inject;
  13. import org.apache.commons.logging.Log;
  14. import org.apache.commons.logging.LogFactory;
  15. import com.wcs.base.service.EntityService;
  16. import com.wcs.base.service.LoginService;
  17. import com.wcs.base.util.DateUtil;
  18. import com.wcs.common.filenet.pe.PEManager;
  19. import com.wcs.common.model.P;
  20. import com.wcs.tms.mail.Mail;
  21. import com.wcs.tms.mail.MailService;
  22. import com.wcs.tms.mail.MailUtil;
  23. import com.wcs.tms.mail.SendMailService;
  24. import com.wcs.tms.conf.xml.ProcessXmlUtil;
  25. import com.wcs.tms.exception.ServiceException;
  26. import com.wcs.tms.message.ExceptionMessage;
  27. import com.wcs.tms.model.CompanyAccount;
  28. import com.wcs.tms.model.ProcPayProject;
  29. import com.wcs.tms.model.ProcPayProjectDetails;
  30. import com.wcs.tms.model.ProcTMSStatus;
  31. import com.wcs.tms.service.process.common.FtpUploadService;
  32. import com.wcs.tms.service.process.common.ProcessUtilMapService;
  33. import com.wcs.tms.service.process.common.TmsStatusService;
  34. import com.wcs.tms.service.system.bank.BankService;
  35. import com.wcs.tms.service.system.company.CompanyAccountServer;
  36. import com.wcs.tms.util.ProcessDefineUtil;
  37. import com.wcs.tms.view.process.common.entity.PaymentVo;
  38. import com.wcs.tms.view.process.common.entity.ProcessDetailVo;
  39. import filenet.vw.api.VWLogElement;
  40. import filenet.vw.api.VWWorkObjectNumber;
  41. /**
  42. * <p>Project: tms</p>
  43. * <p>Title: 付工程款股利及归还股东借款流程service</p>
  44. * <p>Description: </p>
  45. * <p>Copyright (c) 2012 Wilmar Consultancy Services</p>
  46. * <p>All Rights Reserved.</p>
  47. * @author <a href="mailto:liaowei@wcs-global.com">廖伟</a>
  48. */
  49. @Stateless
  50. public class PayProjectService implements Serializable {
  51. private static final long serialVersionUID = 1L;
  52. private static Log log = LogFactory.getLog(PayProjectService.class);
  53. @Inject
  54. PEManager peManager;
  55. @Inject
  56. LoginService loginService;
  57. @Inject
  58. EntityService entityService;
  59. @Inject
  60. MailService mailService;
  61. @Inject
  62. SendMailService sendMailService;
  63. @Inject
  64. CompanyAccountServer companyAccountServer;
  65. @Inject
  66. BankService bankService;
  67. // 9.11
  68. @Inject
  69. ProcessUtilMapService processUtilMapService;
  70. @Inject
  71. FtpUploadService ftpUploadService;
  72. @EJB
  73. private TmsStatusService tmsStatusService;
  74. List<CompanyAccount> ca = new ArrayList<CompanyAccount>();
  75. /**
  76. * 得到与公司有业务关系的银行
  77. * @param companyId
  78. * @return
  79. */
  80. public List<SelectItem> getCompanyBankSelect(Long companyId) {
  81. List<SelectItem> bankSelect = new ArrayList<SelectItem>();
  82. List<CompanyAccount> ca = this.getComanyBank(companyId);
  83. boolean iftrue = true;
  84. if (iftrue) {
  85. log.info("去重复银行");
  86. for (CompanyAccount c : ca) {
  87. // 去重复银行
  88. Boolean has = false;
  89. for (SelectItem si : bankSelect) {
  90. if (c.getAccountDesc().equals(si.getValue())) {
  91. has = true;
  92. }
  93. }
  94. if (!has) {
  95. bankSelect.add(new SelectItem(c.getAccountDesc(), c.getAccountDesc()));
  96. }
  97. log.info("cao" + c.getAccountDesc());
  98. }
  99. } else {
  100. log.info("不去重复银行");
  101. for (CompanyAccount c : ca) {
  102. // 不去重复银行
  103. bankSelect.add(new SelectItem(c.getCounterpartyCode(), c.getAccountDesc()));
  104. log.info("AccountDesc:" + c.getAccountDesc());
  105. log.info("CounterpartyCode:" + c.getCounterpartyCode());
  106. }
  107. }
  108. log.info("bankSelect.size():" + bankSelect.size());
  109. return bankSelect;
  110. }
  111. /**
  112. * 得到公司银行关系列表
  113. * @param companyId
  114. * @return
  115. */
  116. public List<CompanyAccount> getComanyBank(Long companyId) {
  117. ca = companyAccountServer.findCompanyAccountList(companyId);
  118. return ca;
  119. }
  120. /**
  121. * 得到公司银行里面的帐号
  122. * @param companyId
  123. * @param accountDesc
  124. * @return
  125. */
  126. public List<SelectItem> getCompanyAccountSelect(Long companyId, String accountDesc) {
  127. List<SelectItem> accountSelect = new ArrayList<SelectItem>();
  128. log.info("执行获得公司银行帐号方法");
  129. accountSelect = companyAccountServer.findBankSelect(companyId, accountDesc);
  130. log.info("得到公司银行里面的帐号" + accountSelect);
  131. return accountSelect;
  132. }
  133. /**
  134. * 流程创建保存
  135. * @param procPayProject
  136. * @return
  137. * @throws ServiceException
  138. */
  139. public String createProcInstance(ProcPayProject procPayProject) throws ServiceException {
  140. String procInstId = "";
  141. try {
  142. // PE流程创建
  143. // 流程实例ID,并保存
  144. procInstId = this.vwApplication(procPayProject);
  145. procPayProject.setProcInstId(procInstId);
  146. log.info("流程实例ID为:" + procPayProject.getProcInstId());
  147. procPayProject.setCreatedBy(loginService.getCurrentUserName());
  148. log.info("创建者是:" + procPayProject.getCreatedBy());
  149. // 保存到数据库中
  150. log.info("保存到数据库中!!");
  151. entityService.create(procPayProject);
  152. // 生成流程实例编号映射9.11
  153. processUtilMapService.generateProcessMap(procInstId, "BPM_RA_009", procPayProject.getCompany());
  154. } catch (Exception e) {
  155. log.error("createProcInstance方法 错误信息:" + e.getMessage());
  156. throw new ServiceException(ExceptionMessage.INSTANCE_CREATE, e);
  157. }
  158. return procInstId;
  159. }
  160. /**
  161. * PE流程创建
  162. * @param procPayProject
  163. * @return
  164. * @throws ServiceException
  165. */
  166. public String vwApplication(ProcPayProject procPayProject) throws ServiceException {
  167. String workClassName = ProcessXmlUtil.getProcessAttribute("id", "PayProject", "className");
  168. String workflowNumber = "";
  169. if (peManager.checkWorkClassName(workClassName)) {
  170. try {
  171. // 验证流程类名
  172. workflowNumber = peManager.vwCreateInstance(workClassName, "tms_subject1");
  173. HashMap<String, Object> step1para = new HashMap<String, Object>();
  174. peManager.vwLauchStep("TMS_Requester", step1para, workflowNumber);
  175. } catch (Exception e) {
  176. log.error("vwApplication方法 错误信息:" + e.getMessage());
  177. throw new ServiceException(ExceptionMessage.FN_CONNECT, e);
  178. }
  179. } else {
  180. throw new ServiceException(ExceptionMessage.FN_NO_CLASS);
  181. }
  182. return workflowNumber;
  183. }
  184. /**
  185. * 流程实例Id得到其他特殊借款实例
  186. * @param procInstId
  187. * @return
  188. */
  189. public ProcPayProject findProcInstanceByProcInstId(String procInstId) {
  190. StringBuilder jpql = new StringBuilder("select es from ProcPayProject es join fetch es.company where es.defunctInd = 'N'");
  191. jpql.append(" and es.procInstId='" + procInstId + "'");
  192. return entityService.findUnique(jpql.toString());
  193. }
  194. /**
  195. * 查询流程详细
  196. * @param procInstId
  197. * @return
  198. */
  199. public List<ProcessDetailVo> getProcessDetail(String procInstId) throws ServiceException {
  200. List<ProcessDetailVo> detailVos = new ArrayList<ProcessDetailVo>();
  201. String filter = "1=1 and F_WobNum = :wobNum and (F_EventType = :eventType1 or F_EventType = :eventType2)";
  202. Object[] substitutionVars = { new VWWorkObjectNumber(procInstId),
  203. ProcessDefineUtil.PROCESS_EVENTTYPE_MAP.get(ProcessDefineUtil.EventTypeEnum.StepEnd),
  204. ProcessDefineUtil.PROCESS_EVENTTYPE_MAP.get(ProcessDefineUtil.EventTypeEnum.ProcessTerminal) };
  205. try {
  206. List<VWLogElement> les = new ArrayList<VWLogElement>();
  207. les = peManager.vwEventLogWob(filter, substitutionVars);
  208. for (VWLogElement le : les) {
  209. ProcessDetailVo detailVo = new ProcessDetailVo();
  210. if (ProcessDefineUtil.PROCESS_EVENTTYPE_MAP.get(ProcessDefineUtil.EventTypeEnum.ProcessTerminal).equals(le.getEventType())) {
  211. detailVo.setProssNodeName("流程终止");
  212. } else {
  213. detailVo.setProssNodeName(le.getStepName());
  214. }
  215. detailVo.setOperatorsName(le.getUserName());
  216. detailVo.setOperatorTime(le.getTimeStamp());
  217. detailVo.setNodeMemo((String) le.getFieldValue("F_Comment"));
  218. detailVo.setId(new Long(le.getSequenceNumber()));
  219. detailVos.add(detailVo);
  220. }
  221. } catch (Exception e) {
  222. log.error("getProcessDetail方法 错误信息:" + e.getMessage());
  223. throw new ServiceException(ExceptionMessage.FN_CONNECT, e);
  224. }
  225. return detailVos;
  226. }
  227. /**
  228. * 查询付款过程详细
  229. * @param procInstId
  230. */
  231. public List<PaymentVo> getPayDetail(String procInstId) throws ServiceException {
  232. List<PaymentVo> payDetailVos = new ArrayList<PaymentVo>();
  233. try {
  234. // 查询流程实例编号对应的流程ID
  235. StringBuilder jpql = new StringBuilder("select es.id from ProcPayProject es join fetch es.company where es.defunctInd = 'N'");
  236. jpql.append(" and es.procInstId='" + procInstId + "'");
  237. log.info(jpql);
  238. log.info("!!!!!!!!!!!!!!!!id为:" + entityService.findUnique(jpql.toString()));
  239. // 根据明细表中的字段
  240. StringBuilder jpql2 = new StringBuilder(
  241. "select esd from ProcPayProjectDetails esd left join fetch esd.procPayProject where esd.defunctInd = 'N'");
  242. jpql2.append(" and esd.procPayProject.id=" + entityService.findUnique(jpql.toString()) + "");
  243. log.info(jpql2);
  244. List<ProcPayProjectDetails> amo = entityService.find(jpql2.toString());
  245. int i = 1;
  246. for (ProcPayProjectDetails d : amo) {
  247. PaymentVo payDetailVo = new PaymentVo();
  248. payDetailVo.setSerialNumber(i);
  249. payDetailVo.setPayDatetime(d.getCreatedDatetime());
  250. payDetailVo.setPayWay(d.getPayWay());
  251. payDetailVo.setPayFundsTotal(d.getPayFundsTotal());
  252. payDetailVo.setPayer(d.getCreatedBy());
  253. i++;
  254. payDetailVos.add(payDetailVo);
  255. }
  256. } catch (Exception e) {
  257. log.error("getPayDetail方法 错误信息:" + e.getMessage());
  258. throw new ServiceException(ExceptionMessage.FN_CONNECT, e);
  259. }
  260. return payDetailVos;
  261. }
  262. /**
  263. * 审批保存
  264. * @param procPayProject
  265. * @param approveStatus
  266. * @param stepName
  267. * @throws ServiceException
  268. */
  269. public void doApprove(ProcPayProject procPayProject, String approveStatus, String stepName) throws ServiceException {
  270. try {
  271. // 获得当前流程节点
  272. String queueName = ProcessXmlUtil.findStepProperty("id", "PayProject", stepName, "queueName");
  273. // 加入流程备注抬头
  274. Map<String, Object> map = new HashMap<String, Object>();
  275. String memoTitle = "";
  276. if ("Y".equals(approveStatus)) {
  277. memoTitle = ProcessXmlUtil.findStepProperty("id", "PayProject", stepName, "passMemo");
  278. map.put(queueName + "_Pass", true);
  279. } else {
  280. memoTitle = ProcessXmlUtil.findStepProperty("id", "PayProject", stepName, "nopassMemo");
  281. map.put(queueName + "_Pass", false);
  282. }
  283. // 是否为转款
  284. if (!"T".equals(procPayProject.getLoanIden())) {
  285. map.put(queueName + "_Loan", true);
  286. } else {
  287. map.put(queueName + "_Loan", false);
  288. }
  289. if (memoTitle != null) {
  290. procPayProject.setPeMemo(memoTitle + procPayProject.getPeMemo());
  291. log.info("备注抬头:" + memoTitle + procPayProject.getPeMemo());
  292. }
  293. // 先执行更新操作
  294. log.info("执行跟新前!!!!");
  295. entityService.update(procPayProject);
  296. log.info("FN流程运行");
  297. peManager.vwDisposeTask(procPayProject.getProcInstId(), map, procPayProject.getPeMemo());
  298. } catch (Exception e) {
  299. log.error("doApprove方法 错误信息:" + e.getMessage());
  300. throw new ServiceException(ExceptionMessage.FN_CONNECT, e);
  301. }
  302. }
  303. /**
  304. * 确认保存(付款或者终止付款)
  305. * @param procPayProject
  306. * @param procPayProjectDetails
  307. * @param conf
  308. * @param payWay
  309. * @param stepName
  310. * @throws ServiceException
  311. */
  312. public void doConfirm(ProcPayProject procPayProject, ProcPayProjectDetails procPayProjectDetails, Boolean conf, Boolean payWay, String stepName)
  313. throws ServiceException {
  314. // conf:付款标识符-true:付款,false:终止付款
  315. try {
  316. // 加入流程备注抬头
  317. String memoTitle = "";
  318. if (conf) {
  319. memoTitle = ProcessXmlUtil.findStepProperty("id", "PayProject", stepName, "passMemo");
  320. } else {
  321. memoTitle = ProcessXmlUtil.findStepProperty("id", "PayProject", stepName, "nopassMemo");
  322. }
  323. // 邮件知会需要信息(add on 2013-4-10)
  324. String remark = procPayProject.getPeMemo();
  325. if (memoTitle != null) {
  326. procPayProject.setPeMemo(memoTitle + procPayProject.getPeMemo());
  327. }
  328. // payWay true:SUNGARD付款 false:网银付款
  329. if (payWay) {
  330. procPayProjectDetails.setPayWay("S");
  331. } else {
  332. procPayProjectDetails.setPayWay("O");
  333. }
  334. if (conf) {
  335. log.info("执行付款任务1111111111111111");
  336. // 是否若为true则为足额支付,false为终止付款
  337. procPayProjectDetails.setPayDatetime(new Date());
  338. procPayProjectDetails.setCreatedBy(loginService.getCurrentUserName());
  339. entityService.create(procPayProjectDetails);
  340. log.info("存入数据库成功!!!!!");
  341. Boolean ifAll = ifEnoughPay(procPayProject);
  342. log.info("验证完毕:验证结果是:" + ifAll);
  343. Map<String, Object> map = new HashMap<String, Object>();
  344. map.put("_Enough", ifAll);
  345. Boolean isSungard = false;
  346. if ("S".equals(procPayProjectDetails.getPayWay())) {
  347. isSungard = true;
  348. map.put("TMS_Is_Sungard", true);
  349. } else {
  350. isSungard = false;
  351. map.put("TMS_Is_Sungard", false);
  352. }
  353. peManager.vwDisposeTask(procPayProject.getProcInstId(), map, procPayProject.getPeMemo());
  354. //调用生成ftp文件方法 add on 2013-8-1 by yan
  355. String className = ProcessXmlUtil.getProcessAttribute("id", "PayProject","className");
  356. String bpmId = ftpUploadService.tmsFtpUploadFile(procPayProject.getProcInstId(),
  357. className, procPayProjectDetails.getCreatedDatetime(), isSungard);
  358. if(payWay) {
  359. ProcTMSStatus tmsStatus = new ProcTMSStatus();
  360. tmsStatus.setPayId(procPayProjectDetails.getId());
  361. tmsStatus.setBpmId(bpmId);
  362. tmsStatus.setTmsStatus(TmsStatusService.STATUS_NOIMPORT);
  363. //增加TMS回传表
  364. tmsStatusService.saveTmsStatus(tmsStatus);
  365. }else {
  366. // 邮件知会申请人
  367. mailRequester(procPayProject, procPayProjectDetails, conf, stepName,remark);
  368. }
  369. } else {
  370. log.info("执行终止付款任务222222222222222222");
  371. conf = true;
  372. Map<String, Object> map = new HashMap<String, Object>();
  373. map.put("_Enough", conf);
  374. map.put("TMS_Is_Sungard", false);
  375. log.info("stop的值是:" + conf);
  376. peManager.vwDisposeTask(procPayProject.getProcInstId(), map, procPayProject.getPeMemo());
  377. // 邮件知会申请人
  378. conf = false;
  379. mailRequester(procPayProject, procPayProjectDetails, conf, stepName,remark);
  380. }
  381. } catch (Exception e) {
  382. log.error("doConfirm方法 错误信息:" + e.getMessage());
  383. throw new ServiceException(ExceptionMessage.FN_CONNECT, e);
  384. }
  385. }
  386. /**
  387. * 验证是否足额支付
  388. * @param procPayProject
  389. * @return
  390. */
  391. public Boolean ifEnoughPay(ProcPayProject procPayProject) {
  392. Boolean enough = false;
  393. Double amount = needPay(procPayProject);
  394. log.info("获得需要支付的总金额:" + amount);
  395. Double payAmount = payedAccount(procPayProject);
  396. log.info("获得已经支付的总金额" + payAmount);
  397. if (amount > payAmount) {
  398. log.info(enough + "!!!!!!未足额支付!!!!!!");
  399. return enough;
  400. }
  401. return true;
  402. }
  403. /**
  404. * 获得需要支付的金额
  405. * @param procPayProject
  406. * @return
  407. */
  408. public Double needPay(ProcPayProject procPayProject) {
  409. StringBuilder jpql = new StringBuilder("select es.amount from ProcPayProject es where es.defunctInd = 'N'");
  410. jpql.append(" and es.procInstId='" + procPayProject.getProcInstId() + "'");
  411. Double amount = entityService.findUnique(jpql.toString());
  412. log.info("需要支付总金额是:" + amount);
  413. return amount;
  414. }
  415. /**
  416. * 获得已支付的总金额
  417. * @param procPayProject
  418. * @return
  419. */
  420. public Double payedAccount(ProcPayProject procPayProject) {
  421. Double payAmount = 0D;
  422. StringBuilder jpql = new StringBuilder(
  423. "select esd from ProcPayProjectDetails esd left join fetch esd.procPayProject where esd.defunctInd = 'N'");
  424. jpql.append(" and esd.procPayProject.id=" + procPayProject.getId() + "");
  425. log.info("jpql:" + jpql);
  426. List<ProcPayProjectDetails> amo = entityService.find(jpql.toString());
  427. log.info("amo的队列为:" + amo);
  428. if (!amo.isEmpty()) {
  429. for (ProcPayProjectDetails d : amo) {
  430. payAmount += d.getPayFundsTotal();
  431. }
  432. }
  433. log.info("已支付的总金额是:" + payAmount);
  434. return payAmount;
  435. }
  436. /**
  437. * 邮件付款方式选择
  438. * @param procPayProjectDetails
  439. * @return
  440. */
  441. public String selectPayWay(ProcPayProjectDetails procPayProjectDetails) {
  442. if ("S".equals(procPayProjectDetails.getPayWay())) {
  443. return "SUNGARD付款";
  444. } else {
  445. return "网银支付";
  446. }
  447. }
  448. /**
  449. * 邮件通知申请人
  450. * @param procPayProject
  451. * @param procPayProjectDetails
  452. * @param conf
  453. * @param stepName
  454. * @param remark
  455. */
  456. private void mailRequester(ProcPayProject procPayProject, ProcPayProjectDetails procPayProjectDetails, Boolean conf, String stepName, String remark) {
  457. log.info("邮件知会申请人!!!!!!!!!!!");
  458. List<Mail> mailList = new ArrayList<Mail>();
  459. StringBuilder bussMailBody = new StringBuilder("您申请的");
  460. DecimalFormat df = new DecimalFormat("0.00");
  461. if (conf && ("集团资金计划员付款".equals(stepName)) && (ifEnoughPay(procPayProject) == false)) {
  462. // 邮件业务内容
  463. // 您申请的***流程,编号为[流程实例ID],集团资金计划已经通过***方式下拨***元,请知悉,谢谢!"
  464. bussMailBody.append("“付工程款股利及归还股东借款流程”,编号为:【" + processUtilMapService.getTmsIdByFnId(procPayProject.getProcInstId())
  465. + "】,付款金额为:" + df.format(procPayProjectDetails.getPayFundsTotal()) +"万元,各节点已经完成审批,并生成付款指令,资金调度同事即将处理!预计付款日期为:" +
  466. DateUtil.dateToStrShort(procPayProjectDetails.getPayDatetime()) + ",付款方式为:"
  467. + this.selectPayWay(procPayProjectDetails) );
  468. bussMailBody.append(",审批备注:"+remark+"。请知悉,谢谢!");
  469. log.info(bussMailBody);
  470. } else if (conf && ("集团资金计划员付款".equals(stepName)) && (ifEnoughPay(procPayProject) == true)) {
  471. bussMailBody.append("“付工程款股利及归还股东借款流程”,编号为:【" + processUtilMapService.getTmsIdByFnId(procPayProject.getProcInstId())
  472. + "】,付款金额为:" + df.format(procPayProjectDetails.getPayFundsTotal()) +"万元,各节点已经完成审批,并生成付款指令,资金调度同事即将处理!预计付款日期为:" +
  473. DateUtil.dateToStrShort(procPayProjectDetails.getPayDatetime()) + ",付款方式为:"
  474. + this.selectPayWay(procPayProjectDetails) );
  475. bussMailBody.append(",审批备注:"+remark+"。此流程所有金额均已完成审批!请知悉,谢谢!");
  476. } else {
  477. bussMailBody.append("“付工程款股利及归还股东借款流程”,编号为:【" + processUtilMapService.getTmsIdByFnId(procPayProject.getProcInstId()) + "】已经终止付款!请知悉,谢谢!");
  478. log.info(bussMailBody);
  479. }
  480. StringBuilder jpql = new StringBuilder("select distinct pu.pernr from PU pu where pu.defunctInd='N' ");
  481. jpql.append(" and pu.id='" + procPayProjectDetails.getProcPayProject().getCreatedBy() + "'");
  482. log.info("jpql语句为:" + jpql);
  483. String pid = entityService.findUnique(jpql.toString());
  484. log.info("pid为:" + pid);
  485. P p = entityService.find(P.class, pid);
  486. log.info("p:" + p);
  487. log.info(p.getEmail() + p.getNachn() + p.getName2());
  488. if (p != null) {
  489. Mail m = new Mail();
  490. m.setTelno(p.getCelno());
  491. m.setEmail(p.getEmail());
  492. m.setSubject(mailService.generationTitle(MailUtil.MailTypeEnum.Notice, "TMS_PayProject",
  493. processUtilMapService.getTmsIdByFnId(procPayProject.getProcInstId()), stepName, loginService.getCurrentUserName(), null));
  494. m.setBody(mailService.generationContent(MailUtil.MailTypeEnum.Notice, "TMS_PayProject",
  495. processUtilMapService.getTmsIdByFnId(procPayProject.getProcInstId()), stepName, loginService.getCurrentUserName(), null, null)
  496. + bussMailBody.toString());
  497. mailList.add(m);
  498. }
  499. log.info("邮件内容:" + mailList.get(0).getBody());
  500. log.info("邮件主题:" + mailList.get(0).getSubject());
  501. log.info("邮箱:" + mailList.get(0).getEmail());
  502. log.info(mailList);
  503. log.info("邮件封装前!!!!!!!!!");
  504. // 邮件封装
  505. sendMailService.send(mailList);
  506. }
  507. }