FundManagerOrderServiceImpl.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. package com.goafanti.order.service.impl;
  2. import java.io.UnsupportedEncodingException;
  3. import java.math.BigDecimal;
  4. import java.util.Calendar;
  5. import java.util.Date;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.UUID;
  10. import javax.mail.MessagingException;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Service;
  15. import com.goafanti.admin.bo.AdminListBo;
  16. import com.goafanti.common.bo.EmailBo;
  17. import com.goafanti.common.dao.AdminMapper;
  18. import com.goafanti.common.dao.NoticeMapper;
  19. import com.goafanti.common.dao.TOrderBackMapper;
  20. import com.goafanti.common.dao.TOrderBillNewMapper;
  21. import com.goafanti.common.dao.TOrderBonusMapper;
  22. import com.goafanti.common.dao.TOrderMonthReportMapper;
  23. import com.goafanti.common.dao.TOrderNewMapper;
  24. import com.goafanti.common.dao.TOrderRefundMapper;
  25. import com.goafanti.common.enums.NoticeStatus;
  26. import com.goafanti.common.model.Notice;
  27. import com.goafanti.common.model.TOrderBack;
  28. import com.goafanti.common.model.TOrderBillNew;
  29. import com.goafanti.common.model.TOrderBonus;
  30. import com.goafanti.common.model.TOrderNew;
  31. import com.goafanti.common.model.TOrderRefund;
  32. import com.goafanti.common.task.MonthReportTask;
  33. import com.goafanti.common.utils.LoggerUtils;
  34. import com.goafanti.common.utils.SendEmailUtil;
  35. import com.goafanti.common.utils.StringUtils;
  36. import com.goafanti.core.mybatis.BaseMybatisDao;
  37. import com.goafanti.core.mybatis.JDBCIdGenerator;
  38. import com.goafanti.core.mybatis.page.Pagination;
  39. import com.goafanti.core.shiro.token.TokenManager;
  40. import com.goafanti.order.bo.OrderListBo;
  41. import com.goafanti.order.bo.TOrderNewBo;
  42. import com.goafanti.order.service.FundManageOrderService;
  43. @Service
  44. public class FundManagerOrderServiceImpl extends BaseMybatisDao<TOrderNewMapper> implements FundManageOrderService {
  45. @Autowired
  46. private TOrderNewMapper tOrderNewMapper;
  47. @Autowired
  48. private AdminMapper adminMapper;
  49. @Autowired
  50. private TOrderBillNewMapper billNewMapper;
  51. @Autowired
  52. private TOrderBackMapper backMapper;
  53. @Autowired
  54. private TOrderRefundMapper refundMapper;
  55. @Autowired
  56. private TOrderBonusMapper bonusMapper;
  57. @Autowired
  58. private TOrderMonthReportMapper monthReportMapper;
  59. @Autowired
  60. JDBCIdGenerator idGenerator;
  61. @Autowired
  62. NoticeMapper noticeMapper;
  63. Logger logger = LoggerFactory.getLogger(FundManagerOrderServiceImpl.class);
  64. @SuppressWarnings("unchecked")
  65. @Override
  66. public Pagination<OrderListBo> allUnassignedOrder(OrderListBo order, Integer pageNo,
  67. Integer pageSize,Integer ob) {
  68. Map<String, Object> params = new HashMap<String, Object>();
  69. params.put("o", order);
  70. params.put("ob", ob);
  71. Pagination<OrderListBo> data = (Pagination<OrderListBo>)findPage("getAllUnassignedListOrder", "getAllUnassignedCountOrder", params, pageNo, pageSize);
  72. return data;
  73. }
  74. @Override
  75. public Integer updateDistributionFinance(String orderNo, String financeId, Integer approval) {
  76. // 先判断订单id和财务专员是否存在或者能够使用
  77. //判断是不是特批的数据
  78. if(approval != 2 && approval != 0){//特批未通过
  79. return -1;
  80. }
  81. TOrderNew onew = new TOrderNew();
  82. onew.setOrderNo(orderNo);
  83. onew.setDeleteSign(0);//正常
  84. onew.setProcessStatus(2);//已派财务管理员
  85. onew.setApproval(approval);//特批状态
  86. onew.setOrderStatus(2);//营销管理员审核通过
  87. int idCount = tOrderNewMapper.getCountByIdAndStatus(onew);
  88. int fidCount = adminMapper.getCountById(financeId);
  89. Integer r = null;
  90. if(idCount == 1 && fidCount == 1){
  91. //修改订单流程状态
  92. TOrderNew record = new TOrderNew();
  93. record.setOrderNo(orderNo);
  94. record.setFinanceId(financeId);
  95. record.setProcessStatus(3);
  96. r = tOrderNewMapper.updateByPrimaryKeySelective(record);
  97. }else{
  98. //返回错误标志 提示订单编号或者财务专员选择错误
  99. r = -2;
  100. }
  101. return r;
  102. }
  103. @SuppressWarnings("unchecked")
  104. @Override
  105. public Pagination<OrderListBo> financeList(OrderListBo order,
  106. Integer pageNo, Integer pageSize) {
  107. Map<String, Object> params = new HashMap<String, Object>();
  108. params.put("o", order);
  109. Pagination<OrderListBo> data = (Pagination<OrderListBo>)findPage("financeList", "financeCount", params, pageNo, pageSize);
  110. return data;
  111. }
  112. @Override
  113. public Integer updateReject(TOrderBack back) {
  114. // 是否已经收款
  115. BigDecimal bd = billNewMapper.getAmountByOid(back.getOrderNo());
  116. if(bd.compareTo(new BigDecimal(0.0)) == 1){
  117. return 0;//已经收款不能驳回
  118. }
  119. TOrderNewBo b = tOrderNewMapper.getSaleIdByOno(back.getOrderNo());//订单和订单负责人相关信息
  120. if(null == b || StringUtils.isBlank(b.getSalesmanId())){
  121. return -1;
  122. }
  123. //否 可以处理驳回
  124. //修改订单状态
  125. TOrderNew orderNew = new TOrderNew();
  126. orderNew.setOrderNo(back.getOrderNo());
  127. // TODO
  128. orderNew.setOrderStatus(5);
  129. int c = tOrderNewMapper.updateByPrimaryKeySelective(orderNew);
  130. //新增驳回数据
  131. if(c>0){
  132. back.setBackStatus(0);
  133. back.setInitiate(TokenManager.getAdminId());//发起人
  134. back.setAccept(b.getSalesmanId()); //查看该订单的负责人
  135. c = backMapper.insertSelective(back);
  136. //发送站内消息
  137. addNotic(back.getOrderNo(),15,b.getSalesmanId());
  138. if(StringUtils.isNotBlank(b.getEmail())){ //邮箱不为空发送邮件
  139. AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId());
  140. //发送驳回邮件
  141. String content = "<div>客户名称: "+ b.getUserName() +"</div><div>订单编号: " + back.getOrderNo() + "</div>";
  142. EmailBo bo = new EmailBo("订单驳回", b.getEmail(), b.getSalesmanName(), a.getDepartmentName(), a.getName(), content);
  143. try {
  144. SendEmailUtil.getInstance().send(bo);
  145. } catch (UnsupportedEncodingException e) {
  146. // TODO Auto-generated catch block
  147. e.printStackTrace();
  148. } catch (MessagingException e) {
  149. // TODO Auto-generated catch block
  150. e.printStackTrace();
  151. }
  152. }
  153. }
  154. return c;
  155. }
  156. @Override
  157. public Integer addReceiptsFlow(TOrderBillNew billNew) {
  158. //判断有没有要加入的金额有没有超过总金额
  159. BigDecimal bill = billNewMapper.getAmountByOid(billNew.getOrderNo());
  160. //获得的单个订单金额数据(首付金额和总金额)
  161. TOrderNew o = tOrderNewMapper.selectByPrimaryKey(billNew.getOrderNo());
  162. if(null == o){
  163. return -2;
  164. }
  165. BigDecimal bd = bill.add(billNew.getTransactionAmount().abs());
  166. //奖金信息
  167. TOrderBonus bonus = new TOrderBonus();
  168. bonus.setId(UUID.randomUUID().toString());
  169. bonus.setOrderNo(billNew.getOrderNo());
  170. bonus.setGrantBy(TokenManager.getAdminId());
  171. int lstaus = 0;//如果订单流水小于首付 lstaus 0
  172. // 0 相等
  173. // -1 小于
  174. // 1 大于
  175. if(bd.compareTo(o.getTotalAmount()) == 1){//如果订单流水总额大于总金额 return -1
  176. return -1;//超过不能添加
  177. }else if(bd.compareTo(o.getTotalAmount()) == 0){//付完款//如果订单流水等于于总金额 lstaus 2
  178. lstaus = 2;
  179. bonus.setBonusSubject(12);
  180. //发放给技术员
  181. if(null != o.getTechnicianId()){
  182. bonus.setGrantTarget(o.getTechnicianId());
  183. bonus.setGrantType(1);
  184. bonusMapper.insertSelective(bonus);
  185. //发送邮件
  186. // Admin oo = adminMapper.selectAllByid(o.getTechnicianId());
  187. // AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId());
  188. // String content = "<div>订单编号: "+ billNew.getOrderNo() +"</div><div>应收人: " + oo.getName() + "</div>";
  189. // EmailBo emailBo = new EmailBo("奖金发放", oo.getEmail(), oo.getName(), a.getDepartmentName(), a.getName(), content);
  190. // try {
  191. // SendEmailUtil.send(emailBo);
  192. // } catch (UnsupportedEncodingException e) {
  193. // e.printStackTrace();
  194. // } catch (MessagingException e) {
  195. // e.printStackTrace();
  196. // }
  197. }
  198. }else if(bd.compareTo(o.getTotalAmount()) == -1){//如果订单流水小于总金额
  199. if(bd.compareTo(o.getFirstAmount()) == 0 || bd.compareTo(o.getFirstAmount()) == 1){//首付完成
  200. //查看首付奖是否存在
  201. TOrderBonus b = new TOrderBonus();
  202. b.setOrderNo(billNew.getOrderNo());
  203. b.setBonusSubject(11);
  204. int c = bonusMapper.checkByOnoAndSub(b);
  205. //不存在就设置
  206. if(c==0){
  207. bonus.setBonusSubject(11);
  208. }
  209. lstaus = 1;
  210. }
  211. }
  212. //否则新增流水信息
  213. billNew.setBillNo(idGenerator.generateId().toString());
  214. billNew.setCreater(TokenManager.getAdminId());
  215. int result = billNewMapper.insertSelective(billNew);
  216. //修改订单结算金额和结算状态
  217. //如果已经首付并且流程状态是没有派给咨询师的修改流程状态为4
  218. TOrderNew orderNew = new TOrderNew();
  219. orderNew.setOrderNo(billNew.getOrderNo());
  220. //这里的已收金额是以前收的所有金额加上本次收的金额
  221. orderNew.setSettlementAmount(billNew.getTransactionAmount().add(o.getSettlementAmount()));
  222. orderNew.setLiquidationStatus(lstaus);
  223. if(lstaus == 1 && o.getProcessStatus() == 3){
  224. orderNew.setProcessStatus(4);
  225. }
  226. if(result > 0){
  227. result = tOrderNewMapper.updateByPrimaryKeySelective(orderNew);
  228. //如果达到奖金发放要求新增奖金信息
  229. if(null != bonus.getBonusSubject()){
  230. bonus.setId(UUID.randomUUID().toString());
  231. bonus.setGrantTarget(o.getSalesmanId());
  232. //设置发放人类型
  233. bonus.setGrantType(0);
  234. bonusMapper.insertSelective(bonus);
  235. //发送邮件
  236. // TOrderNewBo oo = tOrderNewMapper.getSaleIdByOno(billNew.getOrderNo());
  237. // AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId());
  238. // String content = "<div>订单编号: "+ billNew.getOrderNo() +"</div><div>应收人: " + oo.getSalesmanName() + "</div>";
  239. // EmailBo emailBo = new EmailBo("奖金发放", oo.getEmail(), oo.getSalesmanName(), a.getDepartmentName(), a.getName(), content);
  240. // try {
  241. // SendEmailUtil.send(emailBo);
  242. // } catch (UnsupportedEncodingException e) {
  243. // e.printStackTrace();
  244. // } catch (MessagingException e) {
  245. // e.printStackTrace();
  246. // }
  247. }
  248. }
  249. return result;
  250. }
  251. @Override
  252. public Integer updateChangeRefund(TOrderRefund refund) {
  253. //查看当前退单状态
  254. TOrderRefund d = refundMapper.selectByPrimaryKey(refund.getId());
  255. if(d.getRefundStatus() != 0){
  256. return -1;
  257. }
  258. //如果审核通过给咨询师和营销员发起退单通知
  259. if(refund.getRefundStatus() == 1){
  260. //修改订单状态
  261. TOrderNewBo o = tOrderNewMapper.agreeEmailData(refund.getId());
  262. TOrderNew record = new TOrderNew();
  263. record.setOrderNo(o.getOrderNo());
  264. record.setOrderStatus(7);
  265. tOrderNewMapper.updateByPrimaryKeySelective(record);
  266. //新增奖金信息表数据
  267. TOrderBonus bonus = new TOrderBonus();
  268. bonus.setId(UUID.randomUUID().toString());
  269. bonus.setOrderNo(o.getOrderNo());
  270. bonus.setGrantBy(TokenManager.getAdminId());
  271. bonus.setGrantTarget(o.getSalesmanId());
  272. bonus.setBonusSubject(16);
  273. bonusMapper.insertSelective(bonus);
  274. //发送站内消息
  275. addNotic(o.getOrderNo(),16,o.getSalesmanId());
  276. //退单邮件发送需要的数据
  277. AdminListBo a = adminMapper.getDeptNameByAid(TokenManager.getAdminId());
  278. String content = "<div>退单编号: "+ refund.getId() +"</div><div>客户名称: " + o.getUserName() + "</div>";
  279. content += "<div>订单编号: "+ o.getOrderNo() +"</div>";
  280. if(StringUtils.isNotEmpty(o.getEmail())){
  281. EmailBo emailBo = new EmailBo("同意退单", o.getEmail(), o.getSalesmanName(), a.getDepartmentName(), a.getName(), content);
  282. try {
  283. SendEmailUtil.getInstance().send(emailBo);
  284. } catch (UnsupportedEncodingException e) {
  285. // TODO Auto-generated catch block
  286. e.printStackTrace();
  287. } catch (MessagingException e) {
  288. // TODO Auto-generated catch block
  289. e.printStackTrace();
  290. }
  291. }
  292. }
  293. //修改退单审核状态
  294. return refundMapper.updateRefundById(refund);
  295. }
  296. @Override
  297. public Integer addRefundFlow(TOrderBillNew billNew) {
  298. // 查看收款总金额流水
  299. BigDecimal bd = billNewMapper.getAmountByOid(billNew.getOrderNo());
  300. billNew.setTransactionAmount(billNew.getTransactionAmount().abs());//绝对值
  301. int lstaus = 3;
  302. //如果小于要退的金额 return -1
  303. //如果等于要退的金额 lstatus 4
  304. //如果大于 要退的金额 lstatus 3
  305. if(bd.compareTo(billNew.getTransactionAmount()) == -1){
  306. return -1;
  307. }else if(bd.compareTo(billNew.getTransactionAmount()) == 0){
  308. lstaus = 4;
  309. }
  310. //新增退款流水
  311. billNew.setBillNo(idGenerator.generateId().toString());
  312. billNew.setCreater(TokenManager.getAdminId());
  313. billNew.setTransactionAmount(billNew.getTransactionAmount().negate());// 取负数
  314. int result = billNewMapper.insertSelective(billNew);
  315. //修改订单数据结算状态和结算金额
  316. TOrderNew orderNew = new TOrderNew();
  317. orderNew.setOrderNo(billNew.getOrderNo());
  318. TOrderNew o = tOrderNewMapper.selectByPrimaryKey(billNew.getOrderNo());
  319. //这里修改退款金额数据之前退的金额加上本次退的金额
  320. orderNew.setRefundAmount(billNew.getTransactionAmount().add(o.getRefundAmount()));
  321. orderNew.setLiquidationStatus(lstaus);
  322. if(lstaus == 4){//如果款项全部退完就更改订单状态,这里不一定待商榷
  323. //orderNew.setProcessStatus(6);
  324. }
  325. if(result > 0){
  326. result = tOrderNewMapper.updateByPrimaryKeySelective(orderNew);
  327. }
  328. return result;
  329. }
  330. @Override
  331. public TOrderBillNew selectOneRefundFlow(String BillNo) {
  332. return billNewMapper.getOneRefundFlow(BillNo);
  333. }
  334. @Override
  335. public List<TOrderBillNew> selectOneOrderAllRefundFlow(String orderNo) {
  336. return billNewMapper.getOneOrderAllRefundFlow(orderNo);
  337. }
  338. @Override
  339. public Integer updateProofreading(TOrderNew orderNew) {
  340. // 创建人
  341. orderNew.setProofAid(TokenManager.getAdminId());
  342. //校对状态
  343. orderNew.setProofStatus(1);
  344. //校对时间
  345. orderNew.setProofTime(new Date());
  346. tOrderNewMapper.updateByPrimaryKeySelective(orderNew);
  347. //获得订单数据
  348. TOrderNew new1 = tOrderNewMapper.selectByPrimaryKey(orderNew.getOrderNo());
  349. Calendar cal = Calendar.getInstance();
  350. cal.setTime(new1.getSignTime());
  351. int sy = cal.get(Calendar.YEAR);
  352. int sm = cal.get(Calendar.MONTH);
  353. Integer month = sy*100+sm;
  354. //重新校对月统计
  355. int c = monthReportMapper.updateByMonth(month);
  356. LoggerUtils.debug(logger, "更新订单统计【%s】条。", c);
  357. return 0;
  358. }
  359. public void addNotic(String orderNo,Integer type,String aid) {
  360. String id=TokenManager.getAdminId()==null?"1":TokenManager.getAdminId();
  361. AdminListBo a = adminMapper.getDeptNameByAid(id);
  362. String str=NoticeStatus.getValueByCode(type)+": 订单编号 -"+orderNo+", 操作人:"+a.getDepartmentName()+"-"+a.getName()+"。";
  363. Notice n =new Notice();
  364. n.setId(UUID.randomUUID().toString());
  365. n.setAid(aid);//通知人
  366. n.setNoticeType(type);
  367. n.setContent(str);
  368. n.setReaded(0);//未读
  369. noticeMapper.insertSelective(n);
  370. }
  371. }