IntegralLogServiceImpl.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. package com.iamberry.wechat.service.ism;
  2. import com.github.pagehelper.PageHelper;
  3. import com.iamberry.wechat.core.entity.admin.ShopSystemRule;
  4. import com.iamberry.wechat.core.entity.ism.IntegralConfig;
  5. import com.iamberry.wechat.core.entity.ism.IntegralLog;
  6. import com.iamberry.wechat.core.entity.member.Member;
  7. import com.iamberry.wechat.core.entity.order.Order;
  8. import com.iamberry.wechat.core.entity.page.PageRequest;
  9. import com.iamberry.wechat.core.entity.page.PagedResult;
  10. import com.iamberry.wechat.face.cart.CartService;
  11. import com.iamberry.wechat.face.ism.IntegralLogService;
  12. import com.iamberry.wechat.face.order.AdminOrderService;
  13. import com.iamberry.wechat.service.PageUtil;
  14. import com.iamberry.wechat.service.mapper.IntegralConfigMapper;
  15. import com.iamberry.wechat.service.mapper.IntegralLogMapper;
  16. import com.iamberry.wechat.service.mapper.MemberMapper;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import java.text.Format;
  23. import java.text.SimpleDateFormat;
  24. import java.util.Calendar;
  25. import java.util.Date;
  26. import java.util.List;
  27. /**
  28. * 积分记录表接口
  29. * @author Administrator
  30. * @Date 2019-11-10
  31. */
  32. @Service
  33. public class IntegralLogServiceImpl implements IntegralLogService {
  34. Logger logger = LoggerFactory.getLogger(IntegralLogServiceImpl.class);
  35. @Autowired
  36. private IntegralLogMapper integralLogMapper;
  37. @Autowired
  38. private IntegralConfigMapper integralConfigMapper;
  39. @Autowired
  40. private MemberMapper memberMapper;
  41. @Autowired
  42. private IntegralLogService integralLogService;
  43. @Autowired
  44. private AdminOrderService adminOrderService;
  45. @Autowired
  46. private CartService cartService;
  47. /**
  48. * 获取集合
  49. * @param integralLog
  50. * @return List
  51. */
  52. @Override
  53. public List<IntegralLog> getIntegralLogList(IntegralLog integralLog){
  54. return integralLogMapper.getIntegralLogList(integralLog);
  55. }
  56. @Override
  57. public List<IntegralLog> getIntegralLogListByAccoUser(IntegralLog integralLog) {
  58. return integralLogMapper.getIntegralLogListByAccoUser(integralLog);
  59. }
  60. @Override
  61. public PagedResult<IntegralLog> listIntegralLog(PageRequest<IntegralLog> pageRequest) {
  62. PageHelper.startPage(pageRequest.getPageNO(), pageRequest.getPageSize(), pageRequest.isPageTotal());
  63. List<IntegralLog> detedctList = integralLogMapper.getIntegralLogListByAccoUser(pageRequest.getData());
  64. return PageUtil.getPage(detedctList);
  65. }
  66. @Override
  67. public List<IntegralLog> getIntegralLogListByWaitUser() {
  68. return integralLogMapper.getIntegralLogListByWaitUser();
  69. }
  70. /**
  71. * 查询单条数据
  72. * @param id
  73. * @return integralLog
  74. */
  75. @Override
  76. public IntegralLog getIntegralLogById(Integer id){
  77. return integralLogMapper.getIntegralLogById(id);
  78. }
  79. /**
  80. * 增加数据
  81. * @param integralLog
  82. * @return Integer
  83. */
  84. @Override
  85. public Integer save(IntegralLog integralLog){
  86. return integralLogMapper.save(integralLog);
  87. }
  88. /**
  89. * 修改数据
  90. * @param integralLog
  91. * @return Integer
  92. */
  93. @Override
  94. public Integer update(IntegralLog integralLog){
  95. return integralLogMapper.update(integralLog);
  96. }
  97. /**
  98. * 删除数据
  99. * @param id
  100. * @return Integer
  101. */
  102. @Override
  103. public Integer delete(Integer id){
  104. return integralLogMapper.delete(id);
  105. }
  106. /**
  107. * 订单结算只能获得待入账积分
  108. * @param orderId
  109. * @return
  110. */
  111. @Override
  112. @Transactional
  113. public Integer addOrderChangIntegra(String orderId,Integer integraConfigId) {
  114. Integer flag = 0;
  115. Order order = new Order();
  116. order.setSalesOrderid(orderId);
  117. order = cartService.selectOrderInfoById(order);
  118. Format f = new SimpleDateFormat("MM-dd");
  119. Member member = memberMapper.getMemberByUserOpenId(order.getSalesOpenid());
  120. String date1 = f.format(member.getUserBirthDate());
  121. String date2 = f.format(new Date());
  122. IntegralConfig integralConfig = null;
  123. if(date1.equals(date2)){
  124. //生日当天订单结算获取积分X*0.3
  125. integralConfig = integralConfigMapper.getIntegralConfigById(3);
  126. }else{
  127. //订单结算获取积分 按照传入的值计算
  128. integralConfig = integralConfigMapper.getIntegralConfigById(integraConfigId);
  129. }
  130. if(integralConfig == null || integralConfig.getInteConfCalculation()==null || "".equals(integralConfig.getInteConfCalculation())){
  131. return flag;
  132. }
  133. Double num = Double.valueOf(integralConfig.getInteConfCalculation());
  134. num = num*(order.getSalesYetAmount()/100);
  135. return integralLogService.changeIntegral(order.getSalesOpenid(),integralConfig.getInteConfId(),num.intValue(),
  136. 3,orderId,"",integralConfig.getInteConfDesc());
  137. }
  138. /**
  139. * 订单结算使用积分
  140. * @param order
  141. * @return
  142. */
  143. @Override
  144. public Integer muOrderChangIntegra(Order order) {
  145. IntegralConfig integralConfig = integralConfigMapper.getIntegralConfigById(4);
  146. Integer num = order.getSalesIntegralNum(); //setSalesIntegralNum
  147. return integralLogService.changeIntegral(order.getSalesOpenid(),integralConfig.getInteConfId(),num.intValue(),2,
  148. "",order.getSalesOrderid(),integralConfig.getInteConfDesc());
  149. }
  150. /**
  151. * 添加&&使用积分 - 简洁版
  152. * @param openId
  153. * @param inteConfId 积分配置id
  154. * @param inteLogType 积分类型 1:添加积分2:使用积分3:待入账积分
  155. * @return
  156. */
  157. @Override
  158. @Transactional
  159. public Integer updateIntegral(String openId,Integer inteConfId,Integer inteLogType){
  160. Integer flag = 0;
  161. IntegralConfig integralConfig = integralConfigMapper.getIntegralConfigById(inteConfId);
  162. if(integralConfig == null || integralConfig.getInteConfCalculation()==null || "".equals(integralConfig.getInteConfCalculation())){
  163. return flag;
  164. }
  165. Integer num = Integer.valueOf(integralConfig.getInteConfCalculation());
  166. return integralLogService.changeIntegral(openId,inteConfId,num,inteLogType,"","",integralConfig.getInteConfDesc());
  167. }
  168. /**
  169. * 取消订单-减去积分
  170. * @param orderId
  171. * @return
  172. */
  173. @Override
  174. @Transactional
  175. public Integer cancelSurplusIntegral(String orderId){
  176. Integer flag = 0;
  177. Order order = new Order();
  178. order.setSalesOrderid(orderId);
  179. order = cartService.selectOrderInfoById(order);
  180. if(order.getSalesStatus() != 0 ){ //取消订单
  181. throw new RuntimeException("该订单未取消");
  182. }
  183. //退回使用积分
  184. IntegralLog usedintegralLog = new IntegralLog();
  185. usedintegralLog.setInteLogUseOrderId(orderId);
  186. List<IntegralLog> usedintegralLogList = integralLogService.getIntegralLogList(usedintegralLog);
  187. if(usedintegralLogList!=null && usedintegralLogList.size() > 0){
  188. usedintegralLog = usedintegralLogList.get(0);
  189. IntegralLog newusedintegralLog = new IntegralLog();
  190. newusedintegralLog.setInteLogId(usedintegralLog.getInteLogId());
  191. newusedintegralLog.setInteLogStatus(2);
  192. newusedintegralLog.setInteLogDesc(usedintegralLog.getInteLogDesc()+"===订单取消");
  193. flag = integralLogService.update(newusedintegralLog);
  194. if(flag < 1){
  195. throw new RuntimeException("取消订单退回积分-使用积分取消");
  196. }
  197. Member member = memberMapper.getMemberByUserOpenId(usedintegralLog.getUserOpenId());
  198. Member newMember = new Member();
  199. newMember.setUserOpenid(member.getUserOpenid());
  200. newMember.setUserSurplusIntegral(member.getUserSurplusIntegral() + usedintegralLog.getInteLogChangeNum());
  201. newMember.setUserUseIntegral(member.getUserUseIntegral() - usedintegralLog.getInteLogChangeNum());
  202. flag = memberMapper.nowUpdateUserByOpenId(newMember);
  203. if(flag < 1){
  204. throw new RuntimeException("取消订单待入账更改失败-变更用户积分失败");
  205. }
  206. return flag;
  207. }
  208. return 1;
  209. }
  210. /**
  211. * 积分操作 - 核心入口
  212. * @param openId 必填 *
  213. * @param inteConfId 必填 * 积分配置id
  214. * @param inteLogType 必填 * 积分类型 1:添加积分2:使用积分3:待入账积分
  215. * @param waitingOrderId 订单支付获得积分,待入账需要订单编号
  216. * @param useOrderId 订单支付使用积分/积分商城下单使用积分都需要订单编号
  217. * @param remake 备注
  218. * @return
  219. */
  220. @Override
  221. @Transactional
  222. public Integer changeIntegral(String openId, Integer inteConfId,Integer integralNum, Integer inteLogType,
  223. String waitingOrderId,String useOrderId,String remake) {
  224. Integer flag = 0;
  225. IntegralConfig integralConfig = integralConfigMapper.getIntegralConfigById(inteConfId);
  226. if(integralNum <= 0){
  227. throw new RuntimeException("需要添加/减少的积分为0");
  228. }
  229. Member member = memberMapper.getMemberByUserOpenId(openId);
  230. Member newMember = new Member();
  231. newMember.setUserOpenid(member.getUserOpenid());
  232. IntegralLog integralLog = new IntegralLog();
  233. integralLog.setUserOpenId(openId);
  234. integralLog.setInteConfId(inteConfId);
  235. integralLog.setInteLogType(inteLogType);
  236. integralLog.setInteLogStatus(1);
  237. if(inteLogType == 1 || inteLogType == 2){
  238. integralLog.setInteLogChangeNum(integralNum);
  239. integralLog.setInteLogBeforeNum(member.getUserIntegral());
  240. if(inteLogType == 1){
  241. integralLog.setInteLogAfterNum(member.getUserIntegral()+integralNum);
  242. integralLog.setInteLogDesc(remake+"--积分新增:"+integralNum);
  243. newMember.setUserIntegral(member.getUserIntegral()+integralNum);
  244. newMember.setUserSurplusIntegral(member.getUserSurplusIntegral()+integralNum);
  245. }else{
  246. Integer num = member.getUserIntegral()-integralNum;
  247. if(num < 0){
  248. throw new RuntimeException("积分不足");
  249. }
  250. integralLog.setInteLogAfterNum(num);
  251. integralLog.setInteLogDesc(remake+"--积分使用:"+integralNum);
  252. if(useOrderId != null && !"".equals(useOrderId)){
  253. integralLog.setInteLogUseOrderId(useOrderId);
  254. }
  255. newMember.setUserSurplusIntegral(member.getUserSurplusIntegral()-integralNum);
  256. newMember.setUserUseIntegral(member.getUserUseIntegral()+integralNum);
  257. }
  258. }else if(inteLogType == 3){
  259. if(member.getUserPendIntegral() == null){
  260. member.setUserPendIntegral(0);
  261. }
  262. integralLog.setInteLogChangeNum(integralNum);
  263. integralLog.setInteLogBeforeNum(member.getUserPendIntegral());
  264. integralLog.setInteLogAfterNum(member.getUserPendIntegral()+integralNum);
  265. ShopSystemRule shopSystemRule = adminOrderService.getReluByRid(102);
  266. Calendar calendar = Calendar.getInstance();
  267. calendar.add(Calendar.DATE, shopSystemRule.getRuleNum().intValue()); //待入账
  268. integralLog.setInteLogWaitingDate(calendar.getTime()); //inteLogWaitingDate //待入账时间
  269. if(waitingOrderId == null || "".equals(waitingOrderId)){
  270. throw new RuntimeException("待入账没有订单编号");
  271. }
  272. integralLog.setInteLogWaitingOrderId(waitingOrderId);
  273. integralLog.setInteLogDesc(remake+"--待入账:"+integralNum+",关联订单ID:"+waitingOrderId);
  274. newMember.setUserPendIntegral(member.getUserPendIntegral()+integralNum);
  275. }else{
  276. throw new RuntimeException("inteLogType积分类型不正确");
  277. }
  278. logger.info("积分调整-类型:"+integralConfig.getInteConfName()+";数量:"+integralLog.getInteLogChangeNum()+";userOpenId:"+integralLog.getUserOpenId());
  279. integralLog.setInteLogName(integralConfig.getInteConfName());
  280. flag = integralLogMapper.save(integralLog);
  281. if(flag < 1){
  282. throw new RuntimeException("添加积分记录失败");
  283. }
  284. flag = memberMapper.nowUpdateUserByOpenId(newMember);
  285. if(flag < 1){
  286. throw new RuntimeException("变更用户积分失败");
  287. }
  288. return flag;
  289. }
  290. /**
  291. * 待入账转入-积分从待入账转为已入账
  292. * @param integralLog
  293. * @return
  294. */
  295. @Override
  296. @Transactional
  297. public Integer waitUser(IntegralLog integralLog) {
  298. //0:校验订单状态
  299. //1.给用户减去待入账积分
  300. //2.添加一条新纪录,添加剩余积分和总积分
  301. //3.将该积分记录置位删除标志
  302. Integer flag = 0;
  303. Order order = new Order();
  304. order.setSalesOrderid(integralLog.getInteLogWaitingOrderId());
  305. order = cartService.selectOrderInfoById(order);
  306. if(order.getSalesStatus() == 0 ){
  307. //状态 0:取消订单
  308. //cancelSurplusIntegral(order.getSalesOrderid()); 理论不存在
  309. }else if(order.getSalesStatus() == 1 || order.getSalesStatus() == 2){
  310. //状态 1:待支付 2:已支付、待发货
  311. throw new RuntimeException("订单异常-订单状态未支付,或代发货-待入账转为已入账任务");
  312. }else if(order.getSalesStatus() == 4 || order.getSalesStatus() == 8){
  313. //8:订单退货,订单关闭 4:已退款 -- 退款退货,直接结束这个待入账积分
  314. //将该积分记录置位删除标志-并且减去待入账 - 订单退货/退款
  315. IntegralLog newIntegralLog = new IntegralLog();
  316. newIntegralLog.setInteLogId(integralLog.getInteLogId());
  317. newIntegralLog.setInteLogStatus(2);
  318. newIntegralLog.setInteLogDesc(integralLog.getInteLogDesc()+"===订单退货/退款");
  319. flag = integralLogService.update(newIntegralLog);
  320. if(flag < 1){
  321. throw new RuntimeException("删除以前的待入账积分失败-待入账转为已入账任务");
  322. }
  323. Member member = memberMapper.getMemberByUserOpenId(integralLog.getUserOpenId());
  324. if((member.getUserPendIntegral()-integralLog.getInteLogChangeNum())<0){
  325. throw new RuntimeException("删除以前的待入账积分不足-请核查用户信息-待入账转为已入账任务");
  326. }
  327. Member newMember = new Member();
  328. newMember.setUserOpenid(member.getUserOpenid());
  329. newMember.setUserPendIntegral(member.getUserPendIntegral()-integralLog.getInteLogChangeNum());
  330. flag = memberMapper.nowUpdateUserByOpenId(newMember);
  331. if(flag < 1){
  332. throw new RuntimeException("删除以前的待入账积分失败-变更用户积分失败");
  333. }
  334. }else if(order.getSalesStatus() == 3 || order.getSalesStatus() == 6 || order.getSalesStatus() == 7
  335. || order.getSalesStatus() == 9 || order.getSalesStatus() == 11){
  336. //3:退款申请中 6:申请退货中 7:退货中 9:换货中 11:申请换货中
  337. throw new RuntimeException("订单处于退款/退货/换货处理中,请快速处理-待入账转为已入账任务");
  338. }else if(order.getSalesStatus() == 5 || order.getSalesStatus() == 12 || order.getSalesStatus() == 10){
  339. // 5:已发货 12:订单完成 10:换货完成
  340. //1.给用户减去待入账积分
  341. Member member = memberMapper.getMemberByUserOpenId(integralLog.getUserOpenId());
  342. if((member.getUserPendIntegral()-integralLog.getInteLogChangeNum())<0){
  343. throw new RuntimeException("待入账积分不足-请核查用户信息-待入账转为已入账任务");
  344. }
  345. Member newMember = new Member();
  346. newMember.setUserOpenid(member.getUserOpenid());
  347. newMember.setUserPendIntegral(member.getUserPendIntegral()-integralLog.getInteLogChangeNum());
  348. flag = memberMapper.nowUpdateUserByOpenId(newMember);
  349. if(flag < 1){
  350. throw new RuntimeException("变更用户待入账积分失败-待入账转为已入账任务");
  351. }
  352. //2.添加一条新纪录,添加剩余积分和总积分
  353. String remake = integralLog.getInteLogDesc()+"原待入账LogId为:"+ integralLog.getInteLogId();
  354. flag = integralLogService.changeIntegral(integralLog.getUserOpenId(),6,integralLog.getInteLogChangeNum(),1,
  355. "","",remake);
  356. if(flag < 1){
  357. throw new RuntimeException("添加入账积分记录失败-待入账转为已入账任务");
  358. }
  359. //3.将该积分记录置位删除标志
  360. IntegralLog newIntegralLog = new IntegralLog();
  361. newIntegralLog.setInteLogId(integralLog.getInteLogId());
  362. newIntegralLog.setInteLogStatus(2);
  363. newIntegralLog.setInteLogDesc(integralLog.getInteLogDesc()+"===已将待入账转为已入账,故删除");
  364. flag = integralLogService.update(newIntegralLog);
  365. if(flag < 1){
  366. throw new RuntimeException("删除以前的待入账-待入账转为已入账任务");
  367. }
  368. }else{
  369. throw new RuntimeException("订单异常状态异常-请核查订单详情-待入账转为已入账任务");
  370. }
  371. return flag;
  372. }
  373. }