UserOrderServiceImpl.java 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. package com.izouma.awesomeadmin.service.impl;
  2. import com.izouma.awesomeadmin.constant.AppConstant;
  3. import com.izouma.awesomeadmin.dao.*;
  4. import com.izouma.awesomeadmin.dto.Page;
  5. import com.izouma.awesomeadmin.dto.Result;
  6. import com.izouma.awesomeadmin.dto.WxPayRefundData;
  7. import com.izouma.awesomeadmin.model.*;
  8. import com.izouma.awesomeadmin.service.MemberCoinService;
  9. import com.izouma.awesomeadmin.service.MemberPointService;
  10. import com.izouma.awesomeadmin.service.UserInfoService;
  11. import com.izouma.awesomeadmin.service.UserOrderService;
  12. import com.izouma.awesomeadmin.util.AlipayClientFactory;
  13. import com.izouma.awesomeadmin.util.MbappUtil;
  14. import com.izouma.awesomeadmin.util.PropertiesFileLoader;
  15. import com.izouma.awesomeadmin.util.WXRefundService;
  16. import org.apache.commons.lang.StringUtils;
  17. import org.apache.log4j.Logger;
  18. import org.jdom.Element;
  19. import org.jdom.input.SAXBuilder;
  20. import org.json.JSONObject;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.stereotype.Service;
  23. import org.xml.sax.InputSource;
  24. import javax.servlet.http.HttpServletRequest;
  25. import javax.servlet.http.HttpServletResponse;
  26. import javax.servlet.http.HttpSession;
  27. import java.io.BufferedOutputStream;
  28. import java.io.IOException;
  29. import java.io.StringReader;
  30. import java.math.BigDecimal;
  31. import java.util.Date;
  32. import java.util.HashMap;
  33. import java.util.List;
  34. import java.util.Map;
  35. /**
  36. * service接口实现类
  37. */
  38. @Service
  39. public class UserOrderServiceImpl implements UserOrderService {
  40. private static Logger logger = Logger.getLogger(UserOrderServiceImpl.class);
  41. @Autowired
  42. private UserOrderMapper userOrderMapper;
  43. @Autowired
  44. private UserInfoService userInfoService;
  45. @Autowired
  46. private WxpayTempMapper wxpayTempMapper;
  47. @Autowired
  48. private MemberPointService memberPointService;
  49. @Autowired
  50. private MemberCoinService memberCoinService;
  51. @Autowired
  52. private AlipayTempMapper alipayTempMapper;
  53. @Autowired
  54. private UserAddressMapper userAddressMapper;
  55. @Autowired
  56. private OrderAddressMapper orderAddressMapper;
  57. @Autowired
  58. private SystemConfigMapper systemConfigMapper;
  59. @Autowired
  60. private OrderRepairMapper orderRepairMapper;
  61. @Autowired
  62. private ProductInfoMapper productInfoMapper;
  63. @Override
  64. public List<UserOrder> getUserOrderList(UserOrder record) {
  65. logger.info("getUserOrderList");
  66. try {
  67. return userOrderMapper.queryAllUserOrder(record);
  68. } catch (Exception e) {
  69. logger.error("getUserOrderList", e);
  70. }
  71. return null;
  72. }
  73. @Override
  74. public List<UserOrder> getUserOrderByPage(Page page, UserOrder record) {
  75. logger.info("getUserOrderByPage");
  76. try {
  77. Map<String, Object> parameter = new HashMap<String, Object>();
  78. parameter.put("record", record);
  79. parameter.put(AppConstant.PAGE, page);
  80. return userOrderMapper.queryUserOrderByPage(parameter);
  81. } catch (Exception e) {
  82. logger.error("getUserOrderByPage", e);
  83. }
  84. return null;
  85. }
  86. @Override
  87. public UserOrder getUserOrderById(String id) {
  88. logger.info("getUserOrderyId");
  89. try {
  90. return userOrderMapper.selectByPrimaryKey(Integer.valueOf(id));
  91. } catch (Exception e) {
  92. logger.error("getUserOrderById", e);
  93. }
  94. return null;
  95. }
  96. @Override
  97. public UserOrder getUserOrder(UserOrder record) {
  98. logger.info("getUserOrder");
  99. try {
  100. return userOrderMapper.queryUserOrder(record);
  101. } catch (Exception e) {
  102. logger.error("getUserOrder", e);
  103. }
  104. return null;
  105. }
  106. @Override
  107. public boolean createUserOrder(UserOrder record) {
  108. logger.info("createUserOrder");
  109. try {
  110. record.setOrderCode(MbappUtil.getOrderIdByUUId());
  111. if (record.getQuantity() != null && record.getUnitPrice() != null) {
  112. BigDecimal unitPrice = record.getUnitPrice();
  113. /**
  114. * 计算价格开始
  115. */
  116. ProductInfo productInfo = new ProductInfo();
  117. productInfo.setId(record.getProductId());
  118. productInfo = productInfoMapper.queryProductInfo(productInfo);
  119. if (productInfo != null) {
  120. unitPrice = productInfo.getPrice();
  121. if (productInfo.getProductPriceList() != null && productInfo.getProductPriceList().size() > 0) {
  122. for (ProductPrice productPrice : productInfo.getProductPriceList()) {
  123. if (productPrice.getMaxCounts() != null
  124. && productPrice.getMinCounts() != null
  125. && record.getQuantity() <= productPrice.getMaxCounts()
  126. && record.getQuantity() >= productPrice.getMinCounts()) {
  127. unitPrice = productPrice.getPrice();
  128. } else if (productPrice.getMaxCounts() == null
  129. && productPrice.getMinCounts() != null
  130. && record.getQuantity() >= productPrice.getMinCounts()) {
  131. unitPrice = productPrice.getPrice();
  132. } else if (productPrice.getMinCounts() == null
  133. && productPrice.getMaxCounts() != null
  134. && record.getQuantity() < productPrice.getMinCounts()) {
  135. unitPrice = productPrice.getPrice();
  136. }
  137. }
  138. }
  139. }
  140. /**
  141. * 计算价格结束
  142. */
  143. BigDecimal totlePrice = unitPrice.multiply(BigDecimal.valueOf(record.getQuantity()));
  144. record.setTotlePrice(totlePrice);
  145. BigDecimal dealPrice = totlePrice;
  146. record.setDealPrice(dealPrice);
  147. record.setOffPrice(totlePrice.subtract(dealPrice));
  148. int updates = userOrderMapper.insertSelective(record);
  149. if (StringUtils.isNotEmpty(record.getUserAddressId())) {
  150. UserAddress userAddress = userAddressMapper.selectByPrimaryKey(Integer.valueOf(record.getUserAddressId()));
  151. if (userAddress != null) {
  152. OrderAddress orderAddress = new OrderAddress();
  153. orderAddress.setOrderId(record.getId());
  154. orderAddress.setUserId(record.getUserId());
  155. orderAddress.setRealName(userAddress.getRealName());
  156. orderAddress.setTelephone(userAddress.getTelephone());
  157. orderAddress.setPostcode(userAddress.getPostcode());
  158. orderAddress.setAddress(userAddress.getAddress());
  159. orderAddress.setAddressDetail(userAddress.getAddressDetail());
  160. orderAddress.setUserAddressId(record.getUserAddressId());
  161. orderAddressMapper.insertSelective(orderAddress);
  162. }
  163. }
  164. if (updates > 0) {
  165. return true;
  166. }
  167. }
  168. } catch (Exception e) {
  169. logger.error("createUserOrder", e);
  170. }
  171. return false;
  172. }
  173. @Override
  174. public boolean deleteUserOrder(String id) {
  175. logger.info("deleteUserOrder");
  176. try {
  177. int updates = userOrderMapper.delete(id);
  178. if (updates > 0) {
  179. return true;
  180. }
  181. } catch (Exception e) {
  182. logger.error("deleteUserOrder", e);
  183. }
  184. return false;
  185. }
  186. @Override
  187. public boolean updateUserOrder(UserOrder record) {
  188. logger.info("updateUserOrder");
  189. try {
  190. int updates = userOrderMapper.updateByPrimaryKeySelective(record);
  191. if (updates > 0) {
  192. return true;
  193. }
  194. } catch (Exception e) {
  195. logger.error("updateUserOrder", e);
  196. }
  197. return false;
  198. }
  199. @Override
  200. public Result payOrder(String orderId, double coin, double point, double cash, int payMode) {
  201. logger.info("payOrder:支付订单");
  202. try {
  203. UserOrder userOrder = new UserOrder();
  204. userOrder.setId(Integer.valueOf(orderId));
  205. userOrder = userOrderMapper.queryUserOrder(userOrder);
  206. if (userOrder == null) {
  207. return new Result(false, "支付失败,订单不存在");
  208. }
  209. double money = userOrder.getDealPrice().doubleValue();
  210. if (AppConstant.PayMode.COIN == payMode) {
  211. //如果支付总额不足则用余额补足;
  212. if (money > (coin + point + cash)) {
  213. coin = money - point - cash;
  214. }
  215. }
  216. UserInfo userInfo = userInfoService.getUserInfoById(userOrder.getUserId() + "");
  217. if (userInfo == null) {
  218. return new Result(false, "支付失败,用户不存在!");
  219. }
  220. /**
  221. * 余额
  222. */
  223. double moneyCoin = userInfo.getMoneyCoin();
  224. if (coin > moneyCoin) {
  225. return new Result(false, "支付失败,余额不足");
  226. }
  227. /**
  228. * 商城积分
  229. */
  230. double moneyPoint = userInfo.getMoneyPoint();
  231. if (point > moneyPoint) {
  232. return new Result(false, "支付失败,商城积分不足");
  233. }
  234. if (money > (coin + point + cash)) {
  235. return new Result(false, "支付失败,金额不足");
  236. }
  237. if (point > 0) {
  238. //积分兑换区 只能用商城积分
  239. MemberPoint memberPoint = new MemberPoint();
  240. memberPoint.setCreateUser("系统");
  241. memberPoint.setOrderId(orderId);
  242. memberPoint.setUserId(userOrder.getUserId() + "");
  243. memberPoint.setMoney(String.valueOf(-point + 0.0));
  244. memberPoint.setBalance(String.valueOf(moneyPoint - point));
  245. memberPoint.setTypeFlag(AppConstant.CoinType.CONSUMPTION);
  246. memberPoint.setRemark("购买商品消费,订单号:" + userOrder.getOrderCode());
  247. memberPointService.createMemberPoint(memberPoint);
  248. }
  249. // 个人店铺,只能用余额支付
  250. if (coin > 0) {
  251. MemberCoin memberCoin = new MemberCoin();
  252. memberCoin.setCreateUser("系统");
  253. memberCoin.setOrderId(orderId);
  254. memberCoin.setUserId(userOrder.getUserId() + "");
  255. memberCoin.setMoney(String.valueOf(-coin + 0.0));
  256. memberCoin.setBalance(String.valueOf(moneyCoin - coin));
  257. memberCoin.setTypeFlag(AppConstant.CoinType.CONSUMPTION);
  258. memberCoin.setRemark("购买积分商品消费,订单号:" + userOrder.getOrderCode());
  259. memberCoinService.createMemberCoin(memberCoin);
  260. }
  261. UserInfo updateUser = new UserInfo();
  262. updateUser.setId(userOrder.getUserId());
  263. updateUser.setMoneyCoin(moneyCoin - coin);
  264. updateUser.setMoneyPoint(moneyPoint - point);
  265. userInfoService.updateUserInfo(updateUser);
  266. //更新为已经支付
  267. UserOrder userOrderPay = new UserOrder();
  268. userOrderPay.setId(Integer.valueOf(orderId));
  269. userOrderPay.setCoin(BigDecimal.valueOf(coin));
  270. userOrderPay.setPoint(BigDecimal.valueOf(point));
  271. userOrderPay.setCash(BigDecimal.valueOf(cash));
  272. userOrderPay.setPayMode(payMode);
  273. userOrderPay.setPayTime(new Date());
  274. userOrderPay.setStatusFlag(AppConstant.OrderStatus.PAY_OVER);
  275. userOrderMapper.updateByPrimaryKeySelective(userOrderPay);
  276. return new Result(true, "支付成功");
  277. } catch (Exception e) {
  278. logger.error("payOrder:支付订单异常", e);
  279. }
  280. return new Result(false, "支付失败");
  281. }
  282. @Override
  283. public double calculatedPrice(String orderId, double coin, double point) {
  284. logger.info("calculatedPrice:计算价格");
  285. try {
  286. UserOrder userOrder = new UserOrder();
  287. userOrder.setId(Integer.valueOf(orderId));
  288. userOrder = userOrderMapper.queryUserOrder(userOrder);
  289. double money = userOrder.getDealPrice().doubleValue();
  290. double cash = money - coin - point;
  291. return cash;
  292. } catch (Exception e) {
  293. logger.error("calculatedPrice:计算价格异常", e);
  294. }
  295. return 0;
  296. }
  297. @Override
  298. public Result payOrder(HttpServletRequest request, HttpServletResponse response) {
  299. logger.info("payOrder:支付订单");
  300. try {
  301. System.out.print("微信支付回调数据开始");
  302. String inputLine;
  303. String notityXml = "";
  304. String resXml = "";
  305. try {
  306. while ((inputLine = request.getReader().readLine()) != null) {
  307. notityXml += inputLine;
  308. }
  309. request.getReader().close();
  310. } catch (Exception e) {
  311. e.printStackTrace();
  312. }
  313. System.out.println("接收到的报文:" + notityXml);
  314. Map m = parseXmlToList2(notityXml);
  315. if ("SUCCESS".equals(m.get("result_code").toString())) {
  316. //支付成功
  317. resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
  318. String attach = m.get("attach").toString();
  319. JSONObject attachJson = new JSONObject(attach);
  320. payOrder(attachJson.getString("orderId"), attachJson.getDouble("coin"),
  321. attachJson.getDouble("point"), attachJson.getDouble("cash"), AppConstant.PayMode.WEI_XIN);
  322. WxpayTemp wxpayTemp = new WxpayTemp();
  323. wxpayTemp.setOrderId(attachJson.getString("orderId"));
  324. wxpayTemp.setCoin(BigDecimal.valueOf(attachJson.getDouble("coin")));
  325. wxpayTemp.setPoint(BigDecimal.valueOf(attachJson.getDouble("point")));
  326. wxpayTemp.setCash(BigDecimal.valueOf(attachJson.getDouble("cash")));
  327. wxpayTemp.setTotalAmount(BigDecimal.valueOf(attachJson.getInt("total") / 100.0));
  328. wxpayTemp.setOutTradeNo(m.get("out_trade_no").toString());
  329. wxpayTemp.setTransactionId(m.get("transaction_id").toString());
  330. wxpayTemp.setTypeFlag(AppConstant.Aliapi.BUY);
  331. wxpayTempMapper.insertSelective(wxpayTemp);
  332. } else {
  333. resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
  334. }
  335. System.out.println("微信支付回调数据结束");
  336. HttpSession seesion = request.getSession();
  337. seesion.setAttribute("notify", "微信支付回调");
  338. try {
  339. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  340. out.write(resXml.getBytes());
  341. out.flush();
  342. out.close();
  343. } catch (IOException e) {
  344. // TODO Auto-generated catch block
  345. e.printStackTrace();
  346. }
  347. } catch (Exception e) {
  348. logger.error("payOrder:支付订单异常", e);
  349. }
  350. return new Result(false, "支付失败");
  351. }
  352. @Override
  353. public Result recharge(HttpServletRequest request, HttpServletResponse response) {
  354. logger.info("recharge:支付充值");
  355. try {
  356. System.out.print("微信支付回调数据开始 支付充值");
  357. String inputLine;
  358. String notityXml = "";
  359. String resXml = "";
  360. try {
  361. while ((inputLine = request.getReader().readLine()) != null) {
  362. notityXml += inputLine;
  363. }
  364. request.getReader().close();
  365. } catch (Exception e) {
  366. e.printStackTrace();
  367. }
  368. System.out.println("接收到的报文:" + notityXml);
  369. Map m = parseXmlToList2(notityXml);
  370. if ("SUCCESS".equals(m.get("result_code").toString())) {
  371. //支付成功
  372. resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>" + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
  373. String attach = m.get("attach").toString();
  374. JSONObject attachJson = new JSONObject(attach);
  375. Integer userId = attachJson.getInt("userId");
  376. Integer money = attachJson.getInt("money") / 100;
  377. UserInfo userInfo = userInfoService.getUserInfoById(userId + "");
  378. /**
  379. * 余额
  380. */
  381. double moneyCoin = userInfo.getMoneyCoin();
  382. UserInfo updateUser = new UserInfo();
  383. updateUser.setId(userId);
  384. updateUser.setMoneyCoin(moneyCoin + money);
  385. userInfoService.updateUserInfo(updateUser);
  386. MemberCoin memberCoin = new MemberCoin();
  387. memberCoin.setCreateUser("微信充值");
  388. memberCoin.setUserId(userId + "");
  389. memberCoin.setMoney(String.valueOf(money));
  390. memberCoin.setBalance(String.valueOf(moneyCoin + money));
  391. memberCoin.setTypeFlag(AppConstant.CoinType.RECHARGE);
  392. memberCoin.setRemark("微信充值," + money);
  393. memberCoinService.createMemberCoin(memberCoin);
  394. WxpayTemp wxpayTemp = new WxpayTemp();
  395. wxpayTemp.setUserId(String.valueOf(userId));
  396. wxpayTemp.setOutTradeNo(m.get("out_trade_no").toString());
  397. wxpayTemp.setTransactionId(m.get("transaction_id").toString());
  398. wxpayTemp.setTotalAmount(BigDecimal.valueOf(money));
  399. wxpayTemp.setTypeFlag(AppConstant.Aliapi.RECHARGE);
  400. wxpayTempMapper.insertSelective(wxpayTemp);
  401. } else {
  402. resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>" + "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
  403. }
  404. System.out.println("微信支付回调数据结束");
  405. HttpSession seesion = request.getSession();
  406. seesion.setAttribute("notify", "微信支付回调");
  407. try {
  408. BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
  409. out.write(resXml.getBytes());
  410. out.flush();
  411. out.close();
  412. } catch (IOException e) {
  413. // TODO Auto-generated catch block
  414. e.printStackTrace();
  415. }
  416. } catch (Exception e) {
  417. logger.error("payOrder:支付订单异常", e);
  418. }
  419. return new Result(false, "支付失败");
  420. }
  421. @SuppressWarnings({"rawtypes", "unchecked"})
  422. private Map parseXmlToList2(String xml) {
  423. Map retMap = new HashMap();
  424. try {
  425. StringReader read = new StringReader(xml);
  426. // 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
  427. InputSource source = new InputSource(read);
  428. // 创建一个新的SAXBuilder
  429. SAXBuilder sb = new SAXBuilder();
  430. // 通过输入源构造一个Document
  431. org.jdom.Document doc = sb.build(source);
  432. Element root = (Element) doc.getRootElement();// 指向根节点
  433. List<Element> es = root.getChildren();
  434. if (es != null && es.size() != 0) {
  435. for (Element element : es) {
  436. retMap.put(element.getName(), element.getValue());
  437. }
  438. }
  439. } catch (Exception e) {
  440. e.printStackTrace();
  441. }
  442. return retMap;
  443. }
  444. /**
  445. * <p>支付宝支付成功回调接口。</p>
  446. *
  447. * @param tradeNo
  448. * @param tradeStatus
  449. */
  450. @Override
  451. public void alipaySuccess(String tradeNo, String tradeStatus) {
  452. logger.info("alipaySuccess:支付宝支付成功回调接口 tradeNo:" + tradeNo + ", tradeStatus:" + tradeStatus);
  453. try {
  454. AlipayTemp alipayTemp = new AlipayTemp();
  455. alipayTemp.setOutTradeNo(tradeNo);
  456. alipayTemp = alipayTempMapper.queryAlipayTemp(alipayTemp);
  457. if (alipayTemp != null) {
  458. if (!AppConstant.Aliapi.TRADE_SUCCESS.equals(alipayTemp.getTradeStatus())) {
  459. payOrder(alipayTemp.getOrderId() + "", alipayTemp.getCoin().doubleValue(),
  460. alipayTemp.getPoint().doubleValue(), alipayTemp.getCash().doubleValue(), AppConstant.PayMode.ALIPAY);
  461. alipayTemp.setTradeStatus(tradeStatus);
  462. alipayTempMapper.updateByPrimaryKeySelective(alipayTemp);
  463. }
  464. }
  465. } catch (Exception e) {
  466. logger.error("alipaySuccess:支付宝支付成功回调接口异常 tradeNo:" + tradeNo + ", tradeStatus:" + tradeStatus, e);
  467. }
  468. }
  469. @Override
  470. public Result cancel(UserOrder record) {
  471. logger.info("cancel:取消订单");
  472. try {
  473. UserOrder userOrder = userOrderMapper.selectByPrimaryKey(record.getId());
  474. if (userOrder != null) {
  475. if (AppConstant.OrderStatus.NO_PAY == userOrder.getStatusFlag()) {
  476. record.setStatusFlag(AppConstant.OrderStatus.CANCEL);
  477. userOrderMapper.updateByPrimaryKeySelective(record);
  478. }
  479. }
  480. return new Result(true, "cancel:取消订单成功");
  481. } catch (Exception e) {
  482. logger.error("cancel:取消订单异常", e);
  483. }
  484. return new Result(false, "cancel:取消订单失败");
  485. }
  486. @Override
  487. public Result confirm(UserOrder record) {
  488. logger.info("confirm:确认完成订单");
  489. try {
  490. UserOrder userOrder = userOrderMapper.selectByPrimaryKey(record.getId());
  491. if (userOrder != null) {
  492. boolean confirmFlag = false;
  493. if (AppConstant.ProductType.IMAGE.equals(userOrder.getProductType())
  494. && AppConstant.OrderStatus.ACCEPT == userOrder.getStatusFlag()) {//修图完成
  495. confirmFlag = true;
  496. record.setStatusFlag(AppConstant.OrderStatus.FINISH);
  497. } else if (AppConstant.ProductType.PHYSICAL.equals(userOrder.getProductType())
  498. && AppConstant.OrderStatus.WAIT_REPAIR == userOrder.getStatusFlag()) {//已发货
  499. confirmFlag = true;
  500. record.setStatusFlag(AppConstant.OrderStatus.FINISH);
  501. }
  502. if (confirmFlag) {
  503. record.setConfirmTime(new Date());
  504. userOrderMapper.updateByPrimaryKeySelective(record);
  505. //结算商家
  506. jieSuan(userOrder.getId() + "");
  507. }
  508. }
  509. return new Result(true, "confirm:确认完成成功");
  510. } catch (Exception e) {
  511. logger.error("confirm:确认完成异常", e);
  512. }
  513. return new Result(false, "confirm:确认完成失败");
  514. }
  515. @Override
  516. public Result jieSuan(String orderId) {
  517. logger.info("jieSuan:结算订单");
  518. try {
  519. UserOrder userOrder = new UserOrder();
  520. userOrder.setId(Integer.valueOf(orderId));
  521. userOrder = userOrderMapper.queryUserOrder(userOrder);
  522. if (userOrder != null) {
  523. SystemConfig systemConfig = systemConfigMapper.selectByPrimaryKey(1);
  524. double money = userOrder.getDealPrice().doubleValue();
  525. UserInfo shangJiaUser = userInfoService.getUserInfoById(userOrder.getProductInfo().getStoreInfo().getUserId() + "");
  526. double shangJiaCoin = shangJiaUser.getMoneyCoin();
  527. double fee = 0;
  528. if ("Y".equals(systemConfig.getUseFlag())) {
  529. fee = money * Double.valueOf(systemConfig.getOrderRate()) / 100.0;
  530. }
  531. //更新商家余额
  532. MemberCoin memberCoin = new MemberCoin();
  533. memberCoin.setCreateUser("系统");
  534. memberCoin.setUserId(shangJiaUser.getId() + "");
  535. memberCoin.setOrderId(orderId);
  536. memberCoin.setMoney(String.valueOf(money - fee));
  537. memberCoin.setBalance(String.valueOf(shangJiaCoin + money - fee));
  538. memberCoin.setTypeFlag(AppConstant.CoinType.SALE);
  539. memberCoin.setRemark("售卖商品获得" + money + "订单号:" + userOrder.getOrderCode() + ";服务费:" + fee);
  540. memberCoinService.createMemberCoin(memberCoin);
  541. UserInfo updateShangJia = new UserInfo();
  542. updateShangJia.setId(shangJiaUser.getId());
  543. updateShangJia.setMoneyCoin(shangJiaCoin + money - fee);
  544. userInfoService.updateUserInfo(updateShangJia);
  545. }
  546. return new Result(true, "jieSuan:结算订单成功");
  547. } catch (Exception e) {
  548. logger.error("jieSuan:结算订单异常", e);
  549. }
  550. return new Result(false, "jieSuan:结算订单失败");
  551. }
  552. @Override
  553. public Result refundFail(String orderId) {
  554. logger.info("refundFail:拒绝退款");
  555. try {
  556. UserOrder userOrder = userOrderMapper.selectByPrimaryKey(Integer.valueOf(orderId));
  557. if (userOrder != null) {
  558. if (AppConstant.OrderStatus.REFUNDING == userOrder.getStatusFlag()) {
  559. UserOrder updateOrder = new UserOrder();
  560. updateOrder.setId(userOrder.getId());
  561. updateOrder.setStatusFlag(AppConstant.OrderStatus.REFUND_FAIL);
  562. userOrderMapper.updateByPrimaryKeySelective(updateOrder);
  563. }
  564. }
  565. return new Result(true, "拒绝退款成功");
  566. } catch (Exception e) {
  567. logger.error("refundFail:拒绝退款异常", e);
  568. }
  569. return new Result(false, "拒绝退款失败");
  570. }
  571. @Override
  572. public Result refundOrder(String orderId) {
  573. logger.info("refundOrder:退款");
  574. try {
  575. UserOrder userOrder = userOrderMapper.selectByPrimaryKey(Integer.valueOf(orderId));
  576. if (userOrder != null) {
  577. if (AppConstant.OrderStatus.REFUNDING == userOrder.getStatusFlag()) {
  578. double coin = userOrder.getCoin().doubleValue();
  579. double point = userOrder.getPoint().doubleValue();
  580. double cash = userOrder.getCash().doubleValue();
  581. int payMode = userOrder.getPayMode();
  582. UserInfo userInfo = userInfoService.getUserInfoById(userOrder.getUserId() + "");
  583. /**
  584. * 余额
  585. */
  586. double moneyCoin = userInfo.getMoneyCoin();
  587. /**
  588. * 商城积分
  589. */
  590. double moneyPoint = userInfo.getMoneyPoint();
  591. if (coin > 0) {
  592. MemberCoin memberCoin = new MemberCoin();
  593. memberCoin.setCreateUser("系统");
  594. memberCoin.setUserId(userInfo.getId() + "");
  595. memberCoin.setOrderId(orderId);
  596. memberCoin.setMoney(String.valueOf(coin + 0.0));
  597. memberCoin.setBalance(String.valueOf(moneyCoin + coin));
  598. memberCoin.setTypeFlag(AppConstant.CoinType.REFUND);
  599. memberCoin.setRemark("退款,订单号:" + userOrder.getOrderCode());
  600. memberCoinService.createMemberCoin(memberCoin);
  601. }
  602. if (point > 0) {
  603. MemberPoint memberPoint = new MemberPoint();
  604. memberPoint.setCreateUser("系统");
  605. memberPoint.setOrderId(orderId);
  606. memberPoint.setUserId(userInfo.getId() + "");
  607. memberPoint.setMoney(String.valueOf(point + 0.0));
  608. memberPoint.setBalance(String.valueOf(moneyPoint + point));
  609. memberPoint.setTypeFlag(AppConstant.CoinType.REFUND);
  610. memberPoint.setRemark("退款,订单号:" + userOrder.getOrderCode());
  611. memberPointService.createMemberPoint(memberPoint);
  612. }
  613. if (cash > 0) {
  614. if (AppConstant.PayMode.ALIPAY == payMode) {
  615. AlipayTemp alipayTemp = new AlipayTemp();
  616. alipayTemp.setTradeStatus(AppConstant.Aliapi.TRADE_SUCCESS);
  617. alipayTemp.setOrderId(orderId);
  618. alipayTemp.setTypeFlag(AppConstant.Aliapi.BUY);
  619. alipayTemp = alipayTempMapper.queryAlipayTemp(alipayTemp);
  620. if (alipayTemp != null) {
  621. AlipayClientFactory.refund(alipayTemp.getOutTradeNo(), cash);
  622. }
  623. }
  624. if (AppConstant.PayMode.WEI_XIN == payMode) {
  625. WxpayTemp wxpayTemp = new WxpayTemp();
  626. wxpayTemp.setOrderId(orderId);
  627. wxpayTemp.setTypeFlag(AppConstant.Aliapi.BUY);
  628. wxpayTemp = wxpayTempMapper.queryWxpayTemp(wxpayTemp);
  629. if (wxpayTemp != null) {
  630. String out_refund_no = MbappUtil.create_out_trade_no();
  631. WxPayRefundData data = new WxPayRefundData();
  632. data.setAppid(PropertiesFileLoader.getProperties("weixinappid"));
  633. data.setMch_id(PropertiesFileLoader.getProperties("weixin_mch_id"));
  634. data.setDevice_info(AppConstant.DEVICE_INFO);
  635. data.setNonce_str(MbappUtil.create_nonce_str());
  636. data.setOut_trade_no(wxpayTemp.getOutTradeNo());
  637. data.setTransaction_id(wxpayTemp.getTransactionId());
  638. data.setOut_refund_no(out_refund_no);
  639. data.setTotal_fee((int) (cash * 100));
  640. data.setRefund_fee((int) (cash * 100));
  641. data.setOp_user_id(PropertiesFileLoader.getProperties("weixin_mch_id"));
  642. WXRefundService.refund(data, "UTF-8", PropertiesFileLoader.getProperties("weixin_cert_path"), PropertiesFileLoader.getProperties("weixin_mch_id"));
  643. wxpayTemp.setOutRefundNo(out_refund_no);
  644. wxpayTempMapper.updateByPrimaryKeySelective(wxpayTemp);
  645. }
  646. }
  647. }
  648. UserInfo updateUser = new UserInfo();
  649. updateUser.setId(userInfo.getId());
  650. updateUser.setMoneyCoin(moneyCoin + coin);
  651. updateUser.setMoneyPoint(moneyPoint + point);
  652. userInfoService.updateUserInfo(updateUser);
  653. UserOrder updateOrder = new UserOrder();
  654. updateOrder.setId(userOrder.getId());
  655. updateOrder.setStatusFlag(AppConstant.OrderStatus.REFUND_SUCCESS);
  656. userOrderMapper.updateByPrimaryKeySelective(updateOrder);
  657. }
  658. }
  659. return new Result(true, "退款成功");
  660. } catch (Exception e) {
  661. logger.error("refundOrder:退款异常", e);
  662. }
  663. return new Result(false, "退款失败");
  664. }
  665. @Override
  666. public Result ziDong() {
  667. logger.info("ziDong:定时任务");
  668. try {
  669. //取消无效订单
  670. autoCancel();
  671. return new Result(true, "定时任务成功");
  672. } catch (Exception e) {
  673. logger.error("ziDong:定时任务异常", e);
  674. }
  675. return new Result(false, "定时任务失败");
  676. }
  677. @Override
  678. public Result autoCancel() {
  679. logger.info("autoCancel:取消无用订单");
  680. try {
  681. //获取待取消订单
  682. List<UserOrder> userOrders = userOrderMapper.getAutoCancel();
  683. for (UserOrder userOrder : userOrders) {
  684. UserOrder record = new UserOrder();
  685. record.setId(userOrder.getId());
  686. record.setCancelReason("30分钟未支付,系统自动取消!");
  687. cancel(record);
  688. }
  689. return new Result(true, "取消无用订单成功");
  690. } catch (Exception e) {
  691. logger.error("autoCancel:取消无用订单异常", e);
  692. }
  693. return new Result(false, "取消无用订单失败");
  694. }
  695. /**
  696. * 返修
  697. *
  698. * @param record
  699. * @return
  700. */
  701. @Override
  702. public boolean repair(UserOrder record) {
  703. logger.info("repair");
  704. try {
  705. int updates = userOrderMapper.updateByPrimaryKeySelective(record);
  706. OrderRepair orderRepair = new OrderRepair();
  707. orderRepair.setOrderId(record.getId() + "");
  708. orderRepairMapper.repairByOrderId(orderRepair);
  709. if (updates > 0) {
  710. return true;
  711. }
  712. } catch (Exception e) {
  713. logger.error("repair", e);
  714. }
  715. return false;
  716. }
  717. }