OrderServiceImpl.java 32 KB

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