TeamLevelForm.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <?php
  2. namespace app\modules\admin\models\team_grades;
  3. use app\models\Goods;
  4. use app\models\Option;
  5. use app\models\TeamGrades;
  6. use app\models\TeamGradesAudit;
  7. use app\models\TeamGradesLevel;
  8. use yii\base\Model;
  9. use yii\helpers\Json;
  10. class TeamLevelForm extends Model
  11. {
  12. public $store_id;
  13. public $id;
  14. public $ids;
  15. public $status;
  16. public $level;//等级
  17. public $level_name;//等级名称
  18. public $is_open_apply;//是否开始申请
  19. public $level_reward_setting;//业绩奖励设置
  20. public $expires_in;//等级有效期时间
  21. public $expires_type;//等级有效期类型
  22. public $level_conditions;//升级条件
  23. public $desc;//特权详情
  24. public $tiered_bonus = 0;//极差比例
  25. public function rules()
  26. {
  27. return [
  28. [['store_id', 'id', 'level', 'is_open_apply', 'status', 'expires_in', 'expires_type'], 'integer'],
  29. [['level_name', 'level_reward_setting', 'level_conditions', 'desc', 'ids'], 'string'],
  30. [['tiered_bonus'], 'number'],
  31. ];
  32. }
  33. //团队等级列表
  34. public function list() {
  35. $store_id = $this->store_id;
  36. $status = $this->status;
  37. $level_name = $this->level_name;
  38. $query = TeamGradesLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0]);
  39. if (isset($status) && in_array($status, [0, 1])) {
  40. $query->andWhere(['status' => $status]);
  41. }
  42. if (!empty(trim($level_name))) {
  43. $query->andWhere(['LIKE', 'level_name', trim($level_name)]);
  44. }
  45. $query->orderBy('level DESC')->select('id, created_at, status, level, level_name, level_conditions');
  46. $pagination = pagination_make($query);
  47. foreach ($pagination['list'] as &$list) {
  48. $list['created_at'] = date('Y-m-d H:i:s', $list['created_at']);
  49. $list['status'] = intval($list['status']);
  50. if ($list['level'] > 0) {
  51. $list['level'] = $this->numberToChinese($list['level']) . '级';
  52. } else {
  53. $list['level'] = "默认等级";
  54. }
  55. $level_conditions = json_decode($list['level_conditions'], true);
  56. $level_conditions_text = "";
  57. foreach ($level_conditions as $level_conditions_index => $level_conditions_item) {
  58. if (intval($level_conditions_item['is_open'])) {
  59. if ($level_conditions_index === 'man') {
  60. foreach ($level_conditions_item['value'] as $man_index => $man_item) {
  61. $level_conditions_text .= "团队人数达到" . $man_item['count'] . "人且消费金额达" .$man_item['money'] . "元;" ;
  62. }
  63. }
  64. if ($level_conditions_index === 'order') {
  65. if (is_array($level_conditions_item['value'])) {
  66. foreach ($level_conditions_item['value'] as $order_index => $order_item) {
  67. $level_conditions_text .= "团队订单消费金额达" .$order_item['count'] . "元;" ;
  68. }
  69. } else {
  70. $level_conditions_text .= "团队订单消费金额达" .$level_conditions_item['value'] . "元;" ;
  71. }
  72. // foreach ($level_conditions_item['value'] as $order_index => $order_item) {
  73. // $level_conditions_text .= "团队订单消费金额达" .$order_item['count'] . "元;" ;
  74. // }
  75. }
  76. if ($level_conditions_index === 'recharge') {
  77. $level_conditions_text .= "充值金额达" .$level_conditions_item['value'] . "元;" ;
  78. }
  79. if ($level_conditions_index === 'self') {
  80. if (intval($level_conditions_item['value']['order_number'])) {
  81. $level_conditions_text .= "消费金额单笔达" .$level_conditions_item['value']['price'] . "元;" ;
  82. } else {
  83. $level_conditions_text .= "消费金额累计达" .$level_conditions_item['value']['price'] . "元;" ;
  84. }
  85. }
  86. if ($level_conditions_index === 'goods') {
  87. if (!empty($level_conditions_item['value'])) {
  88. $goods_name = Goods::find()->where(['id' => $level_conditions_item['value']['id'], 'is_delete' => 0])->select('name')->column();
  89. if ($goods_name) {
  90. $goods_name = implode(',', $goods_name);
  91. $level_conditions_text .= "购买指定商品" . $goods_name;
  92. }
  93. }
  94. }
  95. }
  96. }
  97. $list['level_conditions_text'] = $level_conditions_text;
  98. }
  99. return [
  100. 'code' => 0,
  101. 'msg' => 'success',
  102. 'data' => [
  103. 'data' => $pagination['list'],
  104. 'pageNo' => $pagination['pageNo'],
  105. 'totalCount' => $pagination['totalCount'],
  106. ]
  107. ];
  108. }
  109. //设置团队等级
  110. public function setLevel() {
  111. try {
  112. $id = $this->id;
  113. $store_id = $this->store_id;
  114. $level = $this->level;
  115. $level_name = $this->level_name;
  116. $is_open_apply = $this->is_open_apply;
  117. $level_reward_setting = $this->level_reward_setting;
  118. $expires_in = $this->expires_in;
  119. $expires_type = $this->expires_type;
  120. $level_conditions = $this->level_conditions;
  121. $desc = $this->desc;
  122. $tiered_bonus = $this->tiered_bonus;
  123. if (!isset($level)) {
  124. throw new \Exception('团队等级不能为空');
  125. }
  126. if (empty($level_name)) {
  127. throw new \Exception('团队等级名称不能为空');
  128. }
  129. if (empty($level_reward_setting)) {
  130. throw new \Exception('业绩奖励设置不能为空');
  131. }
  132. if (empty($level_conditions)) {
  133. throw new \Exception('升级条件不能为空');
  134. }
  135. //检测是否有相同等级存在
  136. $re_level_query = TeamGradesLevel::find()->where(['level' => $level, 'store_id' => $store_id, 'is_delete' => 0]);
  137. if ($id) {
  138. $re_level_query->andWhere(['<>', 'id', $id]);
  139. }
  140. $re_level = $re_level_query->asArray()->one();
  141. if ($re_level) {
  142. throw new \Exception('存在相同等级');
  143. }
  144. //检测业绩奖励设置是否合规
  145. $level_reward_setting = json_decode($level_reward_setting, true);
  146. foreach ($level_reward_setting as $level_reward_item) {
  147. if (!isset($level_reward_item['min'])) {
  148. throw new \Exception('需要设置业绩奖励业绩最小金额');
  149. }
  150. if (!isset($level_reward_item['max'])) {
  151. throw new \Exception('需要设置业绩奖励业绩最大金额');
  152. }
  153. if (!isset($level_reward_item['profit'])) {
  154. throw new \Exception('需要设置业绩奖励佣金比例');
  155. }
  156. }
  157. $level_reward_setting = json_encode($level_reward_setting, JSON_UNESCAPED_UNICODE);
  158. //检测等级有效期是否合规
  159. $expires_type = intval($expires_type);
  160. if (!in_array($expires_type, [TeamGradesLevel::EXPIRES_TYPE_DAY, TeamGradesLevel::EXPIRES_TYPE_YEAR])) {
  161. throw new \Exception('等级有效期类型设置有误');
  162. }
  163. // if ($expires_in <= 0) {
  164. // throw new \Exception('等级有效期设置有误');
  165. // }
  166. //检测升级条件是否合规
  167. $level_conditions = json_decode($level_conditions, true);
  168. $open = true;
  169. foreach ($level_conditions as $conditions_index => $conditions_item) {
  170. //检测升级条件设置不对或者数额不对的
  171. if (in_array($conditions_index, [
  172. 'goods', 'man', 'order', 'recharge', 'self'
  173. ])) {
  174. if (intval($conditions_item['is_open'])) {
  175. if (!empty($conditions_item['value']) || (is_numeric($conditions_item['value']) && $conditions_item['value'] > 0)) {
  176. $open = false;
  177. }
  178. }
  179. }
  180. }
  181. if ($open) {
  182. throw new \Exception('升级条件设置无效');
  183. }
  184. $level_conditions = json_encode($level_conditions, JSON_UNESCAPED_UNICODE);
  185. $form = TeamGradesLevel::findOne(['id' => $id, 'is_delete' => 0]);
  186. if ($form) {
  187. //判断原等级下是否有团队存在
  188. if (intval($form->level) !== intval($level)) {
  189. $teamGradesAudit = TeamGradesAudit::findOne(['team_grades_level' => $form->level, 'is_delete' => 0,
  190. 'status' => TeamGradesAudit::STATUS_APPLY, 'store_id' => $store_id]);
  191. if ($teamGradesAudit) {
  192. throw new \Exception('等级下有未处理的团队分红申请记录,不可操作');
  193. }
  194. $teamGrades = TeamGrades::findOne(['team_grades_level' => $form->level, 'is_delete' => 0, 'store_id' => $store_id]);
  195. if ($teamGrades) {
  196. throw new \Exception('原等级下有团队存在,不可操作');
  197. }
  198. }
  199. }
  200. $form = $form ?: new TeamGradesLevel();
  201. $form->store_id = $store_id;
  202. $form->level = $level;
  203. $form->level_name = $level_name;
  204. $form->is_open_apply = $is_open_apply ?? TeamGradesLevel::IS_OPEN_APPLY_FALSE;
  205. $form->level_reward_setting = $level_reward_setting;
  206. $form->expires_in = $expires_in;
  207. $form->expires_type = $expires_type;
  208. $form->level_conditions = $level_conditions;
  209. $form->desc = $desc;
  210. $form->tiered_bonus = $tiered_bonus;
  211. if (!$form->save()) {
  212. throw new \Exception(json_encode($form->errors, JSON_UNESCAPED_UNICODE));
  213. }
  214. return [
  215. 'code' => 0,
  216. 'msg' => '操作成功'
  217. ];
  218. } catch (\Exception $e) {
  219. return [
  220. 'code' => 1,
  221. 'msg' => $e->getMessage()
  222. ];
  223. }
  224. }
  225. public function getEditInfo() {
  226. $id = $this->id;
  227. $store_id = $this->store_id;
  228. $team_grades_setting = Option::get('team_grades_setting', $store_id, 'team_grades_setting')['value'];
  229. if (!$team_grades_setting) {
  230. $team_grades_setting = json_encode([
  231. 'team_start_num' => 0,
  232. 'team_end_num' => 0,
  233. 'filter_high_level' => 1,
  234. 'team_cycle_type' => TeamGrades::TEAM_CYCLE_TYPE_DAY,
  235. 'team_cycle' => 0,
  236. 'amount_rule_type' => 0,
  237. 'bonus_type' => TeamGrades::TEAM_BONUS_TYPE_LADDER
  238. ]);
  239. }
  240. $team_grades_setting = json_decode($team_grades_setting, true);
  241. $data = [
  242. 'expires_in' => 0,
  243. 'expires_type' => 0,
  244. 'is_open_apply' => 0,
  245. 'level_name' => '',
  246. 'level_reward_setting' => json_encode([]),
  247. 'level_conditions' => json_encode([]),
  248. 'desc' => '',
  249. 'filter_level' => [],
  250. 'level' => '',
  251. 'bonus_type' => $team_grades_setting['bonus_type'],
  252. 'tiered_bonus' => 0,
  253. ];
  254. //过滤已经存在的等级
  255. $filter_level = TeamGradesLevel::find()->where(['is_delete' => 0, 'store_id' => $store_id])
  256. ->select('level')->column();
  257. if ($id) {
  258. $teamGradesLevelInfo = TeamGradesLevel::findOne(['id' => $id, 'is_delete' => 0]);
  259. if ($teamGradesLevelInfo) {
  260. $filter_level = array_filter($filter_level, function($value) use($teamGradesLevelInfo) {
  261. if ($value != $teamGradesLevelInfo->level) {
  262. return $value;
  263. }
  264. });
  265. // 获取等级详情
  266. $data['expires_in'] = $teamGradesLevelInfo->expires_in;
  267. $data['expires_type'] = $teamGradesLevelInfo->expires_type;
  268. $data['is_open_apply'] = intval($teamGradesLevelInfo->is_open_apply);
  269. $data['level_name'] = $teamGradesLevelInfo->level_name;
  270. $data['level_reward_setting'] = $teamGradesLevelInfo->level_reward_setting;
  271. $data['level_conditions'] = $teamGradesLevelInfo->level_conditions;
  272. $data['desc'] = $teamGradesLevelInfo->desc;
  273. $data['level'] = $teamGradesLevelInfo->level;
  274. $data['tiered_bonus'] = $teamGradesLevelInfo->tiered_bonus?:0;
  275. }
  276. // $teamGradesLevelInfo
  277. }
  278. $condition = Json::decode($data['level_conditions']);
  279. if (!isset($condition['self']['value']['order_number'])) {
  280. $self_price = $condition['self']['value'];
  281. $condition['self']['value'] = [];
  282. $condition['self']['value']['order_number'] = '0';
  283. $condition['self']['value']['price'] = $self_price;
  284. }
  285. $goods_id = $condition['goods']['value']['id'];
  286. $condition['goods']['value']['id'] = Goods::find()->where(['id' => $goods_id, 'is_delete' => 0])->select('id')->column();
  287. $data['level_conditions'] = json_encode($condition, JSON_UNESCAPED_UNICODE);
  288. $level = range(0, 99);
  289. $data['filter_level'] = array_filter($level, function($value) use($filter_level) {
  290. if (!in_array($value, $filter_level)) {
  291. return $value;
  292. }
  293. });
  294. $data['filter_level'] = array_values($data['filter_level']);
  295. return [
  296. 'code' => 0,
  297. 'msg' => '获取成功',
  298. 'data' => $data
  299. ];
  300. }
  301. //处理同意拒绝 删除
  302. public function handle() {
  303. try {
  304. $ids = $this->ids ?? 0;
  305. $store_id = $this->store_id;
  306. $status = $this->status;
  307. if (empty(trim($ids))) {
  308. throw new \Exception('请选择要操作的数据');
  309. }
  310. $ids = explode(',', $ids);
  311. if (empty($ids)) {
  312. throw new \Exception('请选择要操作的数据_');
  313. }
  314. if (!isset($status)) {
  315. throw new \Exception('参数错误');
  316. }
  317. foreach ($ids as $item) {
  318. $teamGradesLevel = TeamGradesLevel::findOne(['id' => $item, 'store_id' => $store_id]);
  319. if (!$teamGradesLevel) {
  320. throw new \Exception('数据查询失败id:' . $item);
  321. }
  322. if ($teamGradesLevel->is_delete) {
  323. continue;
  324. }
  325. //如果是删除或者禁用,判断是否有团队
  326. if (in_array($status, [
  327. TeamGradesLevel::STATUS_FALSE,
  328. 2
  329. ])) {
  330. $teamGrades = TeamGradesAudit::findOne(['team_grades_level' => $teamGradesLevel->level, 'is_delete' => 0,
  331. 'status' => TeamGradesAudit::STATUS_APPLY, 'store_id' => $store_id]);
  332. if ($teamGrades) {
  333. throw new \Exception('等级下有未处理的团队分红申请记录,不可操作');
  334. }
  335. $teamGrades = TeamGrades::findOne(['team_grades_level' => $teamGradesLevel->level, 'is_delete' => 0, 'store_id' => $store_id]);
  336. if ($teamGrades) {
  337. throw new \Exception('等级下有团队存在,不可操作');
  338. }
  339. }
  340. //启用/禁用
  341. if (in_array($status, [TeamGradesLevel::STATUS_FALSE, TeamGradesLevel::STATUS_TRUE])) {
  342. $teamGradesLevel->status = $status;
  343. }
  344. //删除
  345. if (intval($status) === 2) {
  346. $teamGradesLevel->is_delete = 1;
  347. }
  348. if (!$teamGradesLevel->save()) {
  349. throw new \Exception(json_encode($teamGradesLevel->errors, JSON_UNESCAPED_UNICODE) . 'id:' . $item);
  350. }
  351. }
  352. return [
  353. 'code' => 0,
  354. 'msg' => '操作成功'
  355. ];
  356. } catch (\Exception $e) {
  357. return [
  358. 'code' => 1,
  359. 'msg' => $e->getMessage()
  360. ];
  361. }
  362. }
  363. public function numberToChinese($number) {
  364. $array = array('零', '一', '二', '三', '四', '五', '六', '七', '八', '九');
  365. $chinese = '';
  366. // 数字转化为字符串
  367. $num_str = strval($number);
  368. // 遍历每个数字并转换为中文大写
  369. for ($i = 0; $i < strlen($num_str); $i++) {
  370. $chinese .= $array[$num_str[$i]];
  371. }
  372. return $chinese;
  373. }
  374. }