OrderInvoiceServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. package com.goafanti.order.service.impl;
  2. import com.goafanti.admin.service.DepartmentService;
  3. import com.goafanti.common.constant.AFTConstants;
  4. import com.goafanti.common.dao.*;
  5. import com.goafanti.common.enums.NoticeStatus;
  6. import com.goafanti.common.model.*;
  7. import com.goafanti.common.utils.DateUtils;
  8. import com.goafanti.core.mybatis.BaseMybatisDao;
  9. import com.goafanti.core.mybatis.page.Pagination;
  10. import com.goafanti.core.shiro.token.TokenManager;
  11. import com.goafanti.order.bo.*;
  12. import com.goafanti.order.service.OrderInvoiceService;
  13. import com.goafanti.order.service.OrderNewService;
  14. import com.goafanti.organization.bo.OrganizationListOut;
  15. import org.apache.commons.lang3.StringUtils;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.stereotype.Service;
  18. import java.math.BigDecimal;
  19. import java.util.*;
  20. @Service
  21. public class OrderInvoiceServiceImpl extends BaseMybatisDao<TOrderInvoiceMapper> implements OrderInvoiceService {
  22. @Autowired
  23. private TOrderInvoiceMapper tOrderInvoiceMapper;
  24. @Autowired
  25. private TOrderNewMapper tOrderNewMapper;
  26. @Autowired
  27. private DepartmentMapper departmentMapper;
  28. @Autowired
  29. private AdminMapper adminMapper;
  30. @Autowired
  31. private OrderNewService orderNewService;
  32. @Autowired
  33. private TOrderMidMapper tOrderMidMapper;
  34. @Autowired
  35. private InvoiceLogMapper invoiceLogMapper;
  36. @Autowired
  37. private DepartmentService departmentService;
  38. @Autowired
  39. private FinanceCountMapper financeCountMapper;
  40. @Override
  41. public int createServiceOrder(TOrderInvoice o) {
  42. o.setCreateTime(new Date());
  43. sendNoticeAndEmail(o);
  44. //前端直接会直接调取上一个发起数据给新开票,防止前一个数据为审核后
  45. if (o.getApproval()==2)o.setApproval(1);
  46. if (o.getStatus()!=1)o.setStatus(1);
  47. pushOrderInvoiceExamine(o);
  48. Integer i=tOrderInvoiceMapper.insertSelective(o);
  49. addInvoiceLog(o.getId(),0);
  50. //非特批直接发到财务
  51. if (o.getApproval()==0&&o.getType()==0){
  52. String startTime = DateUtils.formatDate(o.getCreateTime(),AFTConstants.YYYYMMDD);
  53. Admin admin = adminMapper.selectOrderByFinanace(o.getOrderNo());
  54. FinanceCount financeCount = financeCountMapper.selectByAidAndDates(admin.getId(), startTime);
  55. addFinanceCount(startTime, admin, financeCount);
  56. }
  57. return i;
  58. }
  59. private void pushOrderInvoiceExamine(TOrderInvoice o) {
  60. //新增与修改
  61. List<Admin> admins =new ArrayList<>();
  62. StringBuffer str=new StringBuffer();
  63. TOrderNewBo t = tOrderNewMapper.getSaleIdByOno(o.getOrderNo());
  64. if (o.getType()==0){
  65. if (o.getApproval()==0){
  66. addExamineFinance(o, t);
  67. }else if(o.getApproval()==1&&o.getStatus()==1){
  68. admins = adminMapper.getAdminRoleTypeList(AFTConstants.HN_APPROVED);
  69. }else if (o.getApproval()==2){
  70. addExamineFinance(o, t);
  71. }else if (o.getApproval()==1&&o.getStatus()==3){
  72. o.setExamineName("");
  73. }
  74. }else if (o.getType()==1){
  75. if(o.getApproval()==0) {
  76. admins = adminMapper.listAdminBydepIdAndRoleType(t.getOrderDep(), AFTConstants.SALESMAN_ADMIN);
  77. }else if(o.getApproval()==1&&o.getStatus()==1) {
  78. admins = adminMapper.listAdminBydepIdAndRoleType(t.getOrderDep(), AFTConstants.COMPANY_MANAGER);
  79. }else if (o.getApproval()==2){
  80. admins = adminMapper.listAdminBydepIdAndRoleType(t.getOrderDep(), AFTConstants.SALESMAN_ADMIN);
  81. }else if (o.getApproval()==1&&o.getStatus()==3){
  82. o.setExamineName("");
  83. }
  84. }
  85. if (!admins.isEmpty()){
  86. for (Admin a : admins) {
  87. if (!str.toString().contains(a.getName()))str=str.append(a.getName()).append(",");
  88. }
  89. if (str.length()>0)o.setExamineName(str.substring(0,str.length()-1));
  90. }
  91. }
  92. private void addExamineFinance(TOrderInvoice o, TOrderNewBo t) {
  93. OrganizationListOut dep = departmentMapper.selectAllById(t.getOrderDep());
  94. o.setExamineName(dep.getFinanceName());
  95. }
  96. /**
  97. *
  98. * @param id 开票编号
  99. * @param status 0发起 1开票通过 2开票拒绝 3特批通过 4特批拒绝 5修改提交
  100. */
  101. void addInvoiceLog(Integer id, Integer status){
  102. InvoiceLog log = new InvoiceLog(id,status,TokenManager.getAdminId());
  103. invoiceLogMapper.insertSelective(log);
  104. }
  105. @Override
  106. public int updateServiceOrder(TOrderInvoice o) {
  107. sendNoticeAndEmail(o);
  108. addInvoiceLog(o.getId(),5);
  109. o.setStatus(1);
  110. if (o.getApproval()==2)o.setApproval(1);
  111. pushOrderInvoiceExamine(o);
  112. int i=tOrderInvoiceMapper.updateByPrimaryKeySelective(o);
  113. if (o.getApproval()==0){
  114. TOrderInvoice use = tOrderInvoiceMapper.selectByPrimaryKey(o.getId());
  115. String startTime = DateUtils.formatDate(use.getCreateTime(),AFTConstants.YYYYMMDD);
  116. Admin admin = adminMapper.selectOrderByFinanace(o.getOrderNo());
  117. FinanceCount financeCount = financeCountMapper.selectByAidAndDates(admin.getId(), startTime);
  118. addFinanceCount(startTime, admin, financeCount);
  119. }
  120. return i;
  121. }
  122. /**
  123. * 开票提交发送站内消息及邮件
  124. * @param o
  125. */
  126. private void sendNoticeAndEmail(TOrderInvoice o) {
  127. List<String> aids = new ArrayList<>();
  128. if (o.getStatus()==1) {//发起
  129. TOrderNew t=tOrderNewMapper.queryById(o.getOrderNo());
  130. if (o.getType()==0) {//省内
  131. if(o.getApproval()==0) {
  132. aids.add(departmentMapper.selectByPrimaryKey(t.getOrderDep()).getFinanceId());
  133. }else {
  134. for (Admin admin : adminMapper.getAdminRoleNameList("湖南特批开票")) {
  135. aids.add(admin.getId());
  136. }
  137. }
  138. }else if (o.getType()==1) {//省外
  139. if(o.getApproval()==0) {
  140. aids.addAll(adminMapper.listNameByDepAndName(t.getOrderDep(), AFTConstants.SALESMAN_ADMIN));
  141. }else {
  142. aids.addAll(adminMapper.listNameByDepAndName(t.getOrderDep(), AFTConstants.COMPANY_MANAGER));
  143. }
  144. }
  145. }
  146. TOrderNewBo order = tOrderNewMapper.getSaleIdByOno(o.getOrderNo());
  147. pushGeneralSendNoticeAndEmail(aids, NoticeStatus.ORDER_INVPICE_START.getCode(),order, TokenManager.getAdminId(),0);
  148. }
  149. public void pushGeneralSendNoticeAndEmail(List<String> alist, Integer type,TOrderNewBo o,String adminId,Integer approval){
  150. orderNewService.pushGeneralSendNoticeAndEmail(alist, type,o, adminId,approval);
  151. }
  152. @SuppressWarnings("deprecation")
  153. @Override
  154. public boolean checkAmount(TOrderInvoice t) {
  155. TOrderNew tn=tOrderNewMapper.queryById(t.getOrderNo());
  156. String i=tOrderInvoiceMapper.checkApplyAmount(t.getOrderNo(),t.getId());//新建时直接查所有数据,修改时除掉修改订单
  157. //处理精度问题
  158. BigDecimal q=t.getAmount().add(new BigDecimal(i)).setScale(4, BigDecimal.ROUND_DOWN);;
  159. BigDecimal w=tn.getTotalAmount();
  160. int flag=q.compareTo(w);
  161. if (flag>0) {
  162. return true;
  163. }
  164. return false;
  165. }
  166. @SuppressWarnings("unchecked")
  167. @Override
  168. public Pagination<TOrderInvoiceBo> financeOrderInvoiceList(InputOrderInvoiceBo o,Integer pageNo,
  169. Integer pageSize) {
  170. Map<String, Object> params = new HashMap<String, Object>();
  171. if(pageSize==null||pageSize<0)pageSize=10;
  172. if(pageNo==null||pageNo<0)pageNo=1;
  173. List<String> aDep=new ArrayList<>();
  174. //财务专员查看自己的
  175. if (TokenManager.hasRole(AFTConstants.FINANCE)) {
  176. aDep.addAll(adminMapper.getFinanceDep(TokenManager.getAdminId()));
  177. }
  178. //财务经理
  179. if (TokenManager.hasRole(AFTConstants.FINANCE_MANAGER)) {
  180. aDep.addAll(adminMapper.selectDepIdWithSpuerId(TokenManager.getAdminId()));
  181. }
  182. //营销管理员
  183. if (TokenManager.hasRole(AFTConstants.SALESMAN_ADMIN)) {
  184. aDep.addAll(departmentService.selectMyDeps());
  185. }
  186. if (TokenManager.hasRole(AFTConstants.FINANCE_ADMIN)) {
  187. if (o.getDeps()!=null){
  188. aDep.addAll(departmentService.parseArray(o.getDeps()));
  189. }
  190. }
  191. if(o.getDeps()==null){
  192. if (!aDep.isEmpty()){
  193. params.put("deps", aDep);
  194. }
  195. }else {
  196. aDep=departmentService.comparePermissions(aDep,o.getDeps());
  197. if (aDep.isEmpty()){
  198. return new Pagination<>(1,10,0);
  199. }
  200. params.put("deps", aDep);
  201. }
  202. if(o.getType()!=null)params.put("type", o.getType());
  203. if (null !=o.getAll()){
  204. params.put("all",o.getAll());
  205. }else {
  206. params.put("all",0);
  207. }
  208. if(StringUtils.isNotBlank(o.getOrderNo()))params.put("orderNo", o.getOrderNo());
  209. if(StringUtils.isNotBlank(o.getName()))params.put("name", o.getName());
  210. if(null!=o.getApproval())params.put("approval", o.getApproval());
  211. if(null!=o.getStatus())params.put("status", o.getStatus());
  212. if(null!=o.getContractNo())params.put("contractNo", o.getContractNo());
  213. //这里不是客户得名称,而是开票的单位名称
  214. if(null!=o.getUserName())params.put("userName", o.getUserName());
  215. if(null!=o.getInvoiceType())params.put("invoiceType", o.getInvoiceType());
  216. if(null!=o.getStartTime())params.put("startTime", o.getStartTime());
  217. if(null!=o.getEndTime())params.put("endTime", o.getEndTime()+" 23:59:59");
  218. return (Pagination<TOrderInvoiceBo>)findPage("financeOrderInvoiceList", "financeOrderInvoiceCount", params, pageNo, pageSize);
  219. }
  220. @Override
  221. public TOrderInvoiceDetails selectByIdOrderInvoice(Integer id) {
  222. return tOrderInvoiceMapper.selectByInvoiceDitails(id);
  223. }
  224. @Override
  225. public TOrderInvoiceDetails getInvoiceDetails(String orderNo) {
  226. return tOrderInvoiceMapper.getInvoiceDetails(orderNo);
  227. }
  228. @SuppressWarnings("unchecked")
  229. @Override
  230. public Pagination<TOrderInvoiceBo> salesmanOrderInvoiceList( String orderNo,
  231. Integer pageNo, Integer pageSize) {
  232. Map<String, Object> params = new HashMap<String, Object>();
  233. if(pageSize==null||pageSize<0)pageSize=10;
  234. if(pageNo==null||pageNo<0)pageNo=1;
  235. if(StringUtils.isNotBlank(orderNo))params.put("orderNo", orderNo);
  236. return (Pagination<TOrderInvoiceBo>)findPage("salesmanOrderInvoiceList", "salesmanOrderInvoiceCount", params, pageNo, pageSize);
  237. }
  238. @Override
  239. public int updatefinanceExamine(Integer id, Integer examine, String reason) {
  240. TOrderInvoice t=new TOrderInvoice();
  241. t.setId(id);
  242. t.setRejectReason(reason);
  243. t.setStatus(examine);
  244. t.setExamineName("");
  245. //examine 2通过 3拒绝
  246. List<String> aids = new ArrayList<>();
  247. TOrderInvoice t2=tOrderInvoiceMapper.selectByPrimaryKey(id);
  248. TOrderNew o=tOrderNewMapper.queryById(t2.getOrderNo());
  249. Integer type=null;
  250. if(examine==3){
  251. type=NoticeStatus.ORDER_INVPICE_NO.getCode();
  252. aids.add(o.getSalesmanId());
  253. addInvoiceLog(id,2);
  254. }else if(examine==2) {
  255. type=NoticeStatus.ORDER_INVPICE_END.getCode();
  256. aids.add(o.getSalesmanId());
  257. //重新计算开票金额
  258. addInvoiceLog(id,1);
  259. }
  260. pushInvoiceFinancialCount(t2,examine);
  261. TOrderNewBo order = tOrderNewMapper.getSaleIdByOno(t2.getOrderNo());
  262. pushGeneralSendNoticeAndEmail(aids, type,order, TokenManager.getAdminId(),0);
  263. tOrderInvoiceMapper.updateByPrimaryKeySelective(t);
  264. if(examine==2)tOrderMidMapper.updateInvoice(t2.getOrderNo());
  265. return 1;
  266. }
  267. /**
  268. *
  269. * @param t2 开票信息
  270. * @param examine 2通过 3拒绝
  271. */
  272. private void pushInvoiceFinancialCount(TOrderInvoice t2, Integer examine) {
  273. String startTime = DateUtils.formatDate(t2.getCreateTime(),AFTConstants.YYYYMMDD);
  274. Admin admin = adminMapper.selectOrderByFinanace(t2.getOrderNo());
  275. FinanceCount financeCount = financeCountMapper.selectByAidAndDates(admin.getId(), startTime);
  276. if (examine==2){
  277. //特批通过和特批是财务审核
  278. if (financeCount!=null&&(t2.getApproval()==2||t2.getApproval()==0)){
  279. FinanceCount newFinanceCount=new FinanceCount();
  280. newFinanceCount.setId(financeCount.getId());
  281. newFinanceCount.setInvoiceUnauditedCount(financeCount.getInvoiceUnauditedCount()-1);
  282. financeCountMapper.updateByPrimaryKeySelective(newFinanceCount);
  283. //特批审核是审核完到财务
  284. }else if (t2.getApproval()==1){
  285. addFinanceCount(startTime, admin, financeCount);
  286. }
  287. }else if (examine==3){
  288. if (financeCount!=null&&(t2.getApproval()==2||t2.getApproval()==0)){
  289. FinanceCount newFinanceCount=new FinanceCount();
  290. newFinanceCount.setId(financeCount.getId());
  291. newFinanceCount.setInvoiceCount(financeCount.getInvoiceCount()-1);
  292. newFinanceCount.setInvoiceUnauditedCount(financeCount.getInvoiceUnauditedCount()-1);
  293. financeCountMapper.updateByPrimaryKeySelective(newFinanceCount);
  294. }
  295. }
  296. }
  297. private void addFinanceCount(String startTime, Admin admin, FinanceCount financeCount) {
  298. if (financeCount ==null){
  299. financeCount =FinanceCount.initialization(admin.getId(), startTime);
  300. financeCount.setInvoiceCount(1);
  301. financeCount.setInvoiceUnauditedCount(1);
  302. financeCountMapper.insertSelective(financeCount);
  303. }else {
  304. FinanceCount newFinanceCount=new FinanceCount();
  305. newFinanceCount.setId(financeCount.getId());
  306. newFinanceCount.setInvoiceCount(financeCount.getInvoiceCount()+1);
  307. newFinanceCount.setInvoiceUnauditedCount(financeCount.getInvoiceUnauditedCount()+1);
  308. financeCountMapper.updateByPrimaryKeySelective(newFinanceCount);
  309. }
  310. }
  311. @SuppressWarnings("unchecked")
  312. @Override
  313. public Pagination<TOrderInvoiceBo> approvalOrderInvoiceList(Integer status,Integer approval,Integer type, String orderDep, String orderNo, String name,String userName,
  314. Integer pageNo, Integer pageSize) {
  315. Map<String, Object> params = new HashMap<String, Object>();
  316. if(pageSize==null||pageSize<0)pageSize=10;
  317. if(pageNo==null||pageNo<0)pageNo=1;
  318. if(StringUtils.isNotBlank(orderDep))params.put("orderDep", orderDep);
  319. if(StringUtils.isNotBlank(orderNo))params.put("orderNo", orderNo);
  320. if(StringUtils.isNotBlank(name))params.put("name", name);
  321. if(StringUtils.isNotBlank(userName))params.put("userName", userName);
  322. if(approval!=null)params.put("approval", approval);
  323. if(status!=null)params.put("status", status);
  324. //0省内 1省外 2查看所有省外
  325. if(type==0||type==1)params.put("type", type);
  326. if (type==2) {
  327. params.put("type", 1);
  328. params.put("special", 1);
  329. }
  330. if (type ==1&&!TokenManager.hasRole(AFTConstants.SUPERADMIN)) {
  331. //如果是省外则直接查本部门
  332. Admin a=adminMapper.selectById(TokenManager.getAdminId());
  333. params.put("aDep", a.getDepartmentId());
  334. }
  335. return (Pagination<TOrderInvoiceBo>)findPage("approvalOrderInvoiceList", "approvalOrderInvoiceCount", params, pageNo, pageSize);
  336. }
  337. @Override
  338. public int updateapprovalExamine(Integer id, Integer examine, String reason) {
  339. TOrderInvoice t=new TOrderInvoice();
  340. t.setId(id);
  341. t.setRejectReason(reason);
  342. List<String> aids=new ArrayList<>();
  343. TOrderInvoice o=tOrderInvoiceMapper.selectByPrimaryKey(id);
  344. t.setApproval(o.getApproval());
  345. t.setType(o.getType());
  346. t.setStatus(o.getStatus());
  347. t.setOrderNo(o.getOrderNo());
  348. TOrderNew ts=tOrderNewMapper.queryById(o.getOrderNo());
  349. //examine 2通过 3拒绝
  350. Integer type =null;
  351. if(examine==3) {
  352. t.setStatus(examine);
  353. type= NoticeStatus.ORDER_INVPICE_APPROVA_NO.getCode();
  354. aids.add(ts.getSalesmanId());
  355. addInvoiceLog(id,4);
  356. }else {
  357. t.setApproval(examine);
  358. addInvoiceLog(id,3);
  359. type= NoticeStatus.ORDER_INVPICE_APPROVA_YES.getCode();
  360. if (o.getType()==0) {
  361. aids.add(departmentMapper.selectByPrimaryKey(ts.getOrderDep()).getFinanceId());
  362. }else if(o.getType()==1) {
  363. aids.addAll(adminMapper.listNameByDepAndName(ts.getOrderDep(), AFTConstants.SALESMAN_ADMIN));
  364. }
  365. String startTime = DateUtils.formatDate(o.getCreateTime(),AFTConstants.YYYYMMDD);
  366. Admin admin = adminMapper.selectOrderByFinanace(o.getOrderNo());
  367. FinanceCount financeCount = financeCountMapper.selectByAidAndDates(admin.getId(), startTime);
  368. addFinanceCount(startTime,admin,financeCount);
  369. }
  370. pushOrderInvoiceExamine(t);
  371. TOrderNewBo order = tOrderNewMapper.getSaleIdByOno(o.getOrderNo());
  372. pushGeneralSendNoticeAndEmail(aids,type,order, TokenManager.getAdminId(),0);
  373. return tOrderInvoiceMapper.updateByPrimaryKeySelective(t);
  374. }
  375. @Override
  376. public List<OutInvoiceLog> InvoiceLog(Integer id) {
  377. List<OutInvoiceLog> list=tOrderInvoiceMapper.selectInvoiceLog(id);
  378. return list;
  379. }
  380. @Override
  381. public boolean checkDelete(Integer id) {
  382. TOrderInvoice t=tOrderInvoiceMapper.selectByPrimaryKey(id);
  383. return t.getStatus() == 1 || t.getStatus() == 2;
  384. }
  385. @Override
  386. public Object delete(Integer id) {
  387. TOrderInvoice t=new TOrderInvoice();
  388. t.setId(id);
  389. t.setStatus(4);
  390. return tOrderInvoiceMapper.updateByPrimaryKeySelective(t);
  391. }
  392. }