CmDiscernReceiptService.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  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. }
  156. }
  157. if (null != roi) {
  158. List<ReceiptRecordVo> receiptRecordByOrderID = cmDiscernReceiptDao.findReceiptRecordByOrderID(roi);
  159. // 暂时不启用抹平明细
  160. if (CollectionUtils.isNotEmpty(receiptRecordByOrderID)) {
  161. for (ReceiptRecordVo v : receiptRecordByOrderID) {
  162. if (StringUtils.equals("3", v.getConfirmType())) {
  163. String id = v.getReceiptID();
  164. double returnBalanceAmount = cmDiscernReceiptDao.getReturnBalanceAmount(id);
  165. v.setReturnBalanceAmount(returnBalanceAmount);
  166. }
  167. //统计当前已收
  168. double associateAmount = cmDiscernReceiptDao.getAssociateAmount(String.valueOf(roi.getOrderID()));
  169. v.setOrderReceivedAmount(associateAmount);
  170. }
  171. }
  172. //一个订单又包含了多个收款记录
  173. roi.setReceiptRecordVo(receiptRecordByOrderID);
  174. orderInfos.add(roi);
  175. }
  176. }
  177. if ("6".equals(vo.getReceiptType())) {
  178. // 3超级会员款
  179. ReceiptVipInfoVo receiptVipInfo = cmDiscernReceiptDao.getReceiptVipInfo(vo.getReceiptID());
  180. vo.setVipInfo(receiptVipInfo);
  181. }
  182. if ("7".equals(vo.getReceiptType())) {
  183. // 二手商品上架费
  184. }
  185. vo.setOrderInfos(orderInfos);
  186. return vo;
  187. }
  188. @Transactional(readOnly = false)
  189. public void cancel(CmDiscernReceipt cmDiscernReceipt, String note) throws Exception {
  190. //receiptType 收款款项类型:1订单款,2非订单款,3返佣款
  191. //1订单款
  192. //撤销前 如果收款记录已经审核 那么要去还原这条收款记录 如果收款记录没有通过审核 那么直接修改收款记录的状态就可以
  193. if ("1".equals(cmDiscernReceipt.getReceiptType())) {
  194. // 先撤销一下收款记录就好了
  195. if ("3".equals(cmDiscernReceipt.getReceiptStatus())) { // 还原订单收款状态
  196. // 找到这个记录关联了那些订单 看看订单除了这一次收款还有没有其他的收款记录 如果有 那么订单会被还原成部分收款
  197. // 如果没有 那么订单就是待收款 注意这里的订单都是主订单
  198. List<String> orderIDs = cmDiscernReceiptDao.findOrderIDs(cmDiscernReceipt.getId());
  199. for (String orderID : orderIDs) {
  200. List<String> records = cmDiscernReceiptDao.hasReceiptRecordOrder(orderID, cmDiscernReceipt.getId()); //订单款项的收款记录
  201. NewOrder order = newOrderDao.get(orderID);
  202. if (CollectionUtils.isEmpty(records) && (order.getBalancePayFee() == null || order.getBalancePayFee() <= 0D)) {
  203. //说明除了现在正在撤销的这一条收款记录 这个订单没有其他的收款记录 就是说 撤销以后这个订单是代付款状态
  204. order.setReceiptStatus("1");
  205. if (order.getStatus().length() == 2) {
  206. order.setStatus("1" + order.getStatus().substring(1, 2));
  207. }
  208. if ("4".equals(order.getStatus()) && "5".equals(order.getStatus())) {
  209. order.setStatus("13");
  210. }
  211. } else {
  212. //反之这个订单就是部分付款状态
  213. order.setReceiptStatus("2");
  214. if (order.getStatus().length() == 2) {
  215. order.setStatus("2" + order.getStatus().substring(1, 2));
  216. }
  217. if ("4".equals(order.getStatus()) && "5".equals(order.getStatus())) {
  218. order.setStatus("23");
  219. }
  220. }
  221. newOrderDao.update(order);
  222. // 充值定金商品
  223. Integer depositProductId = newOrderDao.getDepositOrderProductId(order.getOrderID());
  224. if (6060 == depositProductId) {
  225. // 定金商品撤销收款,用户余额扣除
  226. newOrderDao.updateUserMoneyByUserId(order.getPayTotalFee(), order.getUserID());
  227. // 添加余额收支记录
  228. CmUserBalanceRecord cmUserBalanceRecord = new CmUserBalanceRecord();
  229. cmUserBalanceRecord.setType("2");
  230. cmUserBalanceRecord.setBalanceType("8");
  231. cmUserBalanceRecord.setAddDate(new Date());
  232. cmUserBalanceRecord.setDelFlag("0");
  233. cmUserBalanceRecord.setAmount(order.getPayTotalFee().toString());
  234. cmUserBalanceRecord.setOrderId( order.getUserID());
  235. cmUserBalanceRecord.setRemark("定金商品撤销收款");
  236. cmUserBalanceRecordDao.insertUserBalanceRecord(cmUserBalanceRecord);
  237. }
  238. }
  239. }
  240. }
  241. //2非订单款 没有关联订单
  242. // if ("2".equals(cmDiscernReceipt.getReceiptType())) {
  243. //do nothing
  244. // }
  245. //3返佣款
  246. if ("3".equals(cmDiscernReceipt.getReceiptType())) {
  247. // 如果返佣收款记录还在审核中 那么直接修改一下订单状态就好了
  248. if ("2".equals(cmDiscernReceipt.getReceiptStatus())) {
  249. // 如果返佣收款记录还在已经确认了 那么就去看看这笔返佣收款记录关联了那些子订单 然后撤销它们的主订单的收款状态以及付款状态
  250. List<String> shopOrderIDs = cmDiscernReceiptDao.findShopOrderIDs(cmDiscernReceipt.getId());
  251. for (String shopOrderID : shopOrderIDs) {
  252. //records 查询的是 shopOrderID 这个子订单它的兄弟子订单 就是他的主订单下面除了他这个子订单 其他的子订单的返佣收款记录
  253. List<String> records = cmDiscernReceiptDao.hasReceiptRecordShopOrder(shopOrderID, cmDiscernReceipt.getId()); //订单款项的收款记录
  254. NewOrder order = newOrderDao.getOrderByShopOrderID(shopOrderID);
  255. NewShopOrder newShopOrder = newShopOrderDao.get(shopOrderID);
  256. if (CollectionUtils.isEmpty(records) && (order.getBalancePayFee() == null || order.getBalancePayFee() <= 0D)) {
  257. //说明除了现在正在撤销的这一条收款记录 这个订单没有其他的收款记录 就是说 撤销以后这个订单是代付款状态
  258. order.setReceiptStatus("1");
  259. order.setPayStatus("1");
  260. if (order.getStatus().length() == 2) {
  261. order.setStatus("1" + order.getStatus().substring(1, 2));
  262. }
  263. if ("4".equals(order.getStatus()) && "5".equals(order.getStatus())) {
  264. order.setStatus("13");
  265. }
  266. newShopOrder.setPayStatus("1");
  267. } else {
  268. //反之这个订单就是部分付款状态
  269. order.setReceiptStatus("2");
  270. order.setPayStatus("2");
  271. if (order.getStatus().length() == 2) {
  272. order.setStatus("2" + order.getStatus().substring(1, 2));
  273. }
  274. if ("4".equals(order.getStatus()) && "5".equals(order.getStatus())) {
  275. order.setStatus("23");
  276. }
  277. newShopOrder.setPayStatus("2");
  278. }
  279. newOrderDao.update(order);
  280. newShopOrderDao.update(newShopOrder);
  281. }
  282. if ("10".equals(cmDiscernReceipt.getPayType())) {
  283. //是口头返佣 需要扣除供应商返佣的余额 删除返佣欠款记录
  284. CmRebateRecord crr = cmRebateRecordDao.findByReceiptID(cmDiscernReceipt.getId());
  285. NewCmShop newCmShop = newCmShopDao.get(crr.getShopId());
  286. newCmShop.setAbleRebateAmount(newCmShop.getAbleRebateAmount() - crr.getRebateAmount());
  287. newCmShop.setRebateAmount(newCmShop.getRebateAmount() - crr.getRebateAmount());
  288. newCmShopDao.updateAbleRebateAmount(newCmShop);
  289. cmRebateRecordDao.deleteByReceiptID(cmDiscernReceipt.getId());
  290. cmDiscernReceipt.setDelFlag("1");
  291. }
  292. }
  293. }
  294. cmDiscernReceipt.setReceiptStatus("5");
  295. cmDiscernReceipt.setCancelReason(note);
  296. cmDiscernReceipt.setCancelDate(DateUtils.formatDateTime(new Date()));
  297. User currentUser = UserUtils.getUser();
  298. if (StringUtils.isNotBlank(currentUser.getId()))
  299. cmDiscernReceipt.setCancelUserPermissionID(Long.valueOf(currentUser.getId()));
  300. cmDiscernReceiptDao.update(cmDiscernReceipt);
  301. }
  302. public List<CmDiscernReceipt> export(Page<CmDiscernReceipt> page, CmDiscernReceipt cmDiscernReceipt) {
  303. Page<CmDiscernReceipt> result = super.findPage(page, cmDiscernReceipt);
  304. List<CmDiscernReceipt> list = result.getList();
  305. for (CmDiscernReceipt bean : list) {
  306. if ("1".equals(bean.getReceiptType()) || "3".equals(bean.getReceiptType())) {
  307. List<ReceiptExportVo> exportVo = cmDiscernReceiptDao.getExportInfo(bean.getId(), bean.getReceiptType());
  308. bean.setReceiptExportVo(exportVo);
  309. }
  310. }
  311. return list;
  312. }
  313. public List<Integer> getReceiptRecords(Integer shopOrderID) {
  314. return cmDiscernReceiptDao.getReceiptRecords(shopOrderID);
  315. }
  316. public List<CmMainReceiptExport> exportTest(CmDiscernReceipt cmDiscernReceipt) {
  317. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportTest(cmDiscernReceipt);
  318. return data;
  319. }
  320. public List<CmMainReceiptExport> exportRebate(CmDiscernReceipt cmDiscernReceipt) {
  321. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportRebate(cmDiscernReceipt);
  322. return data;
  323. }
  324. public List<CmReceiptExport> findShopOrder(String orderID) {
  325. List<CmReceiptExport> data = cmDiscernReceiptDao.findShopOrder(orderID);
  326. return data;
  327. }
  328. public List<CmMainReceiptExport> exportOnlyBalancePay(CmDiscernReceipt cmDiscernReceipt) {
  329. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportOnlyBalancePay(cmDiscernReceipt);
  330. return data;
  331. }
  332. public List<CmMainReceiptExport> exportReceiptPay(CmDiscernReceipt cmDiscernReceipt) {
  333. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportReceiptPay(cmDiscernReceipt);
  334. return data;
  335. }
  336. public List<CmMainReceiptExport> exportPay(CmDiscernReceipt cmDiscernReceipt) {
  337. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportPay(cmDiscernReceipt);
  338. return data;
  339. }
  340. public List<CmMainReceiptExport> exportPayData(CmDiscernReceipt cmDiscernReceipt) {
  341. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportPayData(cmDiscernReceipt);
  342. return data;
  343. }
  344. public List<CmMainReceiptExport> exportOrderDate(CmDiscernReceipt cmDiscernReceipt) {
  345. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportOrderDate(cmDiscernReceipt);
  346. return data;
  347. }
  348. public List<CmMainReceiptExport> getListOrder(CmDiscernReceipt cmDiscernReceipt) {
  349. List<CmMainReceiptExport> data = cmDiscernReceiptDao.getListOrder(cmDiscernReceipt);
  350. return data;
  351. }
  352. public List<CmMainReceiptExport> exportPayment(CmDiscernReceipt cmDiscernReceipt) {
  353. List<CmMainReceiptExport> data = cmDiscernReceiptDao.exportPayment(cmDiscernReceipt);
  354. return data;
  355. }
  356. public Double findOrderReceipt(Integer orderID) {
  357. Double receiptAmount = cmDiscernReceiptDao.findOrderReceipt(orderID);
  358. return receiptAmount;
  359. }
  360. public List<CmMainReceiptExport> gathering(Integer orderID) {
  361. List<CmMainReceiptExport> gathering = cmDiscernReceiptDao.gathering(orderID);
  362. return gathering;
  363. }
  364. public List<CmReturnedPurchase> exportRefund(CmDiscernReceipt cmDiscernReceipt) {
  365. List<CmReturnedPurchase> purchases = cmDiscernReceiptDao.exportRefund(cmDiscernReceipt);
  366. return purchases;
  367. }
  368. public List<CmMainReceiptExport> theOrder(CmDiscernReceipt cmDiscernReceipt) {
  369. List<CmMainReceiptExport> list = cmDiscernReceiptDao.theOrder(cmDiscernReceipt);
  370. return list;
  371. }
  372. public List<CmMainReceiptExport> svipReceipt(CmDiscernReceipt cmDiscernReceipt) {
  373. List<CmMainReceiptExport> list = cmDiscernReceiptDao.svipReceipt(cmDiscernReceipt);
  374. return list;
  375. }
  376. public List<CmMainReceiptExport> secondReceipt(CmDiscernReceipt cmDiscernReceipt) {
  377. List<CmMainReceiptExport> list = cmDiscernReceiptDao.secondReceipt(cmDiscernReceipt);
  378. return list;
  379. }
  380. }