ExpenseAccountServiceImpl.java 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. package com.goafanti.expenseAccount.service.impl;
  2. import com.goafanti.admin.bo.AdminListBo;
  3. import com.goafanti.common.bo.AdminNoticeBo;
  4. import com.goafanti.common.bo.EmailBo;
  5. import com.goafanti.common.constant.AFTConstants;
  6. import com.goafanti.common.dao.*;
  7. import com.goafanti.common.enums.NoticeStatus;
  8. import com.goafanti.common.enums.NoticeTypes;
  9. import com.goafanti.common.error.BusinessException;
  10. import com.goafanti.common.model.*;
  11. import com.goafanti.common.utils.*;
  12. import com.goafanti.core.mybatis.BaseMybatisDao;
  13. import com.goafanti.core.mybatis.page.Pagination;
  14. import com.goafanti.core.shiro.token.TokenManager;
  15. import com.goafanti.expenseAccount.Enums.EAProcessStatus;
  16. import com.goafanti.expenseAccount.bo.*;
  17. import com.goafanti.expenseAccount.service.ExpenseAccountService;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.cache.annotation.CacheEvict;
  20. import org.springframework.cache.annotation.Cacheable;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import java.math.BigDecimal;
  24. import java.util.*;
  25. @Service
  26. public class ExpenseAccountServiceImpl extends BaseMybatisDao<ExpenseAccountMapper> implements ExpenseAccountService {
  27. @Autowired
  28. private AdminMapper adminMapper;
  29. @Autowired
  30. private ExpenseAccountMapper expenseAccountMapper;
  31. @Autowired
  32. private PublicReleaseMapper publicReleaseMapper;
  33. @Autowired
  34. private ExpenseAccountLogMapper expenseAccountLogMapper;
  35. @Autowired
  36. private AsyncUtils asyncUtils;
  37. @Autowired
  38. private WeChatUtils weChatUtils;
  39. @Autowired
  40. private ExpenseAccountDetailsMapper expenseAccountDetailsMapper;
  41. @Autowired
  42. private ExpenseAccountPrivateMapper expenseAccountPrivateMapper;
  43. @Autowired
  44. private ExpenseAccountExamineMapper expenseAccountExamineMapper;
  45. @Override
  46. public Integer add(InputExpenseAccount in) {
  47. //设置付款部门和支付部门
  48. if (in.getAid()!=null){
  49. Admin admin = adminMapper.selectByPrimaryKey(in.getAid());
  50. in.setAname(admin.getName());
  51. in.setApplyDep(admin.getDepartmentId());
  52. in.setPayDep(admin.getDepartmentId());
  53. }
  54. //如果关联公出,获取公出信息
  55. if (in.getPrid()!=null){
  56. PublicRelease pr = publicReleaseMapper.selectByPrimaryKey(in.getPrid());
  57. in.setReleaseStart(pr.getReleaseStart());
  58. in.setReleaseEnd(pr.getReleaseEnd());
  59. in.setDistrictName(pr.getDistrictName());
  60. in.setUserNames(pr.getUserNames());
  61. in.setDuration(pr.getDuration());
  62. }
  63. Integer eaaid = expenseAccountPrivateMapper.selectByaidDefault(in.getAid());
  64. in.setEaaid(eaaid);
  65. //判断报销类型,0=固定费用,1=报销到订单
  66. if (in.getOrderNo()==null){
  67. in.setTargetType(0);
  68. }else {
  69. in.setTargetType(1);
  70. }
  71. expenseAccountMapper.insertSelective(in);
  72. addExpenseAccountExamine(in.getId());
  73. return in.getId();
  74. }
  75. /**
  76. * 新增报销审核流程
  77. * @param id
  78. */
  79. private void addExpenseAccountExamine(Integer id) {
  80. List<ExpenseAccountExamine> list=new ArrayList<>();
  81. String aid = TokenManager.getAdminId();
  82. Admin admin = adminMapper.selectByPrimaryKey(aid);
  83. for (int i=1;i<5;i++){
  84. if (i==1){
  85. //新增一级
  86. ExpenseAccountExamine eae=new ExpenseAccountExamine(id,i);
  87. AdminNoticeBo a = adminMapper.selectMyAndSuperBySuperId(aid);
  88. if (a.getSuperId()!=null){
  89. eae.setAuditor(a.getSuperId());
  90. eae.setAuditorname(a.getSuperName());
  91. }else {
  92. eae.setAuditor(a.getId());
  93. eae.setAuditorname(a.getName());
  94. }
  95. if (eae.getAuditor().equals(aid))eae.setStatus(1);
  96. else eae.setStatus(0);
  97. list.add(eae);
  98. }else if (i==2){
  99. ExpenseAccountExamine eae=new ExpenseAccountExamine(id,i);
  100. Admin admin2 = adminMapper.selectFinanceAdminByAid(aid);
  101. if (admin2==null){
  102. throw new BusinessException("发起人部门财务专员不存在。");
  103. }
  104. eae.setAuditor(admin2.getId());
  105. eae.setAuditorname(admin2.getName());
  106. if (eae.getAuditor().equals(aid))eae.setStatus(1);
  107. else eae.setStatus(0);
  108. list.add(eae);
  109. }else if (i==3){
  110. List<Admin> admins = adminMapper.listAdminBydepIdAndRoleType(admin.getDepartmentId(), AFTConstants.SALESMAN_ADMIN);
  111. if (admins.isEmpty())throw new BusinessException("发起人部门营销管理员不存在。");
  112. for (Admin e : admins) {
  113. ExpenseAccountExamine eae=new ExpenseAccountExamine(id,i);
  114. eae.setAuditor(e.getId());
  115. eae.setAuditorname(e.getName());
  116. if (eae.getAuditor().equals(aid))eae.setStatus(1);
  117. else eae.setStatus(0);
  118. list.add(eae);
  119. }
  120. }else if (i==4){
  121. List<Admin> admins = adminMapper.selectAdminByRoleType(AFTConstants.All_CED_AND_CHAIRMAN);
  122. for (Admin e : admins) {
  123. ExpenseAccountExamine eae=new ExpenseAccountExamine(id,i);
  124. eae.setAuditor(e.getId());
  125. eae.setAuditorname(e.getName());
  126. if (eae.getAuditor().equals(aid))eae.setStatus(1);
  127. else eae.setStatus(0);
  128. list.add(eae);
  129. }
  130. }
  131. }
  132. expenseAccountExamineMapper.insertBatch(list);
  133. }
  134. /**
  135. * 新增报销日志
  136. * @param eaid 报销编号
  137. * @param status 状态 0发起 1通过 2完成 3驳回 4修改
  138. * @param str 备注
  139. */
  140. private void addExpenseAccountLog(Integer eaid, Integer status,Integer processStatus,String aid, String str) {
  141. addExpenseAccountLog(eaid,status,processStatus,aid,str,null);
  142. }
  143. /**
  144. * 新增报销日志
  145. * @param eaid 报销编号
  146. * @param status 状态 0发起 1通过 2完成 3驳回 4修改
  147. * @param str 备注
  148. */
  149. private void addExpenseAccountLog(Integer eaid, Integer status,Integer processStatus,String aid, String str,Date date) {
  150. if (aid==null)aid=TokenManager.getAdminId();
  151. ExpenseAccountLog eaLog=new ExpenseAccountLog();
  152. eaLog.setEaid(eaid);
  153. eaLog.setStatus(status);
  154. eaLog.setRemarks(str);
  155. eaLog.setProcessStatus(processStatus);
  156. eaLog.setAuditor(aid);
  157. if (date !=null)eaLog.setCreateTime(date);
  158. expenseAccountLogMapper.insertSelective(eaLog);
  159. }
  160. /**
  161. * 发起、驳回发起流程切换和日志站内信发送
  162. * @param in
  163. * @param status
  164. * @param str
  165. */
  166. private void addExpenseAccountLogAndNoticEmail(InputExpenseAccount in, Integer status, String str) {
  167. String aid=TokenManager.getAdminId();
  168. addExpenseAccountLog(in.getId(),status,in.getProcessStatus(),aid,str);
  169. Admin admin = adminMapper.selectByPrimaryKey(aid);
  170. if(in.getStatus()==1){
  171. in.setProcessStatus(1);
  172. }
  173. if (admin.getSuperiorId()==null||admin.getId().equals(admin.getSuperiorId())){
  174. String str2=String.format("重复审核人跳过[%s]。",EAProcessStatus.getDesc(in.getProcessStatus()));
  175. Date date=new Date();
  176. date.setTime(date.getTime()+1000L);
  177. addExpenseAccountLog(in.getId(),1,in.getProcessStatus(),aid,str2,date);
  178. in.setProcessStatus(in.getProcessStatus()+1);
  179. }
  180. createExamineByProcess(in);
  181. }
  182. /**
  183. * 判断审核流程与发送日志与邮件
  184. * @param in
  185. */
  186. private void createExamineByProcess(InputExpenseAccount in) {
  187. //审核流程推送到最新
  188. examineByprocess(in);
  189. List<Admin> aids=new ArrayList<>();
  190. AdminListBo admin = adminMapper.getDeptNameByAid(in.getAid());
  191. if(in.getProcessStatus()== EAProcessStatus.SJSH.getCode()){
  192. //获取上级
  193. Admin superAdmin = adminMapper.selectByPrimaryKey(admin.getSuperiorId());
  194. aids.add(superAdmin);
  195. in.setExamineName(superAdmin.getName());
  196. }else if (in.getProcessStatus()== EAProcessStatus.CWSH.getCode()){
  197. //获取财务负责人
  198. Admin finaceAdmin = adminMapper.selectByPrimaryKey(admin.getDepFinance());
  199. aids.add(finaceAdmin);
  200. in.setExamineName(finaceAdmin.getName());
  201. }else if (in.getProcessStatus()== EAProcessStatus.ZJLSH.getCode()){
  202. //获取部门负责人
  203. List<Admin> list = adminMapper.listAdminBydepIdAndRoleType(admin.getDepartmentId(), AFTConstants.SALESMAN_ADMIN);
  204. if (!list.isEmpty())aids.addAll(list);
  205. in.setExamineName(getAdmins(list));
  206. }else if (in.getProcessStatus()== EAProcessStatus.ZJLSH.getCode()){
  207. //获取总裁、董事长等审核
  208. List<Admin> list = adminMapper.selectAdminByRoleType(AFTConstants.All_CED_AND_CHAIRMAN);
  209. if (!list.isEmpty())aids.addAll(list);
  210. in.setExamineName(getAdmins(list));
  211. }
  212. StringBuffer str=new StringBuffer().append("您有报销需要审核,").append("报销编号[").append(in.getId()).append("]").append(",请查看并审核。");
  213. addNoticeAndEmail(in, 1,str.toString(), admin.getName(),aids);
  214. }
  215. @Override
  216. @Transactional
  217. public int update(InputExpenseAccount in) {
  218. OutExpenseAccount useEA = expenseAccountMapper.selectByid(in.getId());
  219. if (useEA.getStatus()!=0&&useEA.getStatus()!=3){
  220. throw new BusinessException("不能操作审核中与完成的订单");
  221. }
  222. if (in.getStartTimeStr()!=null&&in.getEndTimeStr()!=null){
  223. in.setReleaseStart(DateUtils.StringToDate(in.getStartTimeStr(), AFTConstants.YYYYMMDDHHMMSS));
  224. in.setReleaseEnd(DateUtils.StringToDate(in.getEndTimeStr(), AFTConstants.YYYYMMDDHHMMSS));
  225. }
  226. //计算总金额
  227. if (in.getTotalAmount()==null){
  228. in.setTotalAmount(expenseAccountDetailsMapper.selectAmountCountByEAid(in.getId()));
  229. }
  230. in.setProcessStatus(0);
  231. if (useEA.getStatus()==0){
  232. addExpenseAccountLogAndNoticEmail(in,0,"发起报销审核");
  233. }else if (useEA.getStatus()==3){
  234. addExpenseAccountLogAndNoticEmail(in,4,"修改并发起审核");
  235. }
  236. if (in.getOrderNo()==null){
  237. in.setTargetType(0);
  238. }else {
  239. in.setTargetType(1);
  240. }
  241. //计算本单已扣金额 如果有选择借支单,则需要修改借支状态
  242. if (in.getDebitId()!=null){
  243. //如果以前没有选择借支,修改报销和借支数据
  244. if (useEA.getDebitId()==null){
  245. pushExpenseAccountDebit(in);
  246. }else if (useEA.getDebitId()!=in.getDebitId()) {
  247. //如果是修改编号
  248. pushExpenseAccountDebit(in);
  249. //并且要处理原编号的问题
  250. pushresettingDebit(in,useEA.getDebitId());
  251. }
  252. }
  253. return expenseAccountMapper.updateByPrimaryKeySelective(in);
  254. }
  255. private void pushresettingDebit(InputExpenseAccount in, Integer debitId) {
  256. ExpenseAccount debit = expenseAccountMapper.selectByPrimaryKey(debitId);
  257. List<ExpenseAccount> list = expenseAccountMapper.selectByDebitId(debitId);
  258. ExpenseAccount newdebit=new ExpenseAccount();
  259. newdebit.setId(debitId);
  260. //计算除开当前单,已选择抵扣金额
  261. BigDecimal count=new BigDecimal(0);
  262. for (ExpenseAccount e : list) {
  263. if (!in.getId().equals(e.getId())){
  264. count=count.add(e.getSettlementAmount());
  265. }
  266. }
  267. newdebit.setSettlementAmount(count);
  268. if (count.compareTo(new BigDecimal(0))==0){
  269. newdebit.setLiquidationStatus(0);
  270. }else if (count.compareTo(debit.getTotalAmount())<0){
  271. newdebit.setLiquidationStatus(1);
  272. }else if (count.compareTo(debit.getTotalAmount())==0){
  273. newdebit.setLiquidationStatus(2);
  274. }
  275. expenseAccountMapper.updateByPrimaryKeySelective(newdebit);
  276. }
  277. private void pushExpenseAccountDebit(InputExpenseAccount in) {
  278. ExpenseAccount debit = expenseAccountMapper.selectByPrimaryKey(in.getDebitId());
  279. ExpenseAccount newDebit=new ExpenseAccount();
  280. newDebit.setId(debit.getId());
  281. //计算剩余需要支付金额
  282. BigDecimal decbitAmount=debit.getTotalAmount().subtract(debit.getSettlementAmount());
  283. //本次金额大于等于需要抵扣金额,则变成完全抵扣,抵扣金额变成本次已付金额
  284. if (in.getTotalAmount().compareTo(decbitAmount)>=0){
  285. in.setSettlementAmount(decbitAmount);
  286. newDebit.setSettlementAmount(debit.getTotalAmount());
  287. newDebit.setLiquidationStatus(2);
  288. }else {
  289. // 本次金额小于需要抵扣,则本次变更全抵扣,借支已付加上本次金额
  290. in.setSettlementAmount(in.getTotalAmount());
  291. newDebit.setSettlementAmount(debit.getSettlementAmount().add(in.getTotalAmount()));
  292. newDebit.setLiquidationStatus(1);
  293. }
  294. expenseAccountMapper.updateByPrimaryKeySelective(newDebit);
  295. }
  296. @Override
  297. public int addDetails(InputExpenseAccountDetails in) {
  298. if (in.getAgreeTimes()!=null){
  299. in.setAgreeTime(DateUtils.StringToDate(in.getAgreeTimes(),AFTConstants.YYYYMMDD));
  300. }
  301. return expenseAccountDetailsMapper.insertSelective(in);
  302. }
  303. @Override
  304. public int deleteDetails(Integer id) {
  305. return expenseAccountDetailsMapper.deleteByPrimaryKey(id);
  306. }
  307. @Override
  308. public List<OutExpenseAccountDetails> detailsList(Integer eaid) {
  309. return expenseAccountDetailsMapper.selectByEAid(eaid);
  310. }
  311. @Override
  312. public Object logList(Integer eaid) {
  313. List<OutExpenseAccountLog> list = expenseAccountLogMapper.selectByEaid(eaid);
  314. int maxProcessStatus=0;
  315. if (!list.isEmpty()){
  316. OutExpenseAccountLog lastout=list.get(list.size()-1);
  317. if (lastout.getStatus()!=3)maxProcessStatus=lastout.getProcessStatus();
  318. }
  319. List<OutExpenseAccountLog> eaelist = expenseAccountExamineMapper.selectNotExamineByEaidAndProcessStatus(eaid, maxProcessStatus);
  320. list.addAll(eaelist);
  321. return list;
  322. }
  323. @Override
  324. public int updateExamine(InputExpenseAccount in) {
  325. ExpenseAccount useEa = expenseAccountMapper.selectByPrimaryKey(in.getId());
  326. ExpenseAccount newEa=new ExpenseAccount();
  327. newEa.setId(useEa.getId());
  328. //审核通知 获取发送人
  329. addExamineExpenseAccountLog(in, useEa, newEa);
  330. //完成申请
  331. if (newEa.getStatus()==2){
  332. //如果是借支则订单新增
  333. if (useEa.getType()!=4){
  334. //不然就看是否挂载借支订单进行抵扣
  335. if (useEa.getDebitId()!=null){
  336. ExpenseAccount useDebit=expenseAccountMapper.selectByPrimaryKey(useEa.getDebitId());
  337. if (useDebit.getLiquidationStatus()==2){
  338. List<ExpenseAccount> expenseAccounts = expenseAccountMapper.selectByDebitId(useEa.getDebitId());
  339. boolean flag=true;
  340. for (ExpenseAccount expenseAccount : expenseAccounts) {
  341. if(!expenseAccount.getId().equals(in.getId())&&expenseAccount.getStatus()!=2){
  342. flag=false;
  343. break;
  344. }
  345. }
  346. if (flag){
  347. ExpenseAccount debit=new ExpenseAccount();
  348. debit.setId(useEa.getDebitId());
  349. debit.setLiquidationStatus(3);
  350. expenseAccountMapper.updateByPrimaryKeySelective(debit);
  351. }
  352. }
  353. }
  354. }
  355. }
  356. //审核处理审核表
  357. pushExpenseAccountExamine(in);
  358. expenseAccountMapper.updateByPrimaryKeySelective(newEa);
  359. return 1;
  360. }
  361. private void pushExpenseAccountExamine(InputExpenseAccount in) {
  362. if (in.getStatus()==1){
  363. expenseAccountExamineMapper.updateStatusByEaidAndAid(in.getId(),TokenManager.getAdminId(),1);
  364. }else if (in.getStatus()==3){
  365. expenseAccountExamineMapper.updateStatusByEaidAndAid(in.getId(),null,0);
  366. }
  367. }
  368. private void addExamineExpenseAccountLog(InputExpenseAccount in, ExpenseAccount useEa, ExpenseAccount newEa) {
  369. List<Admin> aids=new ArrayList<>();
  370. StringBuffer str=new StringBuffer();
  371. Integer status=in.getStatus();
  372. AdminListBo admin = adminMapper.getDeptNameByAid(useEa.getAid());
  373. if (status==1){
  374. str=str.append("您有报销需要审核,").append("报销编号[").append(in.getId()).append("]").append(",请查看并审核。");
  375. //新的流程是当前流程+1
  376. newEa.setProcessStatus(useEa.getProcessStatus()+1);
  377. pushExamineProcess(newEa);
  378. if (newEa.getProcessStatus()== EAProcessStatus.CWSH.getCode()){
  379. //获取财务负责人
  380. Admin finaceAdmin = adminMapper.selectByPrimaryKey(admin.getDepFinance());
  381. aids.add(finaceAdmin);
  382. newEa.setExamineName(finaceAdmin.getName());
  383. }else if (newEa.getProcessStatus()== EAProcessStatus.ZJLSH.getCode()){
  384. //获取部门负责人
  385. List<Admin> list = adminMapper.listAdminBydepIdAndRoleType(admin.getDepartmentId(), AFTConstants.SALESMAN_ADMIN);
  386. if (!list.isEmpty())aids.addAll(list);
  387. newEa.setExamineName(getAdmins(list));
  388. }else if (newEa.getProcessStatus()== EAProcessStatus.DSZSH.getCode()){
  389. //获取总裁、董事长等审核
  390. List<Admin> list = adminMapper.selectAdminByRoleType(AFTConstants.All_CED_AND_CHAIRMAN);
  391. if (!list.isEmpty())aids.addAll(list);
  392. newEa.setExamineName(getAdmins(list));
  393. }else if (newEa.getProcessStatus()== EAProcessStatus.WCSH.getCode()){
  394. //获取报销申请人
  395. status =2;
  396. Admin finaceAdmin = adminMapper.selectByPrimaryKey(admin.getDepFinance());
  397. aids.add(finaceAdmin);
  398. str.setLength(0);
  399. str=str.append("您的报销审核已通过,报销编号[").append(in.getId()).append("],请注意查看。");
  400. addNoticeAndEmail(in, status,str.toString(),admin.getName(),aids);
  401. aids.clear();
  402. aids.add(adminMapper.selectByPrimaryKey(admin.getId()));
  403. newEa.setStatus(status);
  404. newEa.setExamineName("");
  405. }
  406. }else {
  407. aids.add(adminMapper.selectByPrimaryKey(admin.getId()));
  408. newEa.setStatus(3);
  409. newEa.setProcessStatus(0);
  410. str.setLength(0);
  411. str=str.append("您的报销审核已驳回,报销编号[").append(in.getId()).append("],请注意查看。");
  412. }
  413. if (newEa.getStatus()==null)newEa.setStatus(1);
  414. addExpenseAccountLog(in.getId(),status,useEa.getProcessStatus(),TokenManager.getAdminId(),in.getReason());
  415. addNoticeAndEmail(in, status,str.toString(),admin.getName(),aids);
  416. }
  417. private void pushExamineProcess( ExpenseAccount newEa) {
  418. //如果到了董事长审核,无需判断了
  419. if (newEa.getProcessStatus()<EAProcessStatus.WCSH.getCode()){
  420. //判断没一个流程是否可以跳过
  421. examineByprocess(newEa);
  422. }
  423. }
  424. /**
  425. * 审核流程推送,只要不是完成状态就继续判断是否跳过
  426. * @param newEa
  427. */
  428. private void examineByprocess( ExpenseAccount newEa) {
  429. //获取当前流程审核人,如果有已审核则跳过当前审核
  430. List<ExpenseAccountExamine> list = expenseAccountExamineMapper.selectByEaidAndProcessStatus(newEa.getId(), newEa.getProcessStatus());
  431. boolean flag=false;
  432. String aid="";
  433. for (ExpenseAccountExamine e : list) {
  434. if (e.getStatus()==1){
  435. flag=true;
  436. aid=e.getAuditor();
  437. break;
  438. }
  439. }
  440. if (flag){
  441. String str=String.format("重复审核人跳过[%s]。",EAProcessStatus.getDesc(newEa.getProcessStatus()));
  442. Date date=new Date();
  443. date.setTime(date.getTime()+1000l);
  444. addExpenseAccountLog(newEa.getId(),1,newEa.getProcessStatus(),aid,str,date);
  445. newEa.setProcessStatus(newEa.getProcessStatus()+1);
  446. if (newEa.getProcessStatus()<EAProcessStatus.WCSH.getCode())examineByprocess(newEa);
  447. }
  448. }
  449. private String getAdmins(List<Admin> list) {
  450. StringBuffer str =new StringBuffer();
  451. for (Admin admin : list) {
  452. str=str.append(admin.getName()).append(",");
  453. }
  454. return str.substring(0,str.length()-1);
  455. }
  456. private void addNoticeAndEmail(InputExpenseAccount in, Integer status, String str,String aname, List<Admin> aids) {
  457. Date date= new Date();
  458. Integer noticeStatus=NoticeStatus.EXPENSE_NOTICE.getCode();
  459. if (status==2){
  460. noticeStatus=NoticeStatus.EXPENSE_COMPLETE.getCode();
  461. }
  462. List<Notice> list=new ArrayList<>();
  463. if (aids!=null){
  464. for (Admin a : aids) {
  465. Notice notice=new Notice();
  466. notice.setId(UUID.randomUUID().toString());
  467. notice.setNoticeType(noticeStatus);
  468. notice.setType(NoticeTypes.getType(noticeStatus));
  469. notice.setAid(a.getId());
  470. notice.setCreateTime(date);
  471. notice.setContent(str);
  472. notice.setReaded(0);
  473. list.add(notice);
  474. EmailBo emailBo=new EmailBo(NoticeStatus.getValueByCode(noticeStatus),a.getEmail(),str);
  475. asyncUtils.send(emailBo);
  476. weChatUtils.addExpenseAccountWeChatNotice(a.getExpenseOpenId(),status,in.getId(),date,aname,str);
  477. }
  478. asyncUtils.addNoticeBatch(list);
  479. }
  480. }
  481. @Override
  482. public Object pageList(InputPageListBo in) {
  483. Map<String ,Object> param=new HashMap<>();
  484. addParam(in, param);
  485. Pagination<?> pagePlus = findPagePlus("selectExpenseAccountList",
  486. "selectExpenseAccountCount",
  487. "selectExpenseAccountTotalAmount", param, in.getPageNo(), in.getPageSize());
  488. List<OutExpenseAccountBo> list = (List<OutExpenseAccountBo>) pagePlus.getList();
  489. for (OutExpenseAccountBo e : list) {
  490. e.setExamine(pushExpenseAccountGetExamine(e.getId(), e.getProcessStatus()));
  491. }
  492. return pagePlus;
  493. }
  494. @Override
  495. public Object selectByPrid(InputExpenseAccount in) {
  496. Integer id=null;
  497. in.setAid(TokenManager.getAdminId());
  498. OutExpenseAccount useEa = expenseAccountMapper.selectByaidAndPrid(in);
  499. if (useEa!=null&&useEa.getId()!=null)id=useEa.getId();
  500. return id;
  501. }
  502. @Override
  503. public Object selectById(Integer id) {
  504. OutExpenseAccount useEa = expenseAccountMapper.selectByid(id);
  505. //判断当前角色是否审核
  506. pushExpenseAccountGetExamine(useEa);
  507. if (useEa.getDebitId()!=null){
  508. pushExpenseAccountGetDebitAmount(useEa);
  509. }
  510. return useEa;
  511. }
  512. /**
  513. * 计算当前报销显示抵扣金额
  514. * @param useEa
  515. */
  516. private void pushExpenseAccountGetDebitAmount(OutExpenseAccount useEa) {
  517. ExpenseAccount debit = expenseAccountMapper.selectByPrimaryKey(useEa.getDebitId());
  518. List<ExpenseAccount> list1 = expenseAccountMapper.selectByDebitId(useEa.getDebitId());
  519. BigDecimal count =debit.getTotalAmount();
  520. for (ExpenseAccount e : list1) {
  521. if (!e.getId().equals(useEa.getId())){
  522. count=count.subtract(e.getSettlementAmount());
  523. }
  524. }
  525. if (count.compareTo(new BigDecimal(0))<0)count=new BigDecimal(0);
  526. useEa.setDebitTotalAmount(count);
  527. }
  528. /**
  529. * 判断角色是否已经审核
  530. * @param useEa
  531. */
  532. private void pushExpenseAccountGetExamine(OutExpenseAccount useEa) {
  533. List<ExpenseAccountExamine> list = expenseAccountExamineMapper.selectByEaidAndProcessStatus(useEa.getId(), useEa.getProcessStatus());
  534. boolean flag=false;
  535. for (ExpenseAccountExamine e : list) {
  536. if (e.getAuditor().equals(TokenManager.getAdminId())){
  537. if (e.getStatus()==0){
  538. flag=true;
  539. break;
  540. }
  541. }
  542. }
  543. if (flag){
  544. useEa.setExamine(1);
  545. }else {
  546. useEa.setExamine(0);
  547. }
  548. }
  549. /**
  550. * 判断角色是否已经审核
  551. * @param
  552. */
  553. private Integer pushExpenseAccountGetExamine(Integer id,Integer processStatus) {
  554. List<ExpenseAccountExamine> list = expenseAccountExamineMapper.selectByEaidAndProcessStatus(id, processStatus);
  555. boolean flag=false;
  556. for (ExpenseAccountExamine e : list) {
  557. if (e.getAuditor().equals(TokenManager.getAdminId())){
  558. if (e.getStatus()==0){
  559. flag=true;
  560. break;
  561. }
  562. }
  563. }
  564. if (flag){
  565. return 1;
  566. }else {
  567. return 0;
  568. }
  569. }
  570. @Override
  571. public Object updateType(InputExpenseAccount in) {
  572. expenseAccountDetailsMapper.deleteByeaid(in.getId());
  573. return expenseAccountMapper.updateByPrimaryKeySelective(in);
  574. }
  575. @Override
  576. public List<OutExpenseAccount> selectDebitOrder(String depId,Integer id) {
  577. String aid= TokenManager.getAdminId();
  578. List<OutExpenseAccount> list = expenseAccountMapper.selectByaidAndType(aid, depId, 4,id);
  579. return list;
  580. }
  581. private void addParam(InputPageListBo in, Map<String, Object> param) {
  582. param.put("aid",TokenManager.getAdminId());
  583. if (in.getStartTime()!=null&&in.getEndTime()!=null){
  584. param.put("startTime",in.getStartTime());
  585. param.put("endTime",in.getEndTime()+" 23:59:59");
  586. }
  587. if (in.getStatus()!=null)param.put("status",in.getStatus());
  588. if (in.getProcessStatus()==null){
  589. if(PurviewUtils.superPurview()){
  590. param.put("superShiro",1);
  591. }else {
  592. param.put("processStatus",0);
  593. }
  594. }else {
  595. param.put("processStatus",in.getProcessStatus());
  596. }
  597. if (in.getExamineStatus()!=null){
  598. param.put("examineStatus",in.getExamineStatus());
  599. }else {
  600. param.put("examineStatus",0);
  601. }
  602. if (in.getContractNo()!=null)param.put("contractNo",in.getContractNo());
  603. if (in.getDepId()!=null)param.put("depId",in.getDepId());
  604. if (in.getUsername()!=null)param.put("username",in.getUsername());
  605. if (in.getApplyDep()!=null)param.put("applyDep",in.getApplyDep());
  606. if (in.getPayDep()!=null)param.put("payDep",in.getPayDep());
  607. if (in.getType()!=null)param.put("type",in.getContractNo());
  608. }
  609. /**
  610. * 检查权限判断是否是总裁、董事长或超级管理员权限
  611. * @return
  612. */
  613. private boolean checkShiroCED() {
  614. if (TokenManager.hasRole(AFTConstants.CED)||TokenManager.hasRole(AFTConstants.CED_ASSISTANT)||
  615. TokenManager.hasRole(AFTConstants.SUPERADMIN)||TokenManager.hasRole(AFTConstants.APPROVAL_DECISION_ASSISTANT)
  616. ||TokenManager.hasRole(AFTConstants.APPROVAL_DECISION)){
  617. return true;
  618. }
  619. return false;
  620. }
  621. @Override
  622. @Cacheable(value = "expenseAccountStatistics#300", key = "'page:'+#name+',depId'+#depId+',startTime'+#startTime+',endTime'+#endTime")
  623. public List<OutExpenseAccountStatistics> statistics(String name,String depId,String startTime,String endTime) {
  624. if (endTime!=null)endTime=endTime+" 23:59:59";
  625. List<OutMyEAStatistics> list = expenseAccountMapper.selectStatistics(name, depId, startTime, endTime);
  626. List<OutExpenseAccountStatistics> results=new ArrayList<>();
  627. Map<String ,Object> map=new HashMap<>();
  628. for (OutMyEAStatistics e : list) {
  629. OutExpenseAccountStatistics out = new OutExpenseAccountStatistics(e.getAid());
  630. out.setAname(e.getAname());
  631. if (e.getStatus() == 2) {
  632. if (e.getType() < 4) {
  633. out.setBx(1);
  634. out.setBxAmount(e.getTotalAmount());
  635. if (!e.getDebitId().equals(0)) {
  636. out.setDk(1);
  637. out.setDkAmount(e.getBxdkAmount());
  638. }
  639. } else if (e.getType() == 4) {
  640. out.setJz(1);
  641. out.setJzAmount(e.getTotalAmount());
  642. } else if (e.getType() == 5) {
  643. out.setDk(1);
  644. out.setDkAmount(e.getTotalAmount());
  645. }
  646. if (e.getTargetType() == 0) {
  647. out.setGdfyAmount(e.getTotalAmount());
  648. } else if (e.getTargetType() == 1) {
  649. out.setBxddAmount(e.getTotalAmount());
  650. }
  651. } else if (e.getStatus() < 2) {
  652. out.setWshs(1);
  653. } else if (e.getStatus() == 3) {
  654. out.setBhs(1);
  655. }
  656. //如果不存在就新增
  657. if (!map.keySet().contains(out.getAid())){
  658. List<OutExpenseAccountStatistics> list2=new ArrayList<>();
  659. list2.add(out);
  660. map.put(out.getAid(),list2);
  661. }else {
  662. List<OutExpenseAccountStatistics> list2 = (List<OutExpenseAccountStatistics>) map.get(e.getAid());
  663. list2.add(out);
  664. }
  665. }
  666. for (String s : map.keySet()) {
  667. List<OutExpenseAccountStatistics> list3 = (List<OutExpenseAccountStatistics>) map.get(s);
  668. if (!list3.isEmpty()){
  669. OutExpenseAccountStatistics out =new OutExpenseAccountStatistics(s);
  670. for (OutExpenseAccountStatistics e : list3) {
  671. if (out.getAname()==null)out.setAname(e.getAname());
  672. if (e.getBx()!=null)out.setBx(out.getBx()+e.getBx());
  673. if (e.getJz()!=null)out.setJz(out.getJz()+e.getJz());
  674. if (e.getDk()!=null)out.setDk(out.getDk()+e.getDk());
  675. if (e.getBxAmount()!=null)out.setBxAmount(out.getBxAmount().add(e.getBxAmount()));
  676. if (e.getJzAmount()!=null)out.setJzAmount(out.getJzAmount().add(e.getJzAmount()));
  677. if (e.getDkAmount()!=null)out.setDkAmount(out.getDkAmount().add(e.getDkAmount()));
  678. if (e.getGdfyAmount()!=null)out.setGdfyAmount(out.getGdfyAmount().add(e.getGdfyAmount()));
  679. if (e.getBxddAmount()!=null)out.setBxddAmount(out.getBxddAmount().add(e.getBxddAmount()));
  680. if (e.getWshs()!=null)out.setWshs(out.getWshs()+e.getWshs());
  681. if (e.getBhs()!=null)out.setBhs(out.getBhs()+e.getBhs());
  682. }
  683. BigDecimal totalAmount=new BigDecimal(0);
  684. totalAmount=totalAmount.add(out.getBxAmount()).add(out.getJzAmount()).subtract(out.getDkAmount());
  685. out.setTotalAmount(totalAmount);
  686. results.add(out);
  687. }
  688. }
  689. return results;
  690. }
  691. @Override
  692. @CacheEvict(value = "expenseAccountStatistics#300", allEntries = true)
  693. public void statisticsEvict(String name, String depId, String startTime, String endTime) {
  694. LoggerUtils.debug(getClass(), "报销统计清楚缓存。");
  695. }
  696. }