OrderServiceImpl.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. package com.goafanti.order.service.impl;
  2. import java.math.BigDecimal;
  3. import java.text.ParseException;
  4. import java.util.ArrayList;
  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 org.apache.commons.lang3.StringUtils;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import org.springframework.transaction.annotation.Transactional;
  14. import com.goafanti.common.bo.Error;
  15. import com.goafanti.common.constant.AFTConstants;
  16. import com.goafanti.common.constant.ErrorConstants;
  17. import com.goafanti.common.dao.TFundingRecordsMapper;
  18. import com.goafanti.common.dao.TOrderMapper;
  19. import com.goafanti.common.error.BusinessException;
  20. import com.goafanti.common.model.Admin;
  21. import com.goafanti.common.model.TFundingRecords;
  22. import com.goafanti.common.model.TOrder;
  23. import com.goafanti.common.model.User;
  24. import com.goafanti.common.utils.DateUtils;
  25. import com.goafanti.common.utils.DecimalCalculate;
  26. import com.goafanti.core.mybatis.BaseMybatisDao;
  27. import com.goafanti.core.mybatis.JDBCIdGenerator;
  28. import com.goafanti.core.mybatis.page.Pagination;
  29. import com.goafanti.core.shiro.token.TokenManager;
  30. import com.goafanti.order.bo.FundingListBo;
  31. import com.goafanti.order.bo.OperatorActive;
  32. import com.goafanti.order.bo.OrderDetailBo;
  33. import com.goafanti.order.enums.AuditState;
  34. import com.goafanti.order.enums.IntentionSate;
  35. import com.goafanti.order.enums.LiquidationSate;
  36. import com.goafanti.order.enums.OrderAction;
  37. import com.goafanti.order.enums.OrderChannel;
  38. import com.goafanti.order.enums.OrderState;
  39. import com.goafanti.order.enums.PayChannel;
  40. import com.goafanti.order.enums.PaymentState;
  41. import com.goafanti.order.enums.TradingState;
  42. import com.goafanti.order.enums.TransactionMode;
  43. import com.goafanti.order.enums.TransactionSubject;
  44. import com.goafanti.order.service.OrderService;
  45. @Service
  46. public class OrderServiceImpl extends BaseMybatisDao<TOrderMapper> implements OrderService {
  47. @Autowired
  48. private TOrderMapper tOrderMapper;
  49. @Autowired
  50. private JDBCIdGenerator idGenerator;
  51. @Autowired
  52. private TFundingRecordsMapper tFundingRecordsMapper;
  53. private final BigDecimal DEFAULT_FIRST_PAYMENT = new BigDecimal(0);// 默认首付价格
  54. private final BigDecimal DEFAULT_COMMODITY_PRICE = new BigDecimal(0);// 默认单价
  55. private final String DEFAULT_PLATFORM_ID = "0";// 平台默认id
  56. private final double DEFAULT_BROKERAGE_PROPORTION = 0; //佣金比例
  57. private final double DEFAULT_COMMODITY_DISCOUNT = 1; //折扣比例
  58. private final String DEFAULT_COMMODITY_MODE = "NO_MODE"; //暂无规格
  59. @Override
  60. public OrderDetailBo selectCommodityDetail(String commodityId, Integer commodityType) {
  61. OrderDetailBo bo = tOrderMapper.selectCommodityDetail(commodityId,commodityType);
  62. bo.setOrderNo(String.valueOf(idGenerator.generateId()));
  63. bo.setCreateTime(DateUtils.formatDate(new Date(),AFTConstants.YYYYMMDDHHMMSS));
  64. bo.setCommodityType(commodityType);
  65. if(StringUtils.isBlank(bo.getFirstPayment())) bo.setFirstPayment(String.valueOf(DEFAULT_FIRST_PAYMENT.doubleValue()));
  66. return bo;
  67. }
  68. @Override
  69. public int addIntention(Long orderNo, String commodityId, String commodityMode, Integer commodityQuantity,Integer commodityType,
  70. String createTime,String remarks) throws ParseException {
  71. OrderDetailBo bo = tOrderMapper.selectCommodityDetail(commodityId,commodityType);
  72. BigDecimal commodityPrice = StringUtils.isBlank(bo.getCommodityPrice()) ? DEFAULT_COMMODITY_PRICE
  73. : new BigDecimal(DecimalCalculate.mul(Double.valueOf(bo.getCommodityPrice()),DEFAULT_COMMODITY_DISCOUNT));
  74. BigDecimal orderAmount = new BigDecimal(DecimalCalculate.mul(commodityPrice.doubleValue(),Double.valueOf(String.valueOf(commodityQuantity))));
  75. TOrder tOrder = new TOrder();
  76. tOrder.setOrderNo(orderNo);
  77. tOrder.setCommodityId(commodityId);
  78. tOrder.setCreater(TokenManager.getUserToken().getNickname());
  79. tOrder.setCreateTime(DateUtils.parseDate(createTime, AFTConstants.YYYYMMDDHHMMSS));
  80. tOrder.setBuyerId(TokenManager.getUserId());
  81. tOrder.setSellerId(StringUtils.isBlank(bo.getSellerId()) ? DEFAULT_PLATFORM_ID : bo.getSellerId());
  82. tOrder.setCommodityMode(StringUtils.isBlank(commodityMode)?DEFAULT_COMMODITY_MODE: commodityMode);
  83. tOrder.setCommodityType(commodityType);
  84. tOrder.setCommodityQuantity(commodityQuantity);
  85. tOrder.setBrokerageProportion(new BigDecimal(DEFAULT_BROKERAGE_PROPORTION));
  86. tOrder.setBrokerageAmount(new BigDecimal(DecimalCalculate.mul(commodityPrice.doubleValue(), DEFAULT_BROKERAGE_PROPORTION)));
  87. tOrder.setFirstPayment(DEFAULT_FIRST_PAYMENT);
  88. tOrder.setCommodityPrice(commodityPrice);
  89. tOrder.setOrderAmount(orderAmount);
  90. tOrder.setOrderRemarks(remarks);
  91. tOrder.setDeleteSign(Boolean.FALSE);
  92. tOrder.setOrderChannel(OrderChannel.APP.getCode());
  93. setOrderState(OrderAction.ADD_INTENTION, new BigDecimal(0), tOrder, false);
  94. tOrderMapper.insert(tOrder);
  95. return 1;
  96. }
  97. /**
  98. * 订单状态流转
  99. * @param orderStatus
  100. * @param intentionStatus
  101. * @param tradingStatus
  102. * @param paymentStatus
  103. * @param liquidationStatus
  104. * @param actionType
  105. */
  106. public void setOrderState(OrderAction orderAction,BigDecimal changeAmount,TOrder tOrder,boolean confirm){
  107. if(orderAction == OrderAction.ADD_INTENTION){ //添加意向订单
  108. if(tOrder.getOrderStatus() != null || tOrder.getIntentionStatus() != null || tOrder.getTradingStatus() != null
  109. || tOrder.getPaymentStatus() != null || tOrder.getLiquidationStatus() != null
  110. || tOrder.getActuallyBrokerageAmount() != null || tOrder.getActuallyFirstPayment() != null) {
  111. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"添加意向订单"));
  112. }
  113. tOrder.setOrderStatus(OrderState.INTENTION.getCode());
  114. tOrder.setIntentionStatus(IntentionSate.WAIT_SELLER_CONFIRM.getCode());
  115. tOrder.setTradingStatus(TradingState.WAIT_FOR_TRADE.getCode());
  116. tOrder.setPaymentStatus(PaymentState.WAIT_PAY_FIRST_BALANCE.getCode());
  117. tOrder.setLiquidationStatus(LiquidationSate.WAIT_FOR_PAY.getCode());
  118. tOrder.setActuallyFirstPayment(new BigDecimal(0));
  119. tOrder.setActuallyTotalPayment(new BigDecimal(0));
  120. tOrder.setActuallyBrokerageAmount(new BigDecimal(0));
  121. }else if(orderAction == OrderAction.CONFIRM_INTENTION){ //确认意向订单 (用户确认)
  122. if(tOrder.getOrderStatus() != OrderState.INTENTION.getCode()
  123. || tOrder.getIntentionStatus() != IntentionSate.WAIT_SELLER_CONFIRM.getCode()
  124. || tOrder.getTradingStatus() != TradingState.WAIT_FOR_TRADE.getCode()
  125. || tOrder.getPaymentStatus() != PaymentState.WAIT_PAY_FIRST_BALANCE.getCode()
  126. || tOrder.getLiquidationStatus() != LiquidationSate.WAIT_FOR_PAY.getCode()){
  127. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"确认意向订单"));
  128. }
  129. if(confirm){
  130. tOrder.setOrderStatus(OrderState.WAIT_FOR_PAY.getCode());
  131. tOrder.setIntentionStatus(IntentionSate.SELLER_CONFIRM.getCode());
  132. tOrder.setTradingStatus(TradingState.ON_TRADE.getCode());
  133. }else{
  134. tOrder.setOrderStatus(OrderState.CANCELLED.getCode());
  135. tOrder.setIntentionStatus(IntentionSate.SELLER_REFUSE.getCode());
  136. tOrder.setTradingStatus(TradingState.TRADE_FAILED.getCode());
  137. }
  138. }else if(orderAction == OrderAction.CONFIRM_PAY_FOR_FIRST){ // 支付首付(审核员先审核流水)
  139. if(tOrder.getOrderStatus() != OrderState.WAIT_FOR_PAY.getCode()
  140. || tOrder.getIntentionStatus() != IntentionSate.SELLER_CONFIRM.getCode()
  141. || tOrder.getTradingStatus() != TradingState.ON_TRADE.getCode()
  142. || tOrder.getPaymentStatus() != PaymentState.WAIT_PAY_FIRST_BALANCE.getCode()
  143. || tOrder.getLiquidationStatus() != LiquidationSate.WAIT_FOR_PAY.getCode()){
  144. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,""));
  145. }
  146. int boundary = DecimalCalculate.compareTo(
  147. DecimalCalculate.add(tOrder.getActuallyFirstPayment().doubleValue(),changeAmount.doubleValue()),
  148. tOrder.getFirstPayment().doubleValue());
  149. if(boundary == 1){
  150. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"支付首付款"));
  151. }else if(boundary == -1){ //首付待付清 ()
  152. tOrder.setActuallyTotalPayment(
  153. new BigDecimal(DecimalCalculate.add(tOrder.getActuallyTotalPayment().doubleValue(), changeAmount.doubleValue())));
  154. tOrder.setActuallyFirstPayment(
  155. new BigDecimal(DecimalCalculate.add(tOrder.getActuallyFirstPayment().doubleValue(), changeAmount.doubleValue())));
  156. tOrder.setPaymentStatus(PaymentState.WAIT_PAY_FIRST_BALANCE.getCode());
  157. tOrder.setLiquidationStatus(LiquidationSate.PART_PAY.getCode());
  158. }else if(boundary == 0){ //首付已结清
  159. tOrder.setActuallyTotalPayment(
  160. new BigDecimal(DecimalCalculate.add(tOrder.getActuallyTotalPayment().doubleValue(), changeAmount.doubleValue())));
  161. tOrder.setActuallyFirstPayment(
  162. new BigDecimal(DecimalCalculate.add(tOrder.getActuallyFirstPayment().doubleValue(),changeAmount.doubleValue())));
  163. tOrder.setPaymentStatus(PaymentState.ALREADY_FIRST_PAY.getCode());
  164. tOrder.setLiquidationStatus(LiquidationSate.PART_PAY.getCode());
  165. }
  166. }else if(orderAction == OrderAction.CONFIRM_PAY_FOR_LAST){ //支付尾款 (审核员先审核流水)
  167. if(tOrder.getOrderStatus() != OrderState.WAIT_FOR_PAY.getCode()
  168. || tOrder.getIntentionStatus() != IntentionSate.SELLER_CONFIRM.getCode()
  169. || tOrder.getTradingStatus() != TradingState.ON_TRADE.getCode()
  170. || tOrder.getPaymentStatus() != PaymentState.ALREADY_FIRST_PAY.getCode()
  171. || tOrder.getLiquidationStatus() != LiquidationSate.PART_PAY.getCode()){
  172. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"支付尾款"));
  173. }
  174. int boundary = DecimalCalculate.compareTo(
  175. DecimalCalculate.add(tOrder.getActuallyTotalPayment().doubleValue(),changeAmount.doubleValue()),
  176. tOrder.getOrderAmount().doubleValue());
  177. if(boundary == 1){
  178. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"支付尾款"));
  179. }else if(boundary == -1){
  180. tOrder.setActuallyTotalPayment(
  181. new BigDecimal(DecimalCalculate.add(tOrder.getActuallyTotalPayment().doubleValue(), changeAmount.doubleValue())));
  182. tOrder.setPaymentStatus(PaymentState.WAIT_PAY_LAST_BALANCE.getCode());
  183. tOrder.setLiquidationStatus(LiquidationSate.PART_PAY.getCode());
  184. }else if(boundary == 0){
  185. tOrder.setOrderStatus(OrderState.COMPLETED.getCode());
  186. tOrder.setActuallyTotalPayment(
  187. new BigDecimal(DecimalCalculate.add(tOrder.getActuallyTotalPayment().doubleValue(), changeAmount.doubleValue())));
  188. tOrder.setPaymentStatus(PaymentState.ALREADY_LAST_PAY.getCode());
  189. tOrder.setLiquidationStatus(LiquidationSate.FULL_PAY.getCode());
  190. tOrder.setTradingStatus(TradingState.TRADE_SUCCESS.getCode());
  191. }
  192. }else if(orderAction == OrderAction.APPLY_FOR_WITHDRAW){ //提现申请 (用户申请)
  193. if(tOrder.getOrderStatus() != OrderState.COMPLETED.getCode()
  194. || tOrder.getIntentionStatus() != IntentionSate.SELLER_CONFIRM.getCode()
  195. || tOrder.getTradingStatus() != TradingState.TRADE_SUCCESS.getCode()
  196. || tOrder.getPaymentStatus() != PaymentState.ALREADY_LAST_PAY.getCode()
  197. || tOrder.getLiquidationStatus() != LiquidationSate.FULL_PAY.getCode()){
  198. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"等待提现"));
  199. }
  200. tOrder.setLiquidationStatus(LiquidationSate.WAIT_FOR_WITHDRAW.getCode());
  201. }else if(orderAction == OrderAction.CONFIRM_WITHDRAW){ //提现确认 (审核员先审核流水)
  202. if(tOrder.getOrderStatus() != OrderState.COMPLETED.getCode()
  203. || tOrder.getIntentionStatus() != IntentionSate.SELLER_CONFIRM.getCode()
  204. || tOrder.getTradingStatus() != TradingState.TRADE_SUCCESS.getCode()
  205. || tOrder.getPaymentStatus() != PaymentState.ALREADY_LAST_PAY.getCode()
  206. || tOrder.getLiquidationStatus() != LiquidationSate.WAIT_FOR_WITHDRAW.getCode()){
  207. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"确认提现"));
  208. }
  209. tOrder.setLiquidationStatus(LiquidationSate.PAY_SETTLE.getCode());
  210. }else if(orderAction == OrderAction.APPLY_FOR_CANCEL){ //取消订单(用户取消)
  211. boolean flag = true;
  212. if(tOrder.getOrderStatus() == OrderState.CANCELLED.getCode()) flag = false;
  213. if(tOrder.getIntentionStatus() == IntentionSate.SELLER_REFUSE.getCode()
  214. || tOrder.getIntentionStatus() == IntentionSate.BUYER_CANCELLED.getCode()
  215. || tOrder.getIntentionStatus() == IntentionSate.EXPIRED.getCode()){
  216. flag = false;
  217. }
  218. if(tOrder.getTradingStatus() == TradingState.TRADE_FAILED.getCode()) flag = false;
  219. if(tOrder.getPaymentStatus() == PaymentState.WAIT_FOR_REFUND.getCode()
  220. || tOrder.getPaymentStatus() == PaymentState.ALREADY_REFUND.getCode()) flag = false;
  221. if(tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_WITHDRAW.getCode()
  222. || tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_REFUND.getCode()
  223. || tOrder.getLiquidationStatus() == LiquidationSate.REFUND_SETTLE.getCode()){
  224. flag = false;
  225. }
  226. if(!flag) throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"取消订单"));
  227. tOrder.setOrderStatus(OrderState.CANCELLED.getCode());
  228. tOrder.setIntentionStatus(IntentionSate.BUYER_CANCELLED.getCode());
  229. if(tOrder.getTradingStatus() != TradingState.TRADE_SUCCESS.getCode()) tOrder.setTradingStatus(TradingState.TRADE_FAILED.getCode());
  230. if(tOrder.getActuallyTotalPayment().doubleValue() > 0){ //需要退款
  231. tOrder.setPaymentStatus(PaymentState.WAIT_FOR_REFUND.getCode());
  232. tOrder.setLiquidationStatus(LiquidationSate.WAIT_FOR_REFUND.getCode());
  233. }
  234. }else if(orderAction == OrderAction.REFUND_CONFIRM){ //退款确认(审核员)
  235. if(tOrder.getOrderStatus() != OrderState.CANCELLED.getCode()
  236. || tOrder.getIntentionStatus() != IntentionSate.BUYER_CANCELLED.getCode()
  237. || tOrder.getPaymentStatus() != PaymentState.WAIT_FOR_REFUND.getCode()
  238. || tOrder.getLiquidationStatus() != LiquidationSate.WAIT_FOR_REFUND.getCode()){
  239. throw new BusinessException(new Error(ErrorConstants.NOT_ACCORD_WITH_NEXT,"确认退款"));
  240. }
  241. tOrder.setPaymentStatus(PaymentState.ALREADY_REFUND.getCode());
  242. tOrder.setLiquidationStatus(LiquidationSate.REFUND_SETTLE.getCode());
  243. }
  244. }
  245. /**
  246. * 添加流水记录
  247. * @param orderNo 订单编号
  248. * @param creater 创建人
  249. * @param payeeId 收款人
  250. * @param payerId 付款人
  251. * @param remarks 附言
  252. * @param transactionSubject 交易科目
  253. * @param payChannel 支付渠道
  254. * @param transactionMode 支付方式
  255. * @param FundAudit 流水审核
  256. * @return
  257. */
  258. public int addFundRecord(Long orderNo,String creater,String payeeId,String payerId,String remarks,TransactionSubject transactionSubject,PayChannel payChannel,
  259. BigDecimal transactionAmount,TransactionMode transactionMode,AuditState auditState){
  260. TFundingRecords records = new TFundingRecords();
  261. records.setId(UUID.randomUUID().toString());
  262. records.setConfirmSign(auditState.getCode());
  263. records.setCreater(creater);
  264. records.setDeleteSign(Boolean.FALSE);
  265. records.setOrderNo(orderNo);
  266. records.setTransactionAmount(transactionAmount);
  267. records.setPayeeId(payeeId);
  268. records.setPayerId(payerId);
  269. records.setRemarks(remarks);
  270. records.setTransactionAmount(transactionAmount);
  271. records.setTransactionMode(transactionMode.getCode());
  272. records.setTransactionSubject(transactionSubject.getCode());
  273. records.setTransactionChannel(payChannel.getCode());
  274. records.setCreateTime(new Date());
  275. tFundingRecordsMapper.insert(records);
  276. return 1;
  277. }
  278. /**
  279. * 设置按钮状态
  280. * @param tOrder
  281. * @return
  282. */
  283. private OperatorActive setOperatorActive(TOrder tOrder){
  284. OperatorActive active = new OperatorActive();
  285. if (TokenManager.getToken() instanceof User) {
  286. active.setConfirmPayForFirst(false);
  287. active.setConfirmPayForLast(false);
  288. active.setConfirmRefund(false);
  289. active.setConfirmWithdraw(false);
  290. if (TokenManager.getUserId().equals(tOrder.getBuyerId())) { // 买方
  291. active.setConfirmIntention(false);
  292. active.setRefuseIntention(false);
  293. active.setApplyForWithdraw(false);
  294. if (tOrder.getOrderStatus() == OrderState.WAIT_FOR_PAY.getCode()
  295. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  296. && tOrder.getTradingStatus() == TradingState.ON_TRADE.getCode()
  297. && tOrder.getPaymentStatus() == PaymentState.WAIT_PAY_FIRST_BALANCE.getCode()
  298. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_PAY.getCode()) {
  299. active.setPayForFirst(true);
  300. } else {
  301. active.setPayForFirst(false);
  302. }
  303. if (tOrder.getOrderStatus() == OrderState.WAIT_FOR_PAY.getCode()
  304. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  305. && tOrder.getTradingStatus() == TradingState.ON_TRADE.getCode()
  306. && tOrder.getPaymentStatus() == PaymentState.ALREADY_FIRST_PAY.getCode()
  307. && tOrder.getLiquidationStatus() == LiquidationSate.PART_PAY.getCode()) {
  308. active.setPayForLast(true);
  309. } else {
  310. active.setPayForLast(false);
  311. }
  312. boolean flag = true;
  313. if (tOrder.getOrderStatus() == OrderState.CANCELLED.getCode())
  314. flag = false;
  315. if (tOrder.getIntentionStatus() == IntentionSate.SELLER_REFUSE.getCode()
  316. || tOrder.getIntentionStatus() == IntentionSate.BUYER_CANCELLED.getCode()
  317. || tOrder.getIntentionStatus() == IntentionSate.EXPIRED.getCode()) {
  318. flag = false;
  319. }
  320. if (tOrder.getTradingStatus() == TradingState.TRADE_FAILED.getCode())
  321. flag = false;
  322. if (tOrder.getPaymentStatus() == PaymentState.WAIT_FOR_REFUND.getCode()
  323. || tOrder.getPaymentStatus() == PaymentState.ALREADY_REFUND.getCode())
  324. flag = false;
  325. if (tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_WITHDRAW.getCode()
  326. || tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_REFUND.getCode()
  327. || tOrder.getLiquidationStatus() == LiquidationSate.REFUND_SETTLE.getCode()) {
  328. flag = false;
  329. }
  330. active.setApplyForCancel(flag);
  331. } else if (TokenManager.getUserId().equals(tOrder.getSellerId())) { //卖方
  332. active.setPayForFirst(false);
  333. active.setPayForLast(false);
  334. active.setApplyForCancel(false);
  335. if (tOrder.getOrderStatus() == OrderState.INTENTION.getCode()
  336. && tOrder.getIntentionStatus() == IntentionSate.WAIT_SELLER_CONFIRM.getCode()
  337. && tOrder.getTradingStatus() == TradingState.WAIT_FOR_TRADE.getCode()
  338. && tOrder.getPaymentStatus() == PaymentState.WAIT_PAY_FIRST_BALANCE.getCode()
  339. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_PAY.getCode()) {
  340. active.setConfirmIntention(true);
  341. active.setRefuseIntention(true);
  342. } else {
  343. active.setConfirmIntention(false);
  344. active.setRefuseIntention(false);
  345. }
  346. if (tOrder.getOrderStatus() == OrderState.COMPLETED.getCode()
  347. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  348. && tOrder.getTradingStatus() == TradingState.TRADE_SUCCESS.getCode()
  349. && tOrder.getPaymentStatus() == PaymentState.ALREADY_LAST_PAY.getCode()
  350. && tOrder.getLiquidationStatus() == LiquidationSate.FULL_PAY.getCode()) {
  351. active.setApplyForWithdraw(true);
  352. } else {
  353. active.setApplyForWithdraw(false);
  354. }
  355. } else {
  356. active.setPayForFirst(false);
  357. active.setPayForLast(false);
  358. active.setConfirmIntention(false);
  359. active.setRefuseIntention(false);
  360. active.setApplyForCancel(false);
  361. active.setApplyForWithdraw(false);
  362. }
  363. }
  364. if (TokenManager.getToken() instanceof Admin) {
  365. active.setApplyForCancel(false);
  366. active.setPayForFirst(false);
  367. active.setPayForLast(false);
  368. if (tOrder.getSellerId().equals(DEFAULT_PLATFORM_ID)) { // 平台作为卖方
  369. if (tOrder.getOrderStatus() == OrderState.INTENTION.getCode()
  370. && tOrder.getIntentionStatus() == IntentionSate.WAIT_SELLER_CONFIRM.getCode()
  371. && tOrder.getTradingStatus() == TradingState.WAIT_FOR_TRADE.getCode()
  372. && tOrder.getPaymentStatus() == PaymentState.WAIT_PAY_FIRST_BALANCE.getCode()
  373. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_PAY.getCode()) {
  374. active.setConfirmIntention(true);
  375. active.setRefuseIntention(true);
  376. } else {
  377. active.setConfirmIntention(false);
  378. active.setRefuseIntention(false);
  379. }
  380. if (tOrder.getOrderStatus() == OrderState.COMPLETED.getCode()
  381. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  382. && tOrder.getTradingStatus() == TradingState.TRADE_SUCCESS.getCode()
  383. && tOrder.getPaymentStatus() == PaymentState.ALREADY_LAST_PAY.getCode()
  384. && tOrder.getLiquidationStatus() == LiquidationSate.FULL_PAY.getCode()) {
  385. active.setApplyForWithdraw(true);
  386. } else {
  387. active.setApplyForWithdraw(false);
  388. }
  389. }else{
  390. active.setConfirmIntention(false);
  391. active.setApplyForWithdraw(false);
  392. }
  393. //平台作为中间方 确认首付 -尾款-提现-退款
  394. if(tOrder.getOrderStatus() == OrderState.WAIT_FOR_PAY.getCode()
  395. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  396. && tOrder.getTradingStatus() == TradingState.ON_TRADE.getCode()
  397. && tOrder.getPaymentStatus() == PaymentState.WAIT_PAY_FIRST_BALANCE.getCode()
  398. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_PAY.getCode()){
  399. active.setConfirmPayForFirst(true);
  400. }else{
  401. active.setConfirmPayForFirst(false);
  402. }
  403. if(tOrder.getOrderStatus() == OrderState.WAIT_FOR_PAY.getCode()
  404. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  405. && tOrder.getTradingStatus() == TradingState.ON_TRADE.getCode()
  406. && tOrder.getPaymentStatus() == PaymentState.ALREADY_FIRST_PAY.getCode()
  407. && tOrder.getLiquidationStatus() == LiquidationSate.PART_PAY.getCode()){
  408. active.setConfirmPayForLast(true);
  409. }else{
  410. active.setConfirmPayForLast(false);
  411. }
  412. if(tOrder.getOrderStatus() == OrderState.COMPLETED.getCode()
  413. && tOrder.getIntentionStatus() == IntentionSate.SELLER_CONFIRM.getCode()
  414. && tOrder.getTradingStatus() == TradingState.TRADE_SUCCESS.getCode()
  415. && tOrder.getPaymentStatus() == PaymentState.ALREADY_LAST_PAY.getCode()
  416. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_WITHDRAW.getCode()){
  417. active.setConfirmWithdraw(true);
  418. }else{
  419. active.setConfirmWithdraw(false);
  420. }
  421. if(tOrder.getOrderStatus() == OrderState.CANCELLED.getCode()
  422. && tOrder.getIntentionStatus() == IntentionSate.BUYER_CANCELLED.getCode()
  423. && tOrder.getPaymentStatus() == PaymentState.WAIT_FOR_REFUND.getCode()
  424. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_REFUND.getCode()){
  425. active.setConfirmRefund(true);
  426. }else{
  427. active.setConfirmRefund(false);
  428. }
  429. }
  430. return active;
  431. }
  432. @Override
  433. public int updatePayForFirst(Long orderNo, BigDecimal fundAmount,String remarks) {
  434. TOrder tOrder = tOrderMapper.selectByPrimaryKey(orderNo);
  435. addFundRecord(orderNo, TokenManager.getUserToken().getNickname(), DEFAULT_PLATFORM_ID, TokenManager.getUserId(), remarks,
  436. TransactionSubject.SUPPLY_PAY,PayChannel.UNIONPAY, fundAmount, TransactionMode.OFFLINE, AuditState.WAIT_AUDIT);
  437. tOrderMapper.updateByPrimaryKeySelective(tOrder);
  438. return 1;
  439. }
  440. @Override
  441. public int updatePayForLast(Long orderNo, BigDecimal fundAmount, String remarks) {
  442. TOrder tOrder = tOrderMapper.selectByPrimaryKey(orderNo);
  443. addFundRecord(orderNo, TokenManager.getUserToken().getNickname(), DEFAULT_PLATFORM_ID, TokenManager.getUserId(), remarks,
  444. TransactionSubject.SUPPLY_PAY,PayChannel.UNIONPAY, fundAmount, TransactionMode.OFFLINE, AuditState.WAIT_AUDIT);
  445. tOrderMapper.updateByPrimaryKeySelective(tOrder);
  446. return 1;
  447. }
  448. @SuppressWarnings("unchecked")
  449. @Override
  450. public Pagination<OrderDetailBo> selectOrderList(boolean confirm,Integer pageNo,Integer pageSize) {
  451. Map<String, Object> params = new HashMap<String, Object>();
  452. Pagination<OrderDetailBo> result = new Pagination<OrderDetailBo>();
  453. if(!confirm) params.put("intentionStatus", IntentionSate.WAIT_SELLER_CONFIRM.getCode()); //购买意向
  454. params.put("uid", TokenManager.getUserId());
  455. Pagination<TOrder> data = (Pagination<TOrder>)findPage("selectOrderListByPage", "selectOrderListCount", params, pageNo, pageSize);
  456. List<TOrder> list = (List<TOrder>)data.getList();
  457. OrderDetailBo bo = null;
  458. List<OrderDetailBo> boList = new ArrayList<OrderDetailBo>();
  459. if(list.size()>0){
  460. for(TOrder t:list){
  461. bo = tOrderMapper.selectCommodityDetail(t.getCommodityId(),t.getCommodityType());
  462. bo.setOrderNo(String.valueOf(t.getOrderNo()));
  463. bo.setCommodityQuantity(t.getCommodityQuantity());
  464. bo.setCommodityMode(t.getCommodityMode());
  465. bo.setCommodityId(t.getCommodityId());
  466. bo.setCommodityPrice(String.valueOf(t.getCommodityPrice()));
  467. bo.setOrderRemarks(t.getOrderRemarks());
  468. bo.setCreateTime(DateUtils.formatDate(t.getCreateTime(),AFTConstants.YYYYMMDDHHMMSS));
  469. bo.setOrderStatus(OrderState.getStatus(t.getOrderStatus()).getDesc());
  470. bo.setCommodityType(t.getCommodityType());
  471. bo.setOrderAmount(String.valueOf(t.getOrderAmount()));
  472. bo.setFirstPayment(String.valueOf(t.getFirstPayment()));
  473. bo.setOperatorActive(setOperatorActive(t));
  474. boList.add(bo);
  475. }
  476. }
  477. result.setList(boList);
  478. result.setPageNo(data.getPageNo());
  479. result.setPageSize(data.getPageSize());
  480. result.setTotalCount(data.getTotalCount());
  481. result.setFilterNo(data.getFilterNo());
  482. return result;
  483. }
  484. @Override
  485. public OrderDetailBo selectOrderDetail(Long orderNo) {
  486. TOrder t = tOrderMapper.selectByPrimaryKey(orderNo);
  487. OrderDetailBo bo = tOrderMapper.selectCommodityDetail(t.getCommodityId(),t.getCommodityType());
  488. bo.setOrderNo(String.valueOf(t.getOrderNo()));
  489. bo.setCommodityQuantity(t.getCommodityQuantity());
  490. bo.setCommodityMode(t.getCommodityMode());
  491. bo.setCommodityId(t.getCommodityId());
  492. bo.setCommodityPrice(String.valueOf(t.getCommodityPrice()));
  493. bo.setOrderRemarks(t.getOrderRemarks());
  494. bo.setCreateTime(DateUtils.formatDate(t.getCreateTime(),AFTConstants.YYYYMMDDHHMMSS));
  495. bo.setOrderStatus(OrderState.getStatus(t.getOrderStatus()).getDesc());
  496. bo.setCommodityType(t.getCommodityType());
  497. bo.setOrderAmount(String.valueOf(t.getOrderAmount()));
  498. bo.setOperatorActive(setOperatorActive(t));
  499. bo.setFirstPayment(String.valueOf(t.getFirstPayment()));
  500. return bo;
  501. }
  502. @SuppressWarnings("unchecked")
  503. @Override
  504. public Pagination<FundingListBo> selectFundingHistory(Long orderNo,Integer pageNo,Integer pageSize) {
  505. Map<String, Object> params = new HashMap<String, Object>();
  506. if(orderNo != null) params.put("orderNo", orderNo);
  507. params.put("uid", TokenManager.getUserId());
  508. Pagination<FundingListBo> data = (Pagination<FundingListBo>)findPage("selectFundingHistoryByPage","selectFundingHistoryCount", params, pageNo, pageSize);
  509. List<FundingListBo> list = (List<FundingListBo>)data.getList();
  510. OrderDetailBo odBo = null;
  511. if(list.size()>0){
  512. for(FundingListBo bo:list){
  513. odBo = tOrderMapper.selectCommodityDetail(bo.getCommodityId(),bo.getCommodityType());
  514. bo.setCommodityName(odBo.getCommodityName());
  515. bo.setBusinessDesc(setBusinessDesc(bo.getTransactionSubject(),bo.getTransactionAmount()));
  516. }
  517. }
  518. data.setList(list);
  519. return data;
  520. }
  521. @Override
  522. @Transactional
  523. public int updateApplyForWithdraw(Long orderNo,String remarks) {
  524. TOrder tOrder = tOrderMapper.selectByPrimaryKey(orderNo);
  525. BigDecimal transactionAmount = new BigDecimal(DecimalCalculate.sub(tOrder.getActuallyTotalPayment().doubleValue(),
  526. tOrder.getActuallyBrokerageAmount().doubleValue()));
  527. addFundRecord(orderNo, TokenManager.getUserToken().getNickname(), TokenManager.getUserId(), DEFAULT_PLATFORM_ID, remarks,
  528. TransactionSubject.SUPPLY_COLLECT, PayChannel.UNIONPAY,transactionAmount,TransactionMode.OFFLINE, AuditState.WAIT_AUDIT);
  529. setOrderState(OrderAction.APPLY_FOR_WITHDRAW, new BigDecimal(0), tOrder, false);
  530. tOrderMapper.updateByPrimaryKeySelective(tOrder);
  531. return 1;
  532. }
  533. @Override
  534. @Transactional
  535. public int updateApplyForCancel(Long orderNo) {
  536. TOrder tOrder = tOrderMapper.selectByPrimaryKey(orderNo);
  537. setOrderState(OrderAction.APPLY_FOR_CANCEL, new BigDecimal(0), tOrder, false);
  538. if(tOrder.getPaymentStatus() == PaymentState.WAIT_FOR_REFUND.getCode()
  539. && tOrder.getLiquidationStatus() == LiquidationSate.WAIT_FOR_REFUND.getCode()){ //退款
  540. BigDecimal transactionAmount = new BigDecimal(DecimalCalculate.sub(tOrder.getActuallyTotalPayment().doubleValue(),
  541. tOrder.getActuallyBrokerageAmount().doubleValue()));
  542. addFundRecord(orderNo, "平台方", DEFAULT_PLATFORM_ID,TokenManager.getUserId(), "买家取消订单",
  543. TransactionSubject.REFUND, PayChannel.UNIONPAY,transactionAmount,TransactionMode.OFFLINE, AuditState.WAIT_AUDIT);
  544. }
  545. tOrderMapper.updateByPrimaryKeySelective(tOrder);
  546. return 1;
  547. }
  548. /**
  549. *
  550. * @param transactionSubject 交易科目
  551. * @param transactionAmount 交易金额
  552. * @param payeeId 收款人
  553. * @param payerId 付款人
  554. * @return
  555. */
  556. private String setBusinessDesc(Integer transactionSubject,BigDecimal transactionAmount){
  557. String result = "";
  558. if(transactionSubject == TransactionSubject.SUPPLY_PAY.getCode() || transactionSubject == TransactionSubject.REFUND.getCode()){
  559. result = "收入-"+transactionAmount;
  560. }else if(transactionSubject == TransactionSubject.SUPPLY_PAY.getCode()){
  561. result = "支出-"+transactionAmount;
  562. }
  563. return result;
  564. }
  565. @Override
  566. public int updateConfirmIntention(Long orderNo, boolean confirm) {
  567. TOrder tOrder = tOrderMapper.selectByPrimaryKey(orderNo);
  568. setOrderState(OrderAction.CONFIRM_INTENTION, new BigDecimal(0), tOrder, confirm);
  569. tOrderMapper.updateByPrimaryKeySelective(tOrder);
  570. return 1;
  571. }
  572. }