AccountInnerServiceSMOImpl.java 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. package com.java110.acct.smo.impl;
  2. import com.java110.acct.dao.IAccountDetailServiceDao;
  3. import com.java110.acct.dao.IAccountServiceDao;
  4. import com.java110.core.annotation.Java110Transactional;
  5. import com.java110.core.base.smo.BaseServiceSMO;
  6. import com.java110.core.factory.GenerateCodeFactory;
  7. import com.java110.dto.PageDto;
  8. import com.java110.dto.account.AccountDto;
  9. import com.java110.dto.account.AccountDetailDto;
  10. import com.java110.dto.user.UserDto;
  11. import com.java110.intf.acct.IAccountInnerServiceSMO;
  12. import com.java110.po.account.AccountPo;
  13. import com.java110.po.account.AccountDetailPo;
  14. import com.java110.utils.lock.DistributedLock;
  15. import com.java110.utils.util.BeanConvertUtil;
  16. import com.java110.utils.util.ListUtil;
  17. import com.java110.utils.util.StringUtil;
  18. import org.springframework.beans.factory.annotation.Autowired;
  19. import org.springframework.web.bind.annotation.RequestBody;
  20. import org.springframework.web.bind.annotation.RestController;
  21. import java.math.BigDecimal;
  22. import java.util.ArrayList;
  23. import java.util.List;
  24. /**
  25. * @ClassName FloorInnerServiceSMOImpl
  26. * @Description 账户内部服务实现类
  27. * @Author wuxw
  28. * @Date 2019/4/24 9:20
  29. * @Version 1.0
  30. * add by wuxw 2019/4/24
  31. **/
  32. @RestController
  33. public class AccountInnerServiceSMOImpl extends BaseServiceSMO implements IAccountInnerServiceSMO {
  34. @Autowired
  35. private IAccountServiceDao accountServiceDaoImpl;
  36. @Autowired
  37. private IAccountDetailServiceDao accountDetailServiceDaoImpl;
  38. @Override
  39. public List<AccountDto> queryAccounts(@RequestBody AccountDto accountDto) {
  40. //校验是否传了 分页信息
  41. int page = accountDto.getPage();
  42. if (page != PageDto.DEFAULT_PAGE) {
  43. accountDto.setPage((page - 1) * accountDto.getRow());
  44. }
  45. List<AccountDto> accounts = BeanConvertUtil.covertBeanList(accountServiceDaoImpl.getAccountInfo(BeanConvertUtil.beanCovertMap(accountDto)), AccountDto.class);
  46. return accounts;
  47. }
  48. /**
  49. * 从用户列表中查询用户,将用户中的信息 刷新到 floor对象中
  50. *
  51. * @param account 小区账户信息
  52. * @param users 用户列表
  53. */
  54. private void refreshAccount(AccountDto account, List<UserDto> users) {
  55. for (UserDto user : users) {
  56. if (account.getAcctId().equals(user.getUserId())) {
  57. BeanConvertUtil.covertBean(user, account);
  58. }
  59. }
  60. }
  61. /**
  62. * 获取批量userId
  63. *
  64. * @param accounts 小区楼信息
  65. * @return 批量userIds 信息
  66. */
  67. private String[] getUserIds(List<AccountDto> accounts) {
  68. List<String> userIds = new ArrayList<String>();
  69. for (AccountDto account : accounts) {
  70. userIds.add(account.getAcctId());
  71. }
  72. return userIds.toArray(new String[userIds.size()]);
  73. }
  74. @Override
  75. public int queryAccountsCount(@RequestBody AccountDto accountDto) {
  76. return accountServiceDaoImpl.queryAccountsCount(BeanConvertUtil.beanCovertMap(accountDto));
  77. }
  78. @Override
  79. @Java110Transactional
  80. public int updateAccount(@RequestBody AccountPo accountPo) {
  81. return accountServiceDaoImpl.updateAccount(BeanConvertUtil.beanCovertMap(accountPo));
  82. }
  83. @Override
  84. public int saveAccount(@RequestBody AccountPo accountPo) {
  85. //todo 查询账户是否已经存在
  86. AccountDto accountDto = new AccountDto();
  87. accountDto.setObjId(accountPo.getObjId());
  88. accountDto.setPartId(accountPo.getPartId());
  89. accountDto.setLink(accountPo.getLink());
  90. accountDto.setAcctType(accountPo.getAcctType());
  91. int flag = accountServiceDaoImpl.queryAccountsCount(BeanConvertUtil.beanCovertMap(accountDto));
  92. if (flag > 0) {
  93. return flag;
  94. }
  95. //todo 保存
  96. accountServiceDaoImpl.saveAccount(BeanConvertUtil.beanCovertMap(accountPo));
  97. return 1;
  98. }
  99. /**
  100. * 预存接口
  101. *
  102. * @param accountDetailPo
  103. * @return
  104. */
  105. @Override
  106. @Java110Transactional
  107. public int prestoreAccount(@RequestBody AccountDetailPo accountDetailPo) {
  108. if (StringUtil.isEmpty(accountDetailPo.getAcctId())) {
  109. throw new IllegalArgumentException("账户ID为空");
  110. }
  111. //开始枷锁
  112. String requestId = DistributedLock.getLockUUID();
  113. String key = accountDetailPo.getAcctId();
  114. AccountDto accountDto = null;
  115. List<AccountDto> accounts = null;
  116. int flag;
  117. try {
  118. DistributedLock.waitGetDistributedLock(key, requestId);
  119. accountDto = new AccountDto();
  120. accountDto.setObjId(accountDetailPo.getObjId());
  121. accountDto.setAcctId(accountDetailPo.getAcctId());
  122. accounts = BeanConvertUtil.covertBeanList(accountServiceDaoImpl.getAccountInfo(BeanConvertUtil.beanCovertMap(accountDto)), AccountDto.class);
  123. if (ListUtil.isNull(accounts)) {
  124. throw new IllegalArgumentException("账户不存在");
  125. }
  126. //在账户增加
  127. double amount = Double.parseDouble(accounts.get(0).getAmount());
  128. BigDecimal amountBig = new BigDecimal(amount);
  129. amount = amountBig.add(new BigDecimal(Double.parseDouble(accountDetailPo.getAmount()))).doubleValue();
  130. AccountPo accountPo = new AccountPo();
  131. accountPo.setObjId(accountDetailPo.getObjId());
  132. accountPo.setAcctId(accountDetailPo.getAcctId());
  133. accountPo.setAmount(amount + "");
  134. flag = accountServiceDaoImpl.updateAccount(BeanConvertUtil.beanCovertMap(accountPo));
  135. if (flag < 1) {
  136. throw new IllegalArgumentException("更新账户失败");
  137. }
  138. } finally {
  139. DistributedLock.releaseDistributedLock(requestId, key);
  140. }
  141. accountDetailPo.setDetailType(AccountDetailDto.DETAIL_TYPE_IN);
  142. if (StringUtil.isEmpty(accountDetailPo.getDetailId())) {
  143. accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
  144. }
  145. if (StringUtil.isEmpty(accountDetailPo.getOrderId())) {
  146. accountDetailPo.setOrderId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_orderId));
  147. }
  148. if (StringUtil.isEmpty(accountDetailPo.getRelAcctId())) {
  149. accountDetailPo.setRelAcctId("-1");
  150. }
  151. //保存交易明细
  152. return accountDetailServiceDaoImpl.saveAccountDetails(BeanConvertUtil.beanCovertMap(accountDetailPo));
  153. }
  154. /**
  155. * 扣款接口
  156. *
  157. * @param accountDetailPo
  158. * @return
  159. */
  160. @Override
  161. @Java110Transactional
  162. public int withholdAccount(@RequestBody AccountDetailPo accountDetailPo) {
  163. if (StringUtil.isEmpty(accountDetailPo.getAcctId())) {
  164. throw new IllegalArgumentException("账户ID为空");
  165. }
  166. //开始枷锁
  167. String requestId = DistributedLock.getLockUUID();
  168. String key = accountDetailPo.getAcctId();
  169. AccountDto accountDto = null;
  170. List<AccountDto> accounts = null;
  171. int flag;
  172. try {
  173. DistributedLock.waitGetDistributedLock(key, requestId);
  174. accountDto = new AccountDto();
  175. accountDto.setObjId(accountDetailPo.getObjId());
  176. accountDto.setAcctId(accountDetailPo.getAcctId());
  177. accounts = BeanConvertUtil.covertBeanList(accountServiceDaoImpl.getAccountInfo(BeanConvertUtil.beanCovertMap(accountDto)), AccountDto.class);
  178. if (accounts == null || accounts.size() < 1) {
  179. throw new IllegalArgumentException("账户不存在");
  180. }
  181. //在账户增加
  182. double amount = Double.parseDouble(accounts.get(0).getAmount());
  183. BigDecimal amountBig = new BigDecimal(amount);
  184. amount = amountBig.subtract(new BigDecimal(Double.parseDouble(accountDetailPo.getAmount()))).doubleValue();
  185. if (amount < 0) {
  186. throw new IllegalArgumentException("余额不足");
  187. }
  188. AccountPo accountPo = new AccountPo();
  189. accountPo.setObjId(accounts.get(0).getObjId());
  190. accountPo.setAcctId(accountDetailPo.getAcctId());
  191. accountPo.setAmount(amount + "");
  192. flag = accountServiceDaoImpl.updateAccount(BeanConvertUtil.beanCovertMap(accountPo));
  193. if (flag < 1) {
  194. throw new IllegalArgumentException("更新账户失败");
  195. }
  196. accountDetailPo.setObjId(accounts.get(0).getObjId());
  197. accountDetailPo.setObjType(accounts.get(0).getObjType());
  198. } finally {
  199. DistributedLock.releaseDistributedLock(key, requestId);
  200. }
  201. accountDetailPo.setDetailType(AccountDetailDto.DETAIL_TYPE_OUT);
  202. if (StringUtil.isEmpty(accountDetailPo.getDetailId())) {
  203. accountDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
  204. }
  205. if (StringUtil.isEmpty(accountDetailPo.getOrderId())) {
  206. accountDetailPo.setOrderId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_orderId));
  207. }
  208. if (StringUtil.isEmpty(accountDetailPo.getRelAcctId())) {
  209. accountDetailPo.setRelAcctId("-1");
  210. }
  211. //保存交易明细
  212. return accountDetailServiceDaoImpl.saveAccountDetails(BeanConvertUtil.beanCovertMap(accountDetailPo));
  213. }
  214. public IAccountServiceDao getAccountServiceDaoImpl() {
  215. return accountServiceDaoImpl;
  216. }
  217. public void setAccountServiceDaoImpl(IAccountServiceDao accountServiceDaoImpl) {
  218. this.accountServiceDaoImpl = accountServiceDaoImpl;
  219. }
  220. }