CardCaseService.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. package com.izouma.tcg.service.card;
  2. import com.izouma.tcg.domain.BaseEntity;
  3. import com.izouma.tcg.domain.User;
  4. import com.izouma.tcg.domain.card.CardBox;
  5. import com.izouma.tcg.domain.card.CardCase;
  6. import com.izouma.tcg.domain.card.Collection;
  7. import com.izouma.tcg.domain.customizeStore.Store;
  8. import com.izouma.tcg.domain.orderInfo.OrderInfo;
  9. import com.izouma.tcg.domain.orderInfo.OrderRefundApply;
  10. import com.izouma.tcg.dto.CardBoxDTO;
  11. import com.izouma.tcg.dto.GroupDTO;
  12. import com.izouma.tcg.dto.PageQuery;
  13. import com.izouma.tcg.dto.cardCase.CardCaseDTO;
  14. import com.izouma.tcg.dto.cardCase.CardCaseInputDTO;
  15. import com.izouma.tcg.enums.CaseStatus;
  16. import com.izouma.tcg.enums.OrderStatus;
  17. import com.izouma.tcg.exception.BusinessException;
  18. import com.izouma.tcg.repo.card.CardBoxRepo;
  19. import com.izouma.tcg.repo.card.CardCaseRepo;
  20. import com.izouma.tcg.repo.card.CollectionRepo;
  21. import com.izouma.tcg.repo.customizeStore.StoreRepo;
  22. import com.izouma.tcg.repo.orderInfo.OrderInfoRepo;
  23. import com.izouma.tcg.repo.orderInfo.OrderRefundApplyRepo;
  24. import com.izouma.tcg.service.orderInfo.OrderRefundApplyService;
  25. import com.izouma.tcg.utils.JpaUtils;
  26. import com.izouma.tcg.utils.SecurityUtils;
  27. import lombok.AllArgsConstructor;
  28. import org.apache.commons.beanutils.ConvertUtils;
  29. import org.apache.commons.lang3.StringUtils;
  30. import org.springframework.data.domain.Page;
  31. import org.springframework.data.jpa.domain.Specification;
  32. import org.springframework.stereotype.Service;
  33. import javax.persistence.criteria.Predicate;
  34. import javax.transaction.Transactional;
  35. import java.util.*;
  36. import java.util.stream.Collectors;
  37. import static com.izouma.tcg.utils.JpaUtils.*;
  38. @Service
  39. @AllArgsConstructor
  40. public class CardCaseService {
  41. private final CardCaseRepo cardCaseRepo;
  42. private final CollectionRepo collectionRepo;
  43. private final CardBoxRepo cardBoxRepo;
  44. private final StoreRepo storeRepo;
  45. private final OrderRefundApplyService orderRefundApplyService;
  46. private final OrderInfoRepo orderInfoRepo;
  47. private final OrderRefundApplyRepo orderRefundApplyRepo;
  48. public Page<CardCase> all(PageQuery pageQuery) {
  49. return cardCaseRepo
  50. .findAll(JpaUtils.toSpecification(pageQuery, CardCase.class), JpaUtils.toPageRequest(pageQuery));
  51. }
  52. public List<GroupDTO> genNewCardCase(Integer group, Integer groupCount, boolean special) {
  53. List<GroupDTO> GroupDTOs = new ArrayList<>();
  54. for (int i = 0; i < group; i++) {
  55. int groupNo = i + 1;
  56. GroupDTO groupDTO = new GroupDTO();
  57. groupDTO.setTagTitle(groupNo + "组");
  58. if (special) {
  59. if (i == 0) {
  60. groupDTO.setTagTitle("A");
  61. } else {
  62. groupDTO.setTagTitle("B");
  63. }
  64. }
  65. List<CardBoxDTO> cardBoxDTOs = new ArrayList<>();
  66. for (int j = 0; j < groupCount; j++) {
  67. int boxNo = j + 1;
  68. CardBoxDTO cardBoxDTO = new CardBoxDTO();
  69. cardBoxDTO.setName(boxNo + "号");
  70. cardBoxDTO.setSold(false);
  71. cardBoxDTOs.add(cardBoxDTO);
  72. groupDTO.setDynamicTags(cardBoxDTOs);
  73. }
  74. GroupDTOs.add(groupDTO);
  75. }
  76. return GroupDTOs;
  77. }
  78. // public List<CardCaseDTO> showStoreViewCases(CaseStatus caseStatus, List<String> sortStrings) {
  79. // List<CardCase> cardCases = new ArrayList<>();
  80. // Set<Long> collectionIds = new HashSet<>();
  81. // if (StringUtils.isNotBlank(search)) {
  82. // collectionIds = collectionRepo.findAllByNameLike("%" + search + "%").stream().map(Collection::getId)
  83. // .collect(Collectors.toSet());
  84. // cardCases = cardCaseRepo
  85. // .findAllByCaseStatusAndCollectionIdInAndSeriesId(caseStatus, collectionIds, seriesId);
  86. // }
  87. // if (collectionId != null) {
  88. // collectionIds.add(collectionId);
  89. // cardCases = cardCaseRepo
  90. // .findAllByCaseStatusAndCollectionIdInAndSeriesId(caseStatus, collectionIds, seriesId);
  91. // }
  92. // if (collectionId == null & StringUtils.isBlank(search)) {
  93. // cardCases = cardCaseRepo.findAllByCaseStatusAndSeriesId(caseStatus, seriesId);
  94. // }
  95. // List<CardCaseDTO> result = new ArrayList<>();
  96. // cardCases.removeIf(CardCase::isDel);
  97. // cardCases.forEach(cardCase -> {
  98. // CardCaseDTO cardCaseDTO = new CardCaseDTO();
  99. // cardCaseDTO.setCardCaseId(cardCase.getId());
  100. // cardCaseDTO
  101. // .setCaseName(Optional.ofNullable(cardCase.getCollection()).orElseThrow(new BusinessException("暂无"))
  102. // .getName() + cardCase.getCode());
  103. // cardCaseDTO.setImage(cardCase.getCollection().getImages().get(0));
  104. // cardCaseDTO.setEndTime(cardCase.getStartTime());
  105. // cardCaseDTO.setPrice(cardCase.getBoxPrice());
  106. // cardCaseDTO.setTotal(cardCase.getCardBoxList().size());
  107. // cardCaseDTO.setCaseStatus(cardCase.getCaseStatus().toString());
  108. // Integer preorderCount = cardBoxRepo.countAllByCardCaseIdAndUserIdNotNull(cardCase.getId());
  109. // cardCaseDTO.setPreorder(preorderCount);
  110. // result.add(cardCaseDTO);
  111. // });
  112. // return result;
  113. // }
  114. public List<CardCaseDTO> showStoreCasesMA(PageQuery pageQuery) {
  115. List<CardCase> cardCases = cardCaseRepo
  116. .findAll((Specification<CardCase>) (root, criteriaQuery, criteriaBuilder) ->
  117. criteriaBuilder.and(criteriaBuilder.and(
  118. criteriaBuilder.equal(root.get("storeId"), pageQuery.getQuery().get("storeId")),
  119. root.get("caseStatus").in(pageQuery.getQuery().get("caseStatus")),
  120. criteriaBuilder.equal(root.get("del"), false))), toPageRequest(pageQuery)).getContent();
  121. return getCardCaseDTOS(cardCases);
  122. }
  123. private List<CardCaseDTO> getCardCaseDTOS(List<CardCase> cardCases) {
  124. List<CardCaseDTO> result = new ArrayList<>();
  125. cardCases.forEach(cardCase -> {
  126. CardCaseDTO cardCaseDTO = new CardCaseDTO();
  127. cardCaseDTO.setCardCaseId(cardCase.getId());
  128. cardCaseDTO
  129. .setCaseName(Optional.ofNullable(cardCase.getCollection()).orElseThrow(new BusinessException("暂无"))
  130. .getName() + cardCase.getCode());
  131. if (cardCase.getImages().size() == 0) {
  132. cardCaseDTO.setImage(cardCase.getCollection().getImages().get(0));
  133. } else {
  134. cardCaseDTO.setImage(cardCase.getImages().get(0));
  135. }
  136. cardCaseDTO.setEndTime(cardCase.getStartTime());
  137. cardCaseDTO.setCaseStatus(cardCase.getCaseStatus().toString());
  138. cardCaseDTO.setDescription(cardCase.getDescription());
  139. Integer preorderCount = cardBoxRepo.countAllByCardCaseIdAndUserIdNotNull(cardCase.getId());
  140. Integer otherPreorderCount = cardBoxRepo.countAllByCardCaseIdAndBindNameNotNull(cardCase.getId());
  141. preorderCount = preorderCount + otherPreorderCount;
  142. Store store = storeRepo.findById(cardCase.getStoreId()).orElse(null);
  143. if (store != null) {
  144. cardCaseDTO.setStoreId(store.getId());
  145. cardCaseDTO.setStoreName(store.getStoreName());
  146. cardCaseDTO.setStoreLogo(store.getLogo());
  147. }
  148. cardCaseDTO.setPrice(cardCase.getBoxPrice());
  149. if (cardCase.isSpecial()) {
  150. cardCaseDTO.setTotal(cardCase.getCardBoxList().size() / 2);
  151. cardCaseDTO.setPreorder(preorderCount / 2);
  152. } else {
  153. cardCaseDTO.setPreorder(preorderCount);
  154. cardCaseDTO.setTotal(cardCase.getCardBoxList().size());
  155. }
  156. result.add(cardCaseDTO);
  157. });
  158. return result;
  159. }
  160. public List<CardCaseDTO> showCardCasesMA(CaseStatus caseStatus, Long collectionId, String search, Long seriesId) {
  161. List<CardCase> cardCases = new ArrayList<>();
  162. Set<Long> collectionIds = new HashSet<>();
  163. if (StringUtils.isNotBlank(search)) {
  164. collectionIds = collectionRepo.findAllByNameLike("%" + search + "%").stream().map(Collection::getId)
  165. .collect(Collectors.toSet());
  166. cardCases = cardCaseRepo
  167. .findAllByCaseStatusAndCollectionIdInAndSeriesId(caseStatus, collectionIds, seriesId);
  168. }
  169. if (collectionId != null) {
  170. collectionIds.add(collectionId);
  171. cardCases = cardCaseRepo
  172. .findAllByCaseStatusAndCollectionIdInAndSeriesId(caseStatus, collectionIds, seriesId);
  173. }
  174. if (collectionId == null & StringUtils.isBlank(search)) {
  175. cardCases = cardCaseRepo.findAllByCaseStatusAndSeriesId(caseStatus, seriesId);
  176. }
  177. cardCases.removeIf(BaseEntity::isDel);
  178. return getCardCaseDTOS(cardCases);
  179. }
  180. public Map<String, Object> showCaseInfoMA(Long caseId) {
  181. CardCase cardCase = cardCaseRepo.findById(caseId).orElseThrow(new BusinessException("无信息"));
  182. List<CardBox> caseBoxList = cardCase.getCardBoxList();
  183. Map<String, List<CardBox>> groupBoxMap = caseBoxList.stream()
  184. .collect(Collectors.groupingBy(CardBox::getGroupCode));
  185. Map<String, Object> result = new HashMap<>();
  186. CardCaseDTO cardCaseDTO = new CardCaseDTO();
  187. cardCaseDTO.setCardCaseId(cardCase.getId());
  188. cardCaseDTO
  189. .setCaseName(Optional.ofNullable(cardCase.getCollection()).orElseThrow(new BusinessException("暂无"))
  190. .getName() + cardCase.getCode());
  191. cardCaseDTO.setDescription(cardCase.getDescription());
  192. cardCaseDTO.setImage(cardCase.getCollection().getImages().get(0));
  193. cardCaseDTO.setEndTime(cardCase.getStartTime());
  194. cardCaseDTO.setPrice(cardCase.getBoxPrice());
  195. cardCaseDTO.setCaseStatus(cardCase.getCaseStatus().toString());
  196. cardCaseDTO.setSpecial(cardCase.isSpecial());
  197. cardCaseDTO.setDescription(cardCase.getDescription());
  198. Integer preorderCount = cardBoxRepo.countAllByCardCaseIdAndUserIdNotNull(cardCase.getId());
  199. Integer otherPreorderCount = cardBoxRepo.countAllByCardCaseIdAndBindNameNotNull(cardCase.getId());
  200. preorderCount = preorderCount + otherPreorderCount;
  201. Store store = storeRepo.findById(cardCase.getStoreId()).orElse(null);
  202. if (store != null) {
  203. cardCaseDTO.setStoreId(store.getId());
  204. cardCaseDTO.setStoreName(store.getStoreName());
  205. cardCaseDTO.setStoreLogo(store.getStoreName());
  206. }
  207. if (cardCase.isSpecial()) {
  208. cardCaseDTO.setTotal(cardCase.getCardBoxList().size() / 2);
  209. cardCaseDTO.setPreorder(preorderCount / 2);
  210. } else {
  211. cardCaseDTO.setTotal(cardCase.getCardBoxList().size());
  212. cardCaseDTO.setPreorder(preorderCount);
  213. }
  214. result.put("cardCaseInfo", cardCaseDTO);
  215. result.put("groupBoxMap", groupBoxMap);
  216. return result;
  217. }
  218. @Transactional
  219. public CardCase save(CardCaseInputDTO cardCaseInputDTO) {
  220. CardCase cardCase = new CardCase();
  221. if (cardCaseInputDTO.getId() != null) {
  222. CardCase orig = cardCaseRepo.findById(cardCaseInputDTO.getId()).orElse(null);
  223. if (orig != null) {
  224. cardCase = orig;
  225. }
  226. }
  227. User user = SecurityUtils.getAuthenticatedUser();
  228. Store store = storeRepo.findFirstByUserId(user.getId());
  229. if (store != null) {
  230. cardCase.setStoreId(store.getId());
  231. }
  232. Collection collection = collectionRepo.findById(cardCaseInputDTO.getCollectionId())
  233. .orElseThrow(new BusinessException("无系列信息"));
  234. cardCase.setSeriesId(collection.getSeriesId());
  235. cardCase.setCollectionId(collection.getId());
  236. cardCase.setCode(cardCaseInputDTO.getCode());
  237. cardCase.setDescription(cardCaseInputDTO.getDescription());
  238. if (cardCase.getCode() == null) {
  239. cardCase.setCode("");
  240. }
  241. cardCase.setCaseStatus(cardCaseInputDTO.getCaseStatus());
  242. cardCase.setStartTime(cardCaseInputDTO.getStartTime());
  243. cardCase.setBoxPrice(cardCaseInputDTO.getBoxPrice());
  244. if (cardCaseInputDTO.getImages() != null) {
  245. List<String> images = Arrays
  246. .asList((String[]) ConvertUtils.convert(cardCaseInputDTO.getImages().split(","), String.class));
  247. cardCase.setImages(images);
  248. }
  249. cardCase.setPostage(cardCaseInputDTO.getPostage());
  250. cardCase.setBoxesCount(cardCaseInputDTO.getBoxesCount());
  251. cardCase.setSpecial(cardCaseInputDTO.isSpecial());
  252. CardCase result = cardCaseRepo.save(cardCase);
  253. //解析卡盒与组
  254. List<Long> newIds = new ArrayList<>();
  255. List<GroupDTO> groupDTOS = cardCaseInputDTO.getGroupDTOS();
  256. groupDTOS.forEach(groupDTO -> {
  257. String groupName = groupDTO.getTagTitle();
  258. List<CardBoxDTO> boxDTOs = groupDTO.getDynamicTags();
  259. boxDTOs.forEach(box -> {
  260. CardBox cardBox;
  261. if (box.getCardBoxId() != null) {
  262. cardBox = cardBoxRepo.findById(box.getCardBoxId()).orElse(null);
  263. if (cardBox != null) {
  264. cardBox.setCardCaseId(result.getId());
  265. cardBox.setBoxCode(box.getName());
  266. cardBox.setGroupCode(groupName);
  267. cardBox.setMoney(result.getBoxPrice());
  268. cardBox.setCaseStatus(result.getCaseStatus());
  269. cardBox.setBoxPrice(result.getBoxPrice());
  270. cardBoxRepo.save(cardBox);
  271. newIds.add(cardBox.getId());
  272. }
  273. } else {
  274. cardBox = new CardBox();
  275. cardBox.setCardCaseId(result.getId());
  276. cardBox.setBoxCode(box.getName());
  277. cardBox.setGroupCode(groupName);
  278. cardBox.setMoney(result.getBoxPrice());
  279. cardBox.setCaseStatus(result.getCaseStatus());
  280. cardBox.setBoxPrice(result.getBoxPrice());
  281. cardBoxRepo.save(cardBox);
  282. }
  283. });
  284. });
  285. if (cardCase.getCardBoxList() != null) {
  286. List<Long> cardBoxIds = cardCase.getCardBoxList().stream().map(CardBox::getId).collect(Collectors.toList());
  287. if (cardBoxIds.size() > 0) {
  288. cardBoxIds.removeIf(newIds::contains);
  289. cardBoxRepo.deleteAllByIdIn(cardBoxIds);
  290. }
  291. }
  292. return result;
  293. }
  294. public CardCaseInputDTO getCardCaseInputDTO(Long id) {
  295. CardCase cardCase = cardCaseRepo.findById(id).orElseThrow(new BusinessException("无信息"));
  296. CardCaseInputDTO cardCaseInputDTO = new CardCaseInputDTO();
  297. cardCaseInputDTO.setCaseStatus(cardCase.getCaseStatus());
  298. cardCaseInputDTO.setBoxPrice(cardCase.getBoxPrice());
  299. cardCaseInputDTO.setCode(cardCase.getCode());
  300. cardCaseInputDTO.setId(cardCase.getId());
  301. cardCaseInputDTO.setBoxesCount(cardCase.getBoxesCount());
  302. cardCaseInputDTO.setCollectionId(cardCase.getCollectionId());
  303. cardCaseInputDTO.setSeriesId(cardCase.getSeriesId());
  304. cardCaseInputDTO.setStartTime(cardCase.getStartTime());
  305. cardCaseInputDTO.setDescription(cardCase.getDescription());
  306. cardCaseInputDTO.setSpecial(cardCase.isSpecial());
  307. String imagesList = cardCase.getImages().toString();
  308. cardCaseInputDTO.setImages(imagesList);
  309. //
  310. // cardCaseInputDTO.setImages(images);
  311. cardCaseInputDTO.setPostage(cardCase.getPostage());
  312. Map<String, List<CardBox>> groupMap = cardCase.getCardBoxList().stream()
  313. .collect(Collectors.groupingBy(CardBox::getGroupCode));
  314. List<GroupDTO> groupDTOS = new ArrayList<>();
  315. groupMap.forEach((groupCode, cardBoxList) -> {
  316. GroupDTO groupDTO = new GroupDTO();
  317. groupDTO.setTagTitle(groupCode);
  318. List<CardBoxDTO> dtos = new ArrayList<>();
  319. cardBoxList.forEach(cardBox -> {
  320. CardBoxDTO cardBoxDTO = new CardBoxDTO();
  321. cardBoxDTO.setCardBoxId(cardBox.getId());
  322. cardBoxDTO.setName(cardBox.getBoxCode());
  323. cardBoxDTO.setSold(cardBox.isSold());
  324. dtos.add(cardBoxDTO);
  325. });
  326. groupDTO.setDynamicTags(dtos);
  327. groupDTOS.add(groupDTO);
  328. });
  329. cardCaseInputDTO.setGroupDTOS(groupDTOS);
  330. return cardCaseInputDTO;
  331. }
  332. public void softDelete(Long caseId) {
  333. CardCase cardCase = cardCaseRepo.findById(caseId).orElseThrow(new BusinessException("无信息"));
  334. cardCase.setCaseStatus(CaseStatus.UNDO);
  335. cardCaseRepo.save(cardCase);
  336. }
  337. public void revive(Long caseId) {
  338. CardCase cardCase = cardCaseRepo.findById(caseId).orElseThrow(new BusinessException("无信息"));
  339. cardCase.setCaseStatus(CaseStatus.PROGRESS);
  340. cardCase.getCardBoxList().forEach(cardBox -> {
  341. cardBox.setCaseStatus(CaseStatus.PROGRESS);
  342. cardBoxRepo.save(cardBox);
  343. });
  344. cardCaseRepo.save(cardCase);
  345. }
  346. public void multipleDelete(String caseList) {
  347. List<Long> boxIds = Arrays.asList((Long[]) ConvertUtils.convert(caseList.split(","), Long.class));
  348. boxIds.forEach(cardCaseRepo::softDelete);
  349. }
  350. public void cancel(Long caseId) {
  351. CardCase cardCase = cardCaseRepo.findById(caseId).orElseThrow(new BusinessException("报错咯,无卡箱信息"));
  352. cardCase.getCardBoxList().forEach(cardBox -> {
  353. cardBox.setCaseStatus(CaseStatus.FINISH);
  354. cardBoxRepo.save(cardBox);
  355. });
  356. cardCase.setCaseStatus(CaseStatus.FINISH);
  357. cardCaseRepo.save(cardCase);
  358. List<OrderStatus> orderStatuses = new ArrayList<>();
  359. orderStatuses.add(OrderStatus.REFUND);
  360. orderStatuses.add(OrderStatus.PAYED);
  361. List<OrderInfo> orderInfos = orderInfoRepo.findAllByCaseIdAndOrderStatusIn(caseId, orderStatuses);
  362. List<OrderRefundApply> orderRefundApplies = new ArrayList<>();
  363. orderInfos.forEach(orderInfo -> {
  364. if (orderInfo.getOrderStatus().equals(OrderStatus.REFUND)) {
  365. orderRefundApplies.add(orderRefundApplyRepo.findById(orderInfo.getRefundId()).orElse(null));
  366. } else {
  367. orderRefundApplies.add(orderRefundApplyService.apply(orderInfo.getId(), "拼箱失败,自动发起退款"));
  368. }
  369. });
  370. orderRefundApplies.forEach(orderRefundApply -> {
  371. orderRefundApplyService.audit(orderRefundApply.getId());
  372. });
  373. }
  374. }