CmDiscernReceiptService.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. package com.caimei.modules.order.service;
  2. import com.caimei.modules.hehe.dao.HeHeNewOrderDao;
  3. import com.caimei.modules.order.dao.*;
  4. import com.caimei.modules.order.entity.*;
  5. import com.caimei.modules.user.dao.CmUserBalanceRecordDao;
  6. import com.caimei.modules.user.dao.NewCmShopDao;
  7. import com.caimei.modules.user.entity.CmUserBalanceRecord;
  8. import com.caimei.modules.user.entity.NewCmShop;
  9. import com.caimei.utils.MathUtil;
  10. import com.thinkgem.jeesite.common.persistence.Page;
  11. import com.thinkgem.jeesite.common.service.CrudService;
  12. import com.thinkgem.jeesite.common.utils.DateUtils;
  13. import com.thinkgem.jeesite.common.utils.ObjectUtils;
  14. import com.thinkgem.jeesite.common.utils.StringUtils;
  15. import com.thinkgem.jeesite.modules.sys.entity.User;
  16. import com.thinkgem.jeesite.modules.sys.utils.UserUtils;
  17. import org.apache.commons.collections.CollectionUtils;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import javax.annotation.Resource;
  21. import java.math.BigDecimal;
  22. import java.util.ArrayList;
  23. import java.util.Date;
  24. import java.util.List;
  25. import java.util.Map;
  26. /**
  27. * 识别款项表Service
  28. *
  29. * @author lwt
  30. * @version 2019-06-19
  31. */
  32. @Service
  33. @Transactional(readOnly = true)
  34. public class CmDiscernReceiptService extends CrudService<CmDiscernReceiptDao, CmDiscernReceipt> {
  35. @Resource
  36. private CmDiscernReceiptDao cmDiscernReceiptDao;
  37. @Resource
  38. private NewOrderDao newOrderDao;
  39. @Resource
  40. private CmReceiptOrderRelationService cmReceiptOrderRelationService;
  41. @Resource
  42. private CmRebateRecordDao cmRebateRecordDao;
  43. @Resource
  44. private NewCmShopDao newCmShopDao;
  45. @Resource
  46. private NewShopOrderDao newShopOrderDao;
  47. @Resource
  48. private HeHeNewOrderDao heHeNewOrderDao;
  49. @Resource
  50. private CmRefundShopRecordDao cmRefundShopRecordDao;
  51. @Resource
  52. private CmUserBalanceRecordDao cmUserBalanceRecordDao;
  53. public CmDiscernReceipt get(String id) {
  54. return super.get(id);
  55. }
  56. public List<CmDiscernReceipt> findList(CmDiscernReceipt cmDiscernReceipt) {
  57. return super.findList(cmDiscernReceipt);
  58. }
  59. public Page<CmDiscernReceipt> findPage(Page<CmDiscernReceipt> page, CmDiscernReceipt cmDiscernReceipt) {
  60. Page<CmDiscernReceipt> result = super.findPage(page, cmDiscernReceipt);
  61. result.getList().forEach(bean -> {
  62. logger.info("-----------------:::::" + bean.getId());
  63. String type = "";
  64. String no = "";
  65. if ("1".equals(bean.getReceiptType()) || "3".equals(bean.getReceiptType()) || "5".equals(bean.getReceiptType())) {
  66. List<Map<String, Object>> orderIDs = cmDiscernReceiptDao.getOrderIDStr(bean.getId());
  67. for (Map<String, Object> map : orderIDs) {
  68. if (!ObjectUtils.isEmpty(map)) {
  69. if ("".equals(type)) {
  70. // 协销订单 0 普通订单 1',
  71. Integer orderType = (Integer) map.get("orderType");
  72. if (null != map.get("orderType")) {
  73. type += map.get("orderType").toString().equals("0") ? "协销" : "自主";
  74. } else {
  75. type += "自主";
  76. }
  77. if (2 == orderType) {
  78. //呵呵商城订单
  79. Integer orderId = ((Long) map.get("orderID")).intValue();
  80. NewOrder order = newOrderDao.findByOrderID(orderId);
  81. String name = heHeNewOrderDao.findHeUser(order.getUserID());
  82. bean.setName(name);
  83. bean.setReceiptOrderType("2");
  84. }
  85. } else {
  86. type += ("<br>" + (map.get("orderType").toString().equals("0") ? "协销" : "自主"));
  87. }
  88. if ("".equals(no)) {
  89. no += "<a href='/a/order/detail?id=" + map.get("orderID") + "'>" + map.get("orderNo") + "</a>";
  90. } else {
  91. no += ("<br><a href='/a/order/detail?id=" + map.get("orderID") + "'>" + map.get("orderNo")) + "</a>";
  92. }
  93. }
  94. }
  95. }
  96. if ("6".equals(bean.getReceiptType())) {
  97. // 超级会员款
  98. Integer vipRecordId = cmDiscernReceiptDao.getVipRecordId(bean.getId());
  99. Integer userId = cmDiscernReceiptDao.getVipUserId(vipRecordId);
  100. String userName = cmDiscernReceiptDao.getUserNameByUserId(userId);
  101. bean.setName(userName);
  102. }
  103. if ("7".equals(bean.getReceiptType())) {
  104. //二手商品上架费
  105. bean.setName("-----");
  106. }
  107. bean.setOrders(no);
  108. bean.setOrderType(type);
  109. });
  110. return result;
  111. }
  112. @Transactional(readOnly = false)
  113. public void save(CmDiscernReceipt cmDiscernReceipt) {
  114. super.save(cmDiscernReceipt);
  115. }
  116. @Transactional(readOnly = false)
  117. public void delete(CmDiscernReceipt cmDiscernReceipt) {
  118. super.delete(cmDiscernReceipt);
  119. }
  120. public ReceiptDetailVo detail(CmDiscernReceipt cmDiscernReceipt) {
  121. ReceiptDetailVo vo = cmDiscernReceiptDao.getInfos(cmDiscernReceipt.getId());
  122. List<CmReceiptOrderRelation> relations = cmReceiptOrderRelationService.findByReceiptID(cmDiscernReceipt.getId());
  123. boolean receiptOrderFlag = false;
  124. if (CollectionUtils.isNotEmpty(relations) && relations.size() > 1) {
  125. receiptOrderFlag = true;
  126. }
  127. vo.setReceiptOrderFlag(receiptOrderFlag);//设置一款多单状态
  128. List<ReceiptOrderInfoVo> orderInfos = new ArrayList<>(); //一个收款可能会关联了一个或多个订单
  129. for (CmReceiptOrderRelation relation : relations) {
  130. ReceiptOrderInfoVo roi = null; //这是通过订单列表上的一条收款记录对应的多个订单中的一个订单
  131. if ("1".equals(relation.getRelationType())) { // relation.orderID 指的是子订单id
  132. roi = cmDiscernReceiptDao.getOrderInfoByShopOrderID(relation.getOrderID());
  133. if (null != roi) {
  134. roi.setRelationType("1");
  135. if ("5".equals(vo.getReceiptType())) {
  136. //供应商退款,已退金额
  137. List<CmRefundShopRecord> records = cmRefundShopRecordDao.getRefundedRecords(roi.getShopOrderID());
  138. if (records != null && records.size() > 0) {
  139. Double collect = records.stream().mapToDouble(CmRefundShopRecord::getRefundAmount).sum();
  140. roi.setRefundsAmount(collect);
  141. } else {
  142. roi.setRefundsAmount(0d);
  143. }
  144. //查询收款供应商退款金额
  145. /*BigDecimal shopRefundAmount = cmRefundShopRecordDao.findShopRefund(Integer.valueOf(roi.getShopOrderID()));
  146. BigDecimal refundsAmount = MathUtil.add(roi.getRefundsAmount(), shopRefundAmount);
  147. roi.setRefundsAmount(refundsAmount.doubleValue());*/
  148. }
  149. }
  150. }
  151. if ("2".equals(relation.getRelationType())) { // relation.orderID 指的是主订单id
  152. roi = cmDiscernReceiptDao.getOrderInfoByOrderID(relation.getOrderID());
  153. if (null != roi) {
  154. roi.setRelationType("2");
  155. if (0 == roi.getOnlinePayFlag()) {
  156. // 可以线上支付,查询子订单信息
  157. List<NewShopOrder> shopOrderInfos = cmDiscernReceiptDao.getShopOrderInfos(null, relation.getOrderID());
  158. roi.setShopOrderInfos(shopOrderInfos);
  159. }
  160. }
  161. }
  162. if (null != roi) {
  163. List<ReceiptRecordVo> receiptRecordByOrderID = cmDiscernReceiptDao.findReceiptRecordByOrderID(roi);
  164. // 暂时不启用抹平明细
  165. if (CollectionUtils.isNotEmpty(receiptRecordByOrderID)) {
  166. for (ReceiptRecordVo v : receiptRecordByOrderID) {
  167. if (StringUtils.equals("3", v.getConfirmType())) {
  168. String id = v.getReceiptID();
  169. double returnBalanceAmount = cmDiscernReceiptDao.getReturnBalanceAmount(id);
  170. v.setReturnBalanceAmount(returnBalanceAmount);
  171. }
  172. //统计当前已收
  173. double associateAmount = cmDiscernReceiptDao.getAssociateAmount(String.valueOf(roi.getOrderID()));
  174. v.setOrderReceivedAmount(associateAmount);
  175. }
  176. }
  177. //一个订单又包含了多个收款记录
  178. roi.setReceiptRecordVo(receiptRecordByOrderID);
  179. orderInfos.add(roi);
  180. }
  181. }
  182. if ("6".equals(vo.getReceiptType())) {
  183. // 3超级会员款
  184. ReceiptVipInfoVo receiptVipInfo = cmDiscernReceiptDao.getReceiptVipInfo(vo.getReceiptID());
  185. vo.setVipInfo(receiptVipInfo);
  186. }
  187. if ("7".equals(vo.getReceiptType())) {
  188. // 二手商品上架费
  189. }
  190. if ("8".equals(vo.getReceiptType())) {
  191. //优惠券购买费
  192. ReceipCouponInfoVo couponInfo = cmDiscernReceiptDao.getCouponInfo(vo.getReceiptID());
  193. vo.setCouponInfo(couponInfo);
  194. }
  195. vo.setOrderInfos(orderInfos);
  196. return vo;
  197. }
  198. @Transactional(readOnly = false)
  199. public void cancel(CmDiscernReceipt cmDiscernReceipt, String note) throws Exception {
  200. //receiptType 收款款项类型:1订单款,2非订单款,3返佣款
  201. //1订单款
  202. //撤销前 如果收款记录已经审核 那么要去还原这条收款记录 如果收款记录没有通过审核 那么直接修改收款记录的状态就可以
  203. if ("1".equals(cmDiscernReceipt.getReceiptType())) {
  204. // 先撤销一下收款记录就好了
  205. if ("3".equals(cmDiscernReceipt.getReceiptStatus())) { // 还原订单收款状态
  206. // 找到这个记录关联了那些订单 看看订单除了这一次收款还有没有其他的收款记录 如果有 那么订单会被还原成部分收款
  207. // 如果没有 那么订单就是待收款 注意这里的订单都是主订单
  208. List<String> orderIDs = cmDiscernReceiptDao.findOrderIDs(cmDiscernReceipt.getId());
  209. for (String orderID : orderIDs) {
  210. List<String> records = cmDiscernReceiptDao.hasReceiptRecordOrder(orderID, cmDiscernReceipt.getId()); //订单款项的收款记录
  211. NewOrder order = newOrderDao.get(orderID);
  212. if (CollectionUtils.isEmpty(records) && (order.getBalancePayFee() == null || order.getBalancePayFee() <= 0D)) {
  213. //说明除了现在正在撤销的这一条收款记录 这个订单没有其他的收款记录 就是说 撤销以后这个订单是代付款状态
  214. order.setReceiptStatus("1");
  215. if (order.getStatus().length() == 2) {
  216. order.setStatus("1" + order.getStatus().substring(1, 2));
  217. }
  218. if ("4".equals(order.getStatus()) || "5".equals(order.getStatus())) {
  219. order.setStatus("13");
  220. }
  221. } else {
  222. //反之这个订单就是部分付款状态
  223. order.setReceiptStatus("2");
  224. if (order.getStatus().length() == 2) {
  225. order.setStatus("2" + order.getStatus().substring(1, 2));
  226. }
  227. if ("4".equals(order.getStatus()) || "5".equals(order.getStatus())) {
  228. order.setStatus("23");
  229. }
  230. }
  231. newOrderDao.update(order);
  232. // 充值定金商品
  233. Integer depositProductId = newOrderDao.getDepositOrderProductId(order.getOrderID());
  234. if (6060 == depositProductId) {
  235. // 定金商品撤销收款,用户余额扣除
  236. newOrderDao.updateUserMoneyByUserId(order.getPayTotalFee(), order.getUserID());
  237. // 添加余额收支记录
  238. CmUserBalanceRecord cmUserBalanceRecord = new CmUserBalanceRecord();
  239. cmUserBalanceRecord.setType("2");
  240. cmUserBalanceRecord.setBalanceType("8");
  241. cmUserBalanceRecord.setAddDate(new Date());
  242. cmUserBalanceRecord.setDelFlag("0");
  243. cmUserBalanceRecord.setAmount(order.getPayTotalFee().toString());
  244. cmUserBalanceRecord.setOrderId(order.getUserID());
  245. cmUserBalanceRecord.setRemark("定金商品撤销收款");
  246. cmUserBalanceRecordDao.insertUserBalanceRecord(cmUserBalanceRecord);
  247. }
  248. }
  249. }
  250. }
  251. //2非订单款 没有关联订单
  252. // if ("2".equals(cmDiscernReceipt.getReceiptType())) {
  253. //do nothing
  254. // }
  255. //3返佣款
  256. if ("3".equals(cmDiscernReceipt.getReceiptType())) {
  257. // 如果返佣收款记录还在审核中 那么直接修改一下订单状态就好了
  258. if ("2".equals(cmDiscernReceipt.getReceiptStatus())) {
  259. // 如果返佣收款记录还在已经确认了 那么就去看看这笔返佣收款记录关联了那些子订单 然后撤销它们的主订单的收款状态以及付款状态
  260. List<String> shopOrderIDs = cmDiscernReceiptDao.findShopOrderIDs(cmDiscernReceipt.getId());
  261. for (String shopOrderID : shopOrderIDs) {
  262. //records 查询的是 shopOrderID 这个子订单它的兄弟子订单 就是他的主订单下面除了他这个子订单 其他的子订单的返佣收款记录
  263. List<String> records = cmDiscernReceiptDao.hasReceiptRecordShopOrder(shopOrderID, cmDiscernReceipt.getId()); //订单款项的收款记录
  264. NewOrder order = newOrderDao.getOrderByShopOrderID(shopOrderID);
  265. NewShopOrder newShopOrder = newShopOrderDao.get(shopOrderID);
  266. if (CollectionUtils.isEmpty(records) && (order.getBalancePayFee() == null || order.getBalancePayFee() <= 0D)) {
  267. //说明除了现在正在撤销的这一条收款记录 这个订单没有其他的收款记录 就是说 撤销以后这个订单是代付款状态
  268. order.setReceiptStatus("1");
  269. order.setPayStatus("1");
  270. if (order.getStatus().length() == 2) {
  271. order.setStatus("1" + order.getStatus().substring(1, 2));
  272. }
  273. if ("4".equals(order.getStatus()) || "5".equals(order.getStatus())) {
  274. order.setStatus("13");
  275. }
  276. newShopOrder.setPayStatus("1");
  277. } else {
  278. //反之这个订单就是部分付款状态
  279. order.setReceiptStatus("2");
  280. order.setPayStatus("2");
  281. if (order.getStatus().length() == 2) {
  282. order.setStatus("2" + order.getStatus().substring(1, 2));
  283. }
  284. if ("4".equals(order.getStatus()) || "5".equals(order.getStatus())) {
  285. order.setStatus("23");
  286. }
  287. newShopOrder.setPayStatus("2");
  288. }
  289. newOrderDao.update(order);
  290. newShopOrderDao.update(newShopOrder);
  291. }
  292. if ("10".equals(cmDiscernReceipt.getPayType())) {
  293. //是口头返佣 需要扣除供应商返佣的余额 删除返佣欠款记录
  294. CmRebateRecord crr = cmRebateRecordDao.findByReceiptID(cmDiscernReceipt.getId());
  295. NewCmShop newCmShop = newCmShopDao.get(crr.getShopId());
  296. newCmShop.setAbleRebateAmount(newCmShop.getAbleRebateAmount() - crr.getRebateAmount());
  297. newCmShop.setRebateAmount(newCmShop.getRebateAmount() - crr.getRebateAmount());
  298. newCmShopDao.updateAbleRebateAmount(newCmShop);
  299. cmRebateRecordDao.deleteByReceiptID(cmDiscernReceipt.getId());
  300. cmDiscernReceipt.setDelFlag("1");
  301. }
  302. }
  303. }
  304. cmDiscernReceipt.setReceiptStatus("5");
  305. cmDiscernReceipt.setCancelReason(note);
  306. cmDiscernReceipt.setCancelDate(DateUtils.formatDateTime(new Date()));
  307. User currentUser = UserUtils.getUser();
  308. if (StringUtils.isNotBlank(currentUser.getId()))
  309. cmDiscernReceipt.setCancelUserPermissionID(Long.valueOf(currentUser.getId()));
  310. cmDiscernReceiptDao.update(cmDiscernReceipt);
  311. }
  312. public List<CmDiscernReceipt> export(Page<CmDiscernReceipt> page, CmDiscernReceipt cmDiscernReceipt) {
  313. Page<CmDiscernReceipt> result = super.findPage(page, cmDiscernReceipt);
  314. List<CmDiscernReceipt> list = result.getList();
  315. for (CmDiscernReceipt bean : list) {
  316. if ("1".equals(bean.getReceiptType()) || "3".equals(bean.getReceiptType())) {
  317. List<ReceiptExportVo> exportVo = cmDiscernReceiptDao.getExportInfo(bean.getId(), bean.getReceiptType());
  318. bean.setReceiptExportVo(exportVo);
  319. }
  320. }
  321. return list;
  322. }
  323. public List<Integer> getReceiptRecords(Integer shopOrderID) {
  324. return cmDiscernReceiptDao.getReceiptRecords(shopOrderID);
  325. }
  326. public List<CmMainReceiptExport> exportTest(CmDiscernReceipt cmDiscernReceipt) {
  327. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportTest(cmDiscernReceipt);
  328. return data;
  329. }
  330. public List<CmMainReceiptExport> exportRebate(CmDiscernReceipt cmDiscernReceipt) {
  331. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportRebate(cmDiscernReceipt);
  332. return data;
  333. }
  334. public List<CmReceiptExport> findShopOrder(String orderID) {
  335. List<CmReceiptExport> data = cmDiscernReceiptDao.findShopOrder(orderID);
  336. return data;
  337. }
  338. public List<CmMainReceiptExport> exportOnlyBalancePay(CmDiscernReceipt cmDiscernReceipt) {
  339. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportOnlyBalancePay(cmDiscernReceipt);
  340. return data;
  341. }
  342. public List<CmMainReceiptExport> exportReceiptPay(CmDiscernReceipt cmDiscernReceipt) {
  343. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportReceiptPay(cmDiscernReceipt);
  344. return data;
  345. }
  346. public List<CmMainReceiptExport> exportPay(CmDiscernReceipt cmDiscernReceipt) {
  347. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportPay(cmDiscernReceipt);
  348. return data;
  349. }
  350. public List<CmMainReceiptExport> exportPayData(CmDiscernReceipt cmDiscernReceipt) {
  351. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportPayData(cmDiscernReceipt);
  352. return data;
  353. }
  354. public List<CmMainReceiptExport> exportOrderDate(CmDiscernReceipt cmDiscernReceipt) {
  355. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportOrderDate(cmDiscernReceipt);
  356. return data;
  357. }
  358. public List<CmMainReceiptExport> getListOrder(CmDiscernReceipt cmDiscernReceipt) {
  359. List<CmMainReceiptExport> data = cmDiscernReceiptDao.getListOrder(cmDiscernReceipt);
  360. return data;
  361. }
  362. public List<CmMainReceiptExport> exportPayment(CmDiscernReceipt cmDiscernReceipt) {
  363. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportPayment(cmDiscernReceipt);
  364. return data;
  365. }
  366. public Double findOrderReceipt(Integer orderID) {
  367. Double receiptAmount = cmDiscernReceiptDao.findOrderReceipt(orderID);
  368. return receiptAmount;
  369. }
  370. public List<CmMainReceiptExport> gathering(Integer orderID) {
  371. List<CmMainReceiptExport> gathering = cmDiscernReceiptDao.gathering(orderID);
  372. return gathering;
  373. }
  374. public List<CmReturnedPurchase> exportRefund(CmDiscernReceipt cmDiscernReceipt) {
  375. List<CmReturnedPurchase> purchases = cmDiscernReceiptDao.exportRefund(cmDiscernReceipt);
  376. return purchases;
  377. }
  378. public List<CmMainReceiptExport> theOrder(CmDiscernReceipt cmDiscernReceipt) {
  379. List<CmMainReceiptExport> list = cmDiscernReceiptDao.theOrder(cmDiscernReceipt);
  380. return list;
  381. }
  382. public List<CmMainReceiptExport> svipReceipt(CmDiscernReceipt cmDiscernReceipt) {
  383. List<CmMainReceiptExport> list = cmDiscernReceiptDao.svipReceipt(cmDiscernReceipt);
  384. return list;
  385. }
  386. public List<CmMainReceiptExport> secondReceipt(CmDiscernReceipt cmDiscernReceipt) {
  387. List<CmMainReceiptExport> list = cmDiscernReceiptDao.secondReceipt(cmDiscernReceipt);
  388. return list;
  389. }
  390. }