CustomClass.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. <?php
  2. namespace bizHd\custom\classes;
  3. use biz\wx\classes\WxMessageClass;
  4. use bizGhs\shop\classes\TotalDebtChangeClass;
  5. use bizHd\balance\classes\BalanceChangeClass;
  6. use bizHd\member\classes\MemberChangeClass;
  7. use bizHd\member\classes\MemberWealClass;
  8. use bizHd\order\classes\SettleClass;
  9. use bizHd\shop\classes\MainClass;
  10. use bizHd\shop\classes\ShopClass;
  11. use bizMall\user\classes\UserClass;
  12. use common\components\dict;
  13. use common\components\imgUtil;
  14. use common\components\noticeUtil;
  15. use common\components\stringUtil;
  16. use common\components\util;
  17. use Yii;
  18. use bizHd\base\classes\BaseClass;
  19. class CustomClass extends BaseClass
  20. {
  21. public static $baseFile = '\bizHd\custom\models\Custom';
  22. //用余额支付,客户余额减少 ssh 20250410
  23. public static function payToChangeBalance($order)
  24. {
  25. $actPrice = $order->actPrice ?? 0;
  26. $hdId = $order->hdId ?? 0;
  27. $hd = HdClass::getLockById($hdId);
  28. $balance = $hd->balance ?? 0;
  29. if ($actPrice > $balance) {
  30. util::fail('余额不足');
  31. }
  32. $remain = bcsub($balance, $actPrice, 2);
  33. $hd->balance = $remain;
  34. $hd->save();
  35. $hdName = $hd->name;
  36. $customId = $order->customId ?? 0;
  37. $custom = self::getLockById($customId);
  38. $balance = $custom->balance ?? 0;
  39. if ($actPrice > $balance) {
  40. util::fail('余额不足哦');
  41. }
  42. $remain = bcsub($balance, $actPrice, 2);
  43. $custom->balance = $remain;
  44. $custom->save();
  45. $customName = $custom->name;
  46. if ($custom->balance != $hd->balance) {
  47. util::fail('余额有问题哦');
  48. }
  49. $relateId = $order->id ?? 0;
  50. //0 花店操作 1 客户操作
  51. $payWay = $order->payWay;
  52. $side = 1;
  53. $shopId = $order->shopId;
  54. $mainId = $order->mainId;
  55. $staffId = $order->shopAdminId;
  56. $staffName = $order->shopAdminName;
  57. $orderSn = $order->orderSn;
  58. $event = '买花,单号:' . $orderSn;
  59. $capitalType = dict::getDict('capitalType', 'xhOrder', 'id');
  60. $change = [
  61. 'hdId' => $hdId,
  62. 'hdName' => $hdName,
  63. 'customId' => $customId,
  64. 'customName' => $customName,
  65. 'relateId' => $relateId,
  66. 'onlinePay' => 1,
  67. 'capitalType' => $capitalType,
  68. 'amount' => $actPrice,
  69. 'balance' => $hd->balance,
  70. 'io' => 0,
  71. 'side' => $side,
  72. 'payWay' => $payWay,
  73. 'event' => $event,
  74. 'staffId' => $staffId,
  75. 'staffName' => $staffName,
  76. 'shopId' => $shopId,
  77. 'mainId' => $mainId,
  78. 'remark' => '',
  79. ];
  80. return BalanceChangeClass::add($change, true);
  81. }
  82. //会员等级变化,包括手动修改、自动降会员和充值升会员等 ssh 20250324
  83. public static function levelChange($oldLevel, $newLevel, $shop, $custom, $hd, $params)
  84. {
  85. $staffId = $params['staffId'] ?? 0;
  86. $staffName = $params['staffName'] ?? '';
  87. $style = $params['style'] ?? 0;
  88. $target = $params['target'] ?? [];
  89. $onlinePay = $params['onlinePay'] ?? 1;
  90. $rechargeAmount = $params['rechargeAmount'] ?? 0;
  91. $targetId = $target->id ?? 0;
  92. $mainId = $shop->mainId;
  93. $shopId = $shop->id;
  94. $weal = MemberWealClass::getAllByCondition(['mainId' => $mainId], null, '*', 'level');
  95. $current = $weal[$newLevel] ?? [];
  96. $before = $weal[$oldLevel] ?? [];
  97. $beforeName = $before['name'] ?? '普通客户';
  98. $discount = $current['discount'] ?? 1;
  99. $memberName = $current['name'] ?? '';
  100. $custom->member = $newLevel;
  101. $custom->discount = $discount;
  102. $custom->memberName = $memberName;
  103. $custom->save();
  104. $hd->member = $newLevel;
  105. $hd->discount = $discount;
  106. $hd->memberName = $memberName;
  107. $hd->save();
  108. $event = '手动修改';
  109. if ($style == 0) {
  110. if ($onlinePay == 2) {
  111. $event = '线上充值' . $rechargeAmount . '元';
  112. } else {
  113. $event = '线下充值' . $rechargeAmount . '元';
  114. }
  115. }
  116. $change = [
  117. 'customId' => $custom->id,
  118. 'customName' => $custom->name,
  119. 'hdId' => $hd->id,
  120. 'hdName' => $hd->name,
  121. 'mainId' => $mainId,
  122. 'shopId' => $shopId,
  123. 'targetId' => $targetId,
  124. 'rechargeAmount' => $rechargeAmount,
  125. 'days' => 0,
  126. 'daysBefore' => '0000-00-00 00:00:00',
  127. 'daysAfter' => '0000-00-00 00:00:00',
  128. 'beforeLevel' => $oldLevel,
  129. 'afterLevel' => $newLevel,
  130. 'beforeName' => $beforeName,
  131. 'afterName' => $memberName,
  132. 'style' => $style,
  133. 'event' => $event,
  134. 'staffId' => $staffId,
  135. 'staffName' => $staffName,
  136. ];
  137. MemberChangeClass::add($change);
  138. }
  139. //客户采购欠款金额增加,如果有余额时,要进行欠款销账 ssh 20250715
  140. public static function cgDebtAmountAdd($custom, $order)
  141. {
  142. $clearAmount = 0;
  143. $amount = $order->remainDebtPrice ?? 0;
  144. $staffId = $order->shopAdminId ?? 0;
  145. $staffName = $order->shopAdminName ?? '';
  146. $orderId = $order->id;
  147. $orderSn = $order->orderSn ?? '';
  148. $shopId = $order->shopId;
  149. $settleNo = '';
  150. $settleId = 0;
  151. $settleAmount = 0;
  152. $hdId = $custom->hdId ?? 0;
  153. $hd = HdClass::getLockById($hdId);
  154. if (empty($hd)) {
  155. util::fail('花店信息缺失,编号6331');
  156. }
  157. $hdName = $hd->name ?? '';
  158. if ($custom->balance > 0) {
  159. if ($amount >= $custom->balance) {
  160. $clearAmount = $custom->balance;
  161. } else {
  162. $clearAmount = $amount;
  163. }
  164. }
  165. if ($clearAmount > 0) {
  166. $shop = ShopClass::getById($shopId, true);
  167. $needClearIdMap[] = ['orderId' => $orderId, 'clearAmount' => $clearAmount, 'orderSn' => $orderSn];
  168. $setParams = ['staffId' => $staffId, 'staffName' => $staffName];
  169. $set = SettleClass::addSettle($needClearIdMap, $shop, $custom, $hd, $setParams);
  170. $ret = SettleClass::clearSettle($set);
  171. $settleAmount = $ret['totalClearAmount'] ?? 0;
  172. $settleNo = $set->orderSn ?? '';
  173. $settleId = $set->id;
  174. }
  175. $customBalance = bcsub($custom->balance, $amount, 2);
  176. $custom->balance = $customBalance;
  177. if ($custom->balance < 0) {
  178. $custom->isDebt = 1;
  179. }
  180. $custom->save();
  181. $hdBalance = bcsub($hd->balance, $amount, 2);
  182. $hd->balance = $hdBalance;
  183. if ($hd->balance < 0) {
  184. $hd->debt = 2;
  185. }
  186. $hd->save();
  187. if (floatval($customBalance) != floatval($hdBalance)) {
  188. util::fail('余额有错,请联系管理员,编号' . $hdId);
  189. }
  190. $relateId = $order->id ?? 0;
  191. $customId = $custom->id ?? 0;
  192. $orderSn = $order->orderSn ?? '';
  193. $capitalType = dict::getDict('capitalType', 'xhOrder', 'id');
  194. $event = '购买花材,单号:' . $orderSn;
  195. $customName = $custom->name ?? '';
  196. $onlinePay = 1;
  197. $side = 0;
  198. $payWay = 0;
  199. $change = [
  200. 'hdId' => $hdId,
  201. 'hdName' => $hdName,
  202. 'customId' => $customId,
  203. 'customName' => $customName,
  204. 'relateId' => $relateId,
  205. 'onlinePay' => $onlinePay,
  206. 'capitalType' => $capitalType,
  207. 'amount' => $amount,
  208. 'balance' => $customBalance,
  209. 'io' => 0,
  210. 'side' => $side,
  211. 'payWay' => $payWay,
  212. 'event' => $event,
  213. 'staffId' => $staffId,
  214. 'staffName' => $staffName,
  215. 'shopId' => $shopId,
  216. 'mainId' => $order->mainId,
  217. 'settleId' => $settleId,
  218. 'settleNo' => $settleNo,
  219. 'settleAmount' => $settleAmount,
  220. 'remark' => '',
  221. ];
  222. BalanceChangeClass::add($change, true);
  223. }
  224. //欠款和余额支付的售后 ssh 20250803
  225. public static function refundDebtAmountReduce($custom, $amount, $refund)
  226. {
  227. $hdId = $custom->hdId ?? 0;
  228. $hd = HdClass::getLockById($hdId);
  229. if (empty($hd)) {
  230. util::fail('花店信息缺失,编号520');
  231. }
  232. $customBalance = bcadd($custom->balance, $amount, 2);
  233. $custom->balance = $customBalance;
  234. if ($custom->balance < 0) {
  235. $custom->isDebt = 1;
  236. }
  237. $custom->save();
  238. $hdBalance = bcadd($hd->balance, $amount, 2);
  239. $hd->balance = $hdBalance;
  240. if ($hd->balance < 0) {
  241. $hd->debt = 2;
  242. }
  243. $hd->save();
  244. if (floatval($customBalance) !== floatval($hdBalance)) {
  245. util::fail('余额错误,请联系管理员,编号' . $hdId);
  246. }
  247. $relateId = $refund->id ?? 0;
  248. $customId = $custom->id ?? 0;
  249. $refundSn = $refund->refundSn ?? '';
  250. $orderSn = $refund->orderSn ?? '';
  251. $orderId = $refund->orderId ?? 0;
  252. $staffId = $refund->shopAdminId ?? 0;
  253. $staffName = $refund->shopAdminName ?? '';
  254. $capitalType = dict::getDict('capitalType', 'hdRefund', 'id');
  255. $event = "订单售后 " . $refundSn;
  256. $customName = $custom->name ?? '';
  257. $onlinePay = 1;
  258. $side = 0;
  259. $payWay = 2;//余额支付
  260. $change = [
  261. 'customId' => $customId,
  262. 'customName' => $customName,
  263. 'relateId' => $relateId,
  264. 'relateSn' => $refundSn,
  265. 'onlinePay' => $onlinePay,
  266. 'capitalType' => $capitalType,
  267. 'amount' => $amount,
  268. 'balance' => $customBalance,
  269. 'io' => 1,
  270. 'side' => $side,
  271. 'payWay' => $payWay,
  272. 'event' => $event,
  273. 'staffId' => $staffId,
  274. 'staffName' => $staffName,
  275. 'shopId' => $refund->shopId,
  276. 'mainId' => $refund->mainId,
  277. 'refundOrderId' => $orderId,
  278. 'refundOrderSn' => $orderSn,
  279. 'remark' => '',
  280. ];
  281. BalanceChangeClass::add($change, true);
  282. }
  283. //添加客户 ssh 2021.2.28
  284. public static function addCustom($data)
  285. {
  286. return self::add($data, true);
  287. }
  288. //创建或获取客户信息 ssh 2021.3.19
  289. public static function buildRelation($shop, $user)
  290. {
  291. if (empty($user)) {
  292. return false;
  293. }
  294. if (empty($shop)) {
  295. return false;
  296. }
  297. if ($shop->ptStyle == 2) {
  298. util::fail('有问题,批发店状态');
  299. }
  300. $salt = stringUtil::charsShuffleLowerCase(8);
  301. $isNewCustom = 0;
  302. $userId = $user->id;
  303. $name = $user->name ?? '';
  304. $mobile = $user->mobile ?? '';
  305. $shopId = $shop->id ?? 0;
  306. $hdAvatar = $shop->avatar ?? '';
  307. $sjId = $shop->sjId ?? 0;
  308. $sjName = $shop->merchantName ?? '';
  309. $shopName = $shop->shopName ?? '';
  310. $hdMobile = $shop->mobile ?? '';
  311. $hdName = $shopName == '首店' ? $sjName : $sjName . ' ' . $shopName;
  312. $hdPy = stringUtil::py($hdName);
  313. $custom = self::getByCondition(['shopId' => $shopId, 'userId' => $userId], true);
  314. if (empty($custom)) {
  315. $py = stringUtil::py($name);
  316. $visitTime = date("Y-m-d H:i:s");
  317. $data = [
  318. 'userId' => $userId,
  319. 'sjId' => $sjId,
  320. 'shopId' => $shopId,
  321. 'name' => $name,
  322. 'originName' => $name,
  323. 'py' => $py,
  324. 'mobile' => $mobile,
  325. 'visitTime' => $visitTime,
  326. 'salt' => $salt,
  327. ];
  328. $custom = self::addCustom($data);
  329. $isNewCustom = 1;
  330. }
  331. $customId = $custom->id ?? 0;
  332. $hd = HdClass::getByCondition(['shopId' => $shopId, 'userId' => $userId], true);
  333. if (empty($hd)) {
  334. $hdData = [
  335. 'shopId' => $shopId,
  336. 'userId' => $userId,
  337. 'name' => $hdName,
  338. 'sjId' => $sjId,
  339. 'customId' => $customId,
  340. 'avatar' => $hdAvatar,
  341. 'py' => $hdPy,
  342. 'mobile' => $hdMobile,
  343. 'province' => $shop->province ?? '',
  344. 'city' => $shop->city ?? '',
  345. 'dist' => $shop->dist ?? '',
  346. 'address' => $shop->address ?? '',
  347. 'floor' => $shop->floor ?? '',
  348. 'fullAddress' => $shop->fullAddress ?? '',
  349. 'showAddress' => $shop->showAddress ?? '',
  350. 'lat' => $shop->lat ?? '',
  351. 'long' => $shop->long ?? '',
  352. 'salt' => $salt,
  353. ];
  354. $hd = HdClass::addData($hdData);
  355. $isNewCustom = 1;
  356. }
  357. $hdId = $hd->id ?? 0;
  358. $custom->hdId = $hdId;
  359. $custom->save();
  360. if ($isNewCustom == 1) {
  361. WxMessageClass::newHdCustomInform($shop, $custom);
  362. }
  363. return ['custom' => $custom, 'hd' => $hd];
  364. }
  365. //获取客户信息
  366. public static function getCustom($data)
  367. {
  368. $custom = self::getByCondition($data);
  369. if (empty($custom)) {
  370. $custom = self::add($data);
  371. }
  372. return $custom;
  373. }
  374. //获取客户信息 ssh 2021.2.1
  375. public static function getCustomInfo($id)
  376. {
  377. $custom = self::getById($id);
  378. if (empty($custom)) {
  379. return $custom;
  380. }
  381. $list = self::groupBaseInfo([$custom]);
  382. return current($list);
  383. }
  384. //获取客户信息 ssh 2021.3.19
  385. public static function getCustomByIds($ids)
  386. {
  387. $list = self::getByIds($ids);
  388. $list = self::groupBaseInfo($list);
  389. return $list;
  390. }
  391. public static function valid($info, $shopId)
  392. {
  393. if (isset($info['shopId']) && $info['shopId'] == $shopId) {
  394. return true;
  395. }
  396. util::fail('客户信息无效');
  397. }
  398. //整合基本信息 ssh 2021.1.31
  399. public static function groupBaseInfo($list)
  400. {
  401. if (empty($list)) {
  402. return $list;
  403. }
  404. foreach ($list as $key => $val) {
  405. $list[$key]['avatar'] = imgUtil::groupImg($val['avatar']);
  406. //超时未下单
  407. $recentExpend = $val['recentExpend'] ?? '';
  408. $list[$key]['overTimeUnExpend'] = 0;
  409. if ($recentExpend == '0000-00-00 00:00:00') {
  410. $list[$key]['overTimeUnExpend'] = 10000;
  411. } else {
  412. $recentExpendTime = strtotime($recentExpend);
  413. $seven = bcmul(86400, 7);
  414. $sevenTime = bcadd($recentExpendTime, $seven);
  415. if ($sevenTime < time()) {
  416. $list[$key]['overTimeUnExpend'] = 7;
  417. }
  418. $month = bcmul(86400, 30);
  419. $monthTime = bcadd($recentExpendTime, $month);
  420. if ($monthTime < time()) {
  421. $list[$key]['overTimeUnExpend'] = 30;
  422. }
  423. $halfYear = bcmul(86400, 180);
  424. $halfYearTime = bcadd($recentExpendTime, $halfYear);
  425. if ($halfYearTime < time()) {
  426. $list[$key]['overTimeUnExpend'] = 180;
  427. }
  428. $year = bcmul(86400, 365);
  429. $yearTime = bcmul($recentExpendTime, $year);
  430. if ($yearTime < time()) {
  431. $list[$key]['overTimeUnExpend'] = 365;
  432. }
  433. }
  434. }
  435. return $list;
  436. }
  437. }