UserSignGongxianRepository.php 10 KB

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