AgencyForm.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\alliance\models;
  8. use app\models\Admin;
  9. use app\models\Option;
  10. use app\models\Order;
  11. use app\models\OrderDetail;
  12. use app\models\OrderTransit;
  13. use app\models\PurchaseOrder;
  14. use app\models\SaasCategory;
  15. use app\models\SaasStoreReferral;
  16. use app\models\Salesman;
  17. use app\models\SalesmanNewStore;
  18. use app\models\SharingReceiver;
  19. use app\models\Store;
  20. use app\models\StoreReOrder;
  21. use app\models\StoreShareMoney;
  22. use app\models\Supplier;
  23. use app\models\User;
  24. use app\models\UserShareMoney;
  25. use yii\base\Model;
  26. use yii\data\Pagination;
  27. use yii\db\Expression;
  28. class AgencyForm extends Model
  29. {
  30. public $page = 1;
  31. public $limit = 5;
  32. public $type = 0;
  33. public $profit_type;
  34. public function rules()
  35. {
  36. return [
  37. [['page','limit','type', 'profit_type'],'integer']
  38. ];
  39. }
  40. public function commonSql($type_name) {
  41. $saas_user_id = get_saas_user_id();
  42. $admin = Admin::findOne(['saas_user_id' => $saas_user_id, 'is_delete' => 0, 'type' => $type_name]);
  43. $sales_man_arr = Salesman::find()->where(['admin_id' => $admin->id, 'is_delete' => 0])->select("id, saas_user_id")->asArray()->all();
  44. $sales_man_ids = array_column($sales_man_arr, 'id');
  45. $store_admin_ids = array_column($sales_man_arr, 'saas_user_id');
  46. $query = Store::find()->where(['is_delete'=>0]);
  47. $store_ids = SalesmanNewStore::find()->where(['salesman_saas_id' => array_column($sales_man_ids, 'saas_user_id')])
  48. ->andWhere(['>', 'store_id', 0])->select('store_id')->column();
  49. $area_level = $admin->area_level;
  50. if ($admin->type === Admin::ADMIN_TYPE_DEFAULT) {
  51. if ($area_level == 1) {
  52. $query->andWhere(['province_id' => $admin->province_id, 'city_id' => $admin->city_id, 'district_id' => $admin->district_id]);
  53. } elseif ($area_level == 2) {
  54. $query->andWhere(['province_id' => $admin->province_id, 'city_id' => $admin->city_id]);
  55. } elseif ($area_level == 3){
  56. $query->andWhere(['province_id' => $admin->province_id]);
  57. } else {
  58. $query->andWhere(['admin_id' => $admin->id]);
  59. }
  60. } elseif ($admin->type === Admin::ADMIN_TYPE_BD_AGENT) {
  61. $query->andWhere(['OR',
  62. ['salesman_id' => $sales_man_ids],
  63. ['store_admin' => $store_admin_ids],
  64. ['admin_id' => $admin->id],
  65. ['id' => $store_ids]
  66. ]);
  67. }
  68. return $query;
  69. }
  70. //下级店铺
  71. public function lowerLevelShop(){
  72. $saas_user_id = get_saas_user_id();
  73. $type_name = Admin::ADMIN_TYPE_DEFAULT;
  74. if ((int)$this->type === 1) {
  75. $type_name = Admin::ADMIN_TYPE_BD_AGENT;
  76. }
  77. $store = $this->commonSql($type_name);
  78. $count = $store->count();
  79. $pagination = new Pagination(['totalCount' => $count, 'page' => 0, 'pageSize' => $this->page * 10]);
  80. /* @var Order[] $list */
  81. $store_list = $store->limit($pagination->limit)->offset($pagination->offset)->orderBy('created_at DESC')->asArray()->all();
  82. foreach($store_list as &$item){
  83. $item['created_at'] = date("Y-m-d",$item['created_at']);
  84. }
  85. return [
  86. 'code'=>0,
  87. 'msg'=>"SUCCESS",
  88. 'data'=>$store_list
  89. ];
  90. }
  91. //店铺订单
  92. public function shopOrder(){
  93. $saas_user_id = get_saas_user_id();
  94. $type_name = Admin::ADMIN_TYPE_DEFAULT;
  95. if ((int)$this->type === 1) {
  96. $type_name = Admin::ADMIN_TYPE_BD_AGENT;
  97. }
  98. $store_query = $this->commonSql($type_name);
  99. $store_ids = $store_query->select('id')->column();
  100. $query = Order::find()
  101. ->where(['is_delete'=>0,'store_id'=>$store_ids])->andWhere(['and',['<>', 'trade_status', '1'], ['is_pay' => 1]])->select('id, order_no, store_id, name, created_at, is_pay, pay_price, is_price, trade_status, is_sale');//->asArray()->all();
  102. // $query = Store::find()->where(['salesman_id'=>$sales_man_ids,'is_delete'=>0])->select('id,name,logo');//->asArray()->all();
  103. $query->with(['store'=>function($query){
  104. $query->select('id, name, logo')->asArray();
  105. }]);
  106. $count = $query->count();
  107. $pagination = new Pagination(['totalCount' => $count, 'page' => 0, 'pageSize' => $this->page * 10]);
  108. /* @var Order[] $list */
  109. $order_list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('created_at DESC')->asArray()->all();
  110. foreach($order_list as &$o){
  111. $o['status'] = Order::TRADE_STATUS_TEXT[$o['trade_status']];
  112. if (intval($o['is_sale'])) {
  113. $o['status'] = "已发放";
  114. }
  115. $o['created_at'] = date("Y-m-d H:i:s",$o['created_at']);
  116. $o['amount'] = StoreShareMoney::find()->where(['order_id' => $o['id'], 'user_id' => $saas_user_id])->sum("commission") ?: '0.00';
  117. $o['goods_list'] = OrderDetail::find()->select('goods_name, pic')->andWhere(['order_id' => $o['id']])->asArray()->all();
  118. }
  119. return [
  120. 'code'=>0,
  121. 'msg'=>"SUCCESS",
  122. 'data'=>$order_list
  123. ];
  124. }
  125. //店铺续费订单
  126. public function storeReOrder(){
  127. $saas_user_id = get_saas_user_id();
  128. $type_name = Admin::ADMIN_TYPE_BD_AGENT;
  129. $admin = Admin::findOne(['saas_user_id' => $saas_user_id, 'is_delete' => 0, 'type' => $type_name]);
  130. $sales_man_ids = Salesman::find()->where(['admin_id'=>$admin->id,'is_delete'=>0])->select("id, saas_user_id")->asArray()->all();
  131. $store_ids = SalesmanNewStore::find()->where(['salesman_saas_id' => array_column($sales_man_ids, 'saas_user_id')])
  132. ->andWhere(['>', 'store_id', 0])->select('store_id')->column();
  133. $store_query = Store::find()->where(['is_delete'=>0]);
  134. $store_query->andWhere([
  135. 'or',
  136. ['admin_id' => $admin->id],//添加店铺时候修改的
  137. ['in', 'salesman_id', array_column($sales_man_ids, 'id')],//修改店铺业务员时候修改的
  138. ['in', 'store_admin', array_column($sales_man_ids, 'saas_user_id')],//修改店铺业务员时候修改的
  139. ['in', 'id', $store_ids]//业务员帮助店铺进件时候增加
  140. ]);
  141. $store_ids = $store_query->select('id')->column();
  142. $query = StoreReOrder::find()->where(['store_id'=>$store_ids,'is_pay'=>1])->select('id,order_no,total_price,desc,store_id,', new Expression('FROM_UNIXTIME(created_at,"%Y-%m-%d %H:%i:%s") as created_at,'));//->asArray()->all();
  143. $query->with(['store'=>function($query){
  144. $query->with(['admin'=>function($querys){
  145. $querys->select('name')->asArray();
  146. }])->select("id,name,logo,admin_id")->asArray();
  147. }]);
  148. $count = $query->count();
  149. $pagination = new Pagination(['totalCount' => $count, 'page' => 0, 'pageSize' => $this->page * 10]);
  150. $order = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('created_at DESC')->asArray()->all();
  151. foreach ($order as &$item) {
  152. $store = Store::findOne($item['store_id']);
  153. $item['store'] = [
  154. 'id' => $store->id ?? '',
  155. 'name' => $store->name ?? '',
  156. 'logo' => $store->logo ?: Option::get('web_log', $store->id, 'web', '')['value'],
  157. ];
  158. }
  159. return [
  160. 'code'=>0,
  161. 'msg'=>"SUCCESS",
  162. 'data'=>$order
  163. ];
  164. }
  165. public function getDataInfo() {
  166. try {
  167. $saas_user = get_saas_user();
  168. //店铺入驻费用返利
  169. $query = StoreShareMoney::find()->where(['user_id' => $saas_user->id, 'is_delete' => 0]);
  170. $all_query = clone $query;
  171. $all_commission = (float)$saas_user->share_profit ?: 0;
  172. //推广店铺店铺佣金
  173. $store_query = clone $query;
  174. $store_commission = (float)$store_query->andWhere(['type' => [StoreShareMoney::TYPE_AGENT, StoreShareMoney::TYPE_BD_AGENT], 'status' => StoreShareMoney::STATUS_STORE_ORDER])
  175. ->select('commission')->sum('commission');
  176. //店铺缴费
  177. $store_fee_query = clone $query;
  178. $store_fee_commission = (float)$store_fee_query->andWhere(['status' => StoreShareMoney::STATUS_STORE_SETTLED])->select('commission')
  179. ->sum('commission');
  180. //店铺区域佣金
  181. $store_area_query = clone $query;
  182. $store_area_commission = (float)$store_area_query->andWhere(['status' => StoreShareMoney::STATUS_STORE_ORDER, 'type' => StoreShareMoney::TYPE_AREA_AGENT, 'cloud_type' => 0])->select('commission')
  183. ->sum('commission');
  184. //供货商区域佣金
  185. $supplier_query = clone $query;
  186. $supplier_commission = (float)$supplier_query->andWhere(['status' => StoreShareMoney::STATUS_STORE_ORDER, 'type' => StoreShareMoney::TYPE_AREA_AGENT, 'cloud_type' => 1])->select('commission')
  187. ->sum('commission');
  188. //产品代理佣金
  189. $goods_agent_query = clone $query;
  190. $goods_agent_commission = (float)$goods_agent_query->andWhere(['type' => StoreShareMoney::TYPE_GOODS_AGENT])->select('commission')
  191. ->sum('commission');
  192. return [
  193. 'code' => 0,
  194. 'msg' => '获取成功',
  195. 'data' => [
  196. 'saas_money' => $all_commission,
  197. 'store_commission' => $store_commission,//推荐店铺返利佣金
  198. 'store_fee_commission' => $store_fee_commission,//店铺缴费佣金
  199. 'store_area_commission' => $store_area_commission,//店铺区域佣金
  200. 'supplier_commission' => $supplier_commission,//入住商区域佣金
  201. 'goods_agent_commission' => $goods_agent_commission//产品代理佣金
  202. ]
  203. ];
  204. } catch (\Exception $e) {
  205. return [
  206. 'code' => 1,
  207. 'msg' => $e->getMessage()
  208. ];
  209. }
  210. }
  211. //分佣
  212. public function commission(){
  213. $saas_user = get_saas_user();
  214. $profit_type = (int)$this->profit_type;
  215. //店铺入驻费用返利
  216. $storeShareMoneyTable = StoreShareMoney::tableName();
  217. $sharingReceiverTable = SharingReceiver::tableName();
  218. $sql = "select * from (SELECT id, store_id, user_id, commission AS money, order_id, created_at, is_send, order_type,
  219. cloud_type, `type`, status, 0 AS profit_type FROM ${storeShareMoneyTable} where is_delete = 0 UNION ALL
  220. SELECT id, store_id, saas_id AS user_id, amount AS money, order_no AS order_id, created_at, is_pay AS is_send, 0 AS order_type,
  221. 0 AS cloud_type, 3 AS `type`, 1 AS status, 5 AS profit_type FROM ${sharingReceiverTable} where is_delete = 0 AND execute_type = 1
  222. ) AS sm where sm.user_id = " . $saas_user->id;//后面的SharingReceiver信息profit_type之前的自定义字段都随便填写的 不进入where条件就行
  223. // $query = StoreShareMoney::find()->where(['user_id'=>$saas_user->id,'is_delete'=>0])->select('id,
  224. // store_id, commission as money, order_id, created_at, is_send, order_type, cloud_type, type, status')
  225. // ;
  226. switch ($profit_type) {
  227. case 1:
  228. $sql .= " AND sm.type = " . StoreShareMoney::TYPE_AREA_AGENT . " AND cloud_type = 0 ";
  229. break;
  230. case 2:
  231. $sql .= " AND sm.type = " . StoreShareMoney::TYPE_AREA_AGENT . " AND cloud_type = 1 ";
  232. break;
  233. case 3:
  234. $sql .= " AND sm.status = " . StoreShareMoney::STATUS_STORE_SETTLED;
  235. break;
  236. case 4:
  237. $sql .= " AND sm.type = " . StoreShareMoney::TYPE_GOODS_AGENT;
  238. break;
  239. case 5:
  240. // $sql .= " AND sm.profit_type = " . $profit_type;
  241. break;
  242. default:
  243. $sql .= " AND sm.type in (" . implode(',', [StoreShareMoney::TYPE_AGENT, StoreShareMoney::TYPE_BD_AGENT]) . ") ";
  244. break;
  245. }
  246. $sql .= " ORDER BY sm.created_at DESC ";
  247. $count = \Yii::$app->db->createCommand($sql)->query()->count();
  248. $pagination = new Pagination(['totalCount' => $count, 'page' => $this->page - 1, 'pageSize' => $this->limit]);
  249. /* @var Order[] $list */
  250. $sql .= " LIMIT " . $pagination->limit . " OFFSET " . $pagination->offset;
  251. $data = \Yii::$app->db->createCommand($sql)->queryAll();
  252. foreach ($data as &$item) {
  253. //类型
  254. if ($item['profit_type'] < 5) {//分账转帐类型
  255. //店铺区域佣金 / 入驻商(供货商)区域佣金 / 店铺推荐返利
  256. if ((int)$item['type'] === StoreShareMoney::TYPE_AREA_AGENT) {
  257. if ((int)$item['cloud_type'] === 0) {
  258. $model = Order::find();
  259. $item['profit_type'] = 1; //店铺区域佣金
  260. } else {
  261. $model = PurchaseOrder::find();
  262. $item['profit_type'] = 2;//入驻商(供货商)区域佣金
  263. }
  264. $item['order'] = $model->where(['AND', ['id' => $item['order_id']],['<>', 'trade_status', '1']])
  265. ->select('id, order_no, total_price')->asArray()->one();
  266. }
  267. if (in_array($item['type'], [StoreShareMoney::TYPE_AGENT, StoreShareMoney::TYPE_BD_AGENT, StoreShareMoney::TYPE_AREA_AGENT])) {
  268. if ((int)$item['cloud_type'] === 0) {
  269. $model = Order::find();
  270. $item['profit_type'] = 1; //店铺区域佣金
  271. } else {
  272. $model = PurchaseOrder::find();
  273. $item['profit_type'] = 2;//入驻商(供货商)区域佣金
  274. }
  275. if (intval($item['type']) === StoreShareMoney::TYPE_AREA_AGENT) {
  276. if ((int)$item['cloud_type'] === 0) {
  277. $item['profit_type'] = 1; //店铺区域佣金
  278. } else {
  279. $item['profit_type'] = 2;//入驻商(供货商)区域佣金
  280. }
  281. } else {
  282. $item['order'] = $model->where(['AND', ['id' => $item['order_id']],['<>', 'trade_status', '1']])
  283. ->select('id, order_no, total_price')->asArray()->one();
  284. $item['profit_type'] = 0;
  285. }
  286. }
  287. //店铺缴费
  288. if ($item['status'] === StoreShareMoney::STATUS_STORE_SETTLED) {
  289. $item['order'] = StoreReOrder::find()->where(['id' => $item['order_id']])
  290. ->select('id, order_no, total_price')->asArray()->one();
  291. $item['profit_type'] = 3;
  292. }
  293. //产品代理佣金
  294. if ((int)$item['type'] === StoreShareMoney::TYPE_GOODS_AGENT) {
  295. $item['order'] = Order::find()->where(['AND', ['id' => $item['order_id']],['<>', 'trade_status', '1']])
  296. ->select('id, order_no, total_price')->asArray()->one();
  297. $item['profit_type'] = 4;
  298. }
  299. $item['order'] = !empty($item['reorder'])?$item['reorder']:$item['order'];
  300. $item['new_order'] = \app\plugins\scanCodePay\models\Order::findOne($item['order_id']);
  301. if(!$item['order']){
  302. $item['order'] = \app\plugins\scanCodePay\models\Order::findOne($item['order_id']);
  303. }
  304. if ((int)$item['status'] === StoreShareMoney::STATUS_STORE_ORDER) {
  305. if ((int)$item['order_type'] === 1) {
  306. $item['order'] = PurchaseOrder::find()->select('id, order_no, total_price, supplier_id')->where(['id' => $item['order_id']])
  307. ->asArray()->one();
  308. if ((int)$item['cloud_type'] === 1) {
  309. $supplier = Supplier::find()->select('id,supplier_name name,logo')->where(['cloud_supplier_id' => $item['order']['supplier_id']])
  310. ->asArray()->one();
  311. }
  312. } else {
  313. $OrderTransit = OrderTransit::find()->where(['order_id' => $item['order_id']])
  314. ->asArray()->one();
  315. if ((int)$item['cloud_type'] === 1) {
  316. $supplier = Supplier::find()->select('id,name,logo')->where(['cloud_supplier_id' => $OrderTransit['supplier_id']])
  317. ->asArray()->one();
  318. }
  319. }
  320. if (!empty($supplier)) {
  321. $item['store'] = $supplier;
  322. }
  323. }
  324. } else {
  325. $item['order'] = [
  326. 'order_no' => $item['order_id']
  327. ];
  328. $item['store'] = Store::find()->where(['id' => $item['store_id']])->select('id, name, logo')
  329. ->asArray()->one();
  330. }
  331. $item['created_at'] = date("Y-m-d H:i:s",$item['created_at']);
  332. }
  333. return [
  334. 'code'=>0,
  335. 'msg'=>"SUCCESS",
  336. 'data'=>[
  337. 'list' => $data,
  338. 'row_count' => $count,
  339. 'page_count' => $pagination->pageCount,
  340. ]
  341. ];
  342. }
  343. }