UserSignFugouRepository.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <?php
  2. namespace app\common\repositories\user;
  3. use app\common\dao\user\UserSignFugouDao;
  4. use app\common\enum\user\UserSignFugouEnum;
  5. use app\common\repositories\BaseRepository;
  6. use app\common\repositories\store\order\StoreOrderRepository;
  7. use app\entity\data\user\UserEntity;
  8. use app\entity\data\user\UserSignFugouEntity;
  9. use think\db\exception\DbException;
  10. use think\exception\ValidateException;
  11. class UserSignFugouRepository extends BaseRepository
  12. {
  13. public function __construct(UserSignFugouDao $dao)
  14. {
  15. $this->dao = $dao;
  16. }
  17. /**
  18. * @param int $id
  19. * @return UserSignFugouEntity
  20. */
  21. public function getUserSignFugouEntityById(int $id): UserSignFugouEntity
  22. {
  23. $entityList = $this->getUserSignFugouEntityListByIdList([$id]);
  24. $entity = array_shift($entityList);
  25. if ($entity instanceof UserSignFugouEntity) {
  26. return $entity;
  27. } else {
  28. /** @var UserSignFugouEntity */
  29. return UserSignFugouEntity::newInstance();
  30. }
  31. }
  32. /**
  33. * @param array $idList
  34. * @return UserSignFugouEntity[]
  35. */
  36. public function getUserSignFugouEntityListByIdList(array $idList): array
  37. {
  38. return $this->dao->getUserSignFugouEntityListByIdList($idList);
  39. }
  40. /**
  41. * @param string $orderType
  42. * @param array $orderIdList
  43. * @return UserSignFugouEntity[]
  44. */
  45. public function getUserSignFugouEntityListByOrderIdListAndPending(string $orderType, array $orderIdList): array
  46. {
  47. return $this->dao->getUserSignFugouEntityListByOrderIdListAndPending($orderType, $orderIdList);
  48. }
  49. public function create($data)
  50. {
  51. return $this->dao->create($data);
  52. }
  53. /**
  54. * 写入 复购金 记录
  55. * @param UserSignFugouEntity $userSignFugouEntity
  56. * @return UserSignFugouEntity
  57. */
  58. public function createByEntity(UserSignFugouEntity $userSignFugouEntity): UserSignFugouEntity
  59. {
  60. $result = $this->dao->create($userSignFugouEntity->toUnderlineArray())->toArray();
  61. /** @var UserSignFugouEntity $entity */
  62. $entity = UserSignFugouEntity::newInstance($result);
  63. return $entity;
  64. }
  65. /**
  66. * 添加 复购金记录
  67. * @param int $uid
  68. * @param int $type
  69. * @param float $number
  70. * @param int $commissionType
  71. * @param string $mark
  72. * @param string $orderType
  73. * @param string $orderId
  74. * @return UserSignFugouEntity
  75. */
  76. public function addUserSingFugou(int $uid, int $type, float $number, int $commissionType, string $mark = '', string $orderType = '', string $orderId = ''): UserSignFugouEntity
  77. {
  78. if (!empty($orderType)) {
  79. if (!empty($orderId)) {
  80. if ($orderType == UserSignFugouEnum::ORDER_TYPE['Platform']['code']) {
  81. /** @var StoreOrderRepository $storeOrderRepository */
  82. $storeOrderRepository = app()->make(StoreOrderRepository::class);
  83. $storeOrderEntity = $storeOrderRepository->getStoreOrderEntityByOrderId((int)$orderId);
  84. if (empty($storeOrderEntity->getOrderId())) {
  85. throw new ValidateException('未查询到订单信息');
  86. }
  87. }
  88. }
  89. }
  90. /** @var UserSignFugouEntity $userSignFugouEntity */
  91. $userSignFugouEntity = UserSignFugouEntity::newInstance();
  92. $userSignFugouEntity->setUid($uid)
  93. ->setType($type)
  94. ->setNumber($number)
  95. ->setCommissionType($commissionType)
  96. ->setMark($mark)
  97. ->setOrderType($orderType)
  98. ->setOrderId($orderId)
  99. ->setAddtime(time())
  100. ->setStatus(UserSignFugouEnum::STATUS['Pending']['code']);
  101. return $this->createByEntity($userSignFugouEntity);
  102. }
  103. /**
  104. * 将 复购 记录设置为生效状态 并对用户的 复购 字段进行增减
  105. * @param int $id
  106. * @return UserSignFugouEntity
  107. */
  108. public function execute(int $id): UserSignFugouEntity
  109. {
  110. $result = $this->executeByIdList([$id]);
  111. return array_shift($result);
  112. }
  113. /**
  114. * 将 复购 记录设置为生效状态 并对用户的 复购 字段进行增减
  115. * @param array $idList
  116. * @return array
  117. */
  118. public function executeByIdList(array $idList): array
  119. {
  120. $userSignFugouEntityList = $this->getUserSignFugouEntityListByIdList($idList);
  121. $userIdList = [];
  122. // 忽略 已经生效的 记录
  123. $userSignFugouEntityList = array_filter($userSignFugouEntityList, function ($entity) use (&$userIdList) {
  124. // 积分数据不为空 用户不为空 状态属于待结算 并且结算字段为空
  125. if ((!empty($entity->getId()) && !empty($entity->getUid()) && ($entity->getStatus() == UserSignFugouEnum::STATUS['Pending']['code']) && empty($entity->getSettlementTime()))) {
  126. $userIdList[] = $entity->getUid();
  127. return true;
  128. }
  129. return false;
  130. });
  131. if (!empty($userSignFugouEntityList)) {
  132. // 获取用户 映射信息
  133. /** @var UserRepository $userRepository */
  134. $userRepository = app()->make(UserRepository::class);
  135. /** @var UserEntity[] $userEntityMapByUid */
  136. $userEntityMapByUid = [];
  137. if (!empty($userIdList)) {
  138. $userEntityMapByUid = $userRepository->getUserEntityMapByUidList($userIdList);
  139. }
  140. /** @var UserEntity[] $updateUserEntityList */
  141. $updateUserEntityList = [];
  142. /** @var UserSignFugouEntity[] $updateUserFugouEntityList */
  143. $updateUserFugouEntityList = [];
  144. foreach ($userSignFugouEntityList as $userSignFugouEntity) {
  145. $userEntity = $userEntityMapByUid[$userSignFugouEntity->getUid()];
  146. if (empty($userEntity) || empty($userEntity->getUid())) {
  147. throw new ValidateException("未查询到用户信息(FugouId:{$userSignFugouEntity->getId()})");
  148. }
  149. // 组建 更新 用户信息
  150. if (isset($updateUserEntityList[$userEntity->getUid()])) {
  151. $updateUserEntity = $updateUserEntityList[$userEntity->getUid()];
  152. } else {
  153. /** @var UserEntity $updateUserEntity */
  154. $updateUserEntity = UserEntity::newInstance();
  155. $updateUserEntity
  156. ->setUid($userEntity->getUid())
  157. ->setFugou($userEntity->getFugou());
  158. }
  159. // 组建 账单 记录
  160. if (isset($updateUserFugouEntityList[$userSignFugouEntity->getId()])) {
  161. $updateUserSignFugouEntity = $updateUserFugouEntityList[$userSignFugouEntity->getId()];
  162. } else {
  163. /** @var UserSignFugouEntity $updateUserSignFugouEntity */
  164. $updateUserSignFugouEntity = UserSignFugouEntity::newInstance();
  165. // 更新 账单记录 状态
  166. $updateUserSignFugouEntity
  167. ->setId($userSignFugouEntity->getId())
  168. ->setStatus(UserSignFugouEnum::STATUS['Valid']['code'])
  169. ->setSettlementTime(date('Y-m-d H:i:s'));
  170. }
  171. if ($userSignFugouEntity->getType() == UserSignFugouEnum::TYPE['Consume']['code']) {
  172. // 支出
  173. $updateUserEntity->setFugou(bcsub($updateUserEntity->getFugou(), $userSignFugouEntity->getNumber(), 2));
  174. if ($updateUserEntity->getFugou() < 0.00) {
  175. throw new ValidateException('用户复购金不足');
  176. }
  177. } else {
  178. $updateUserEntity->setFugou(bcadd($updateUserEntity->getFugou(), $userSignFugouEntity->getNumber(), 2));
  179. }
  180. $updateUserSignFugouEntity->setSurplus($updateUserEntity->getFugou());
  181. $updateUserEntityList[$userSignFugouEntity->getUid()] = $updateUserEntity;
  182. $updateUserFugouEntityList[$userSignFugouEntity->getId()] = $updateUserSignFugouEntity;
  183. }
  184. try {
  185. if (!empty($updateUserEntityList)) {
  186. $userRepository->batchUpdateUserDataByDataList(
  187. array_map(function (UserEntity $updateUserEntity) {
  188. return $updateUserEntity->toUnderlineArray();
  189. }, $updateUserEntityList)
  190. );
  191. }
  192. if (!empty($updateUserFugouEntityList)) {
  193. $this->batchUpdateUserSignFugouDataByDataList(
  194. array_map(function (UserSignFugouEntity $updateUserSignFugouEntity) {
  195. return $updateUserSignFugouEntity->toUnderlineArray();
  196. }, $updateUserFugouEntityList)
  197. );
  198. }
  199. } catch (\Exception $e) {
  200. throw new ValidateException('用户复购金结算失败');
  201. }
  202. }
  203. return $idList;
  204. }
  205. /**
  206. * @param $dataList
  207. * @return array
  208. */
  209. public function batchUpdateUserSignFugouDataByDataList($dataList): array
  210. {
  211. return $this->dao->saveAll($dataList);
  212. }
  213. }