MdCategoryForm.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. <?php
  2. namespace app\modules\admin\models;
  3. use app\models\Md;
  4. use app\models\MdCategory;
  5. use yii\base\Model;
  6. class MdCategoryForm extends Model
  7. {
  8. public $store_id;
  9. public $name;
  10. public $sort;
  11. public $is_show;
  12. public $id;
  13. public $ids;
  14. public $start_time;
  15. public $end_time;
  16. public function rules()
  17. {
  18. return [
  19. [['id', 'store_id', 'is_show', 'sort'], 'integer'],
  20. [['name', 'start_time', 'end_time'], 'string'],
  21. [['name'], 'trim'],
  22. [['ids'], 'safe']
  23. ];
  24. }
  25. /**
  26. * 门店分类列表
  27. */
  28. public function list() {
  29. $store_id = $this->store_id;
  30. $name = trim($this->name);
  31. $is_show = $this->is_show;
  32. $start_time = $this->start_time;
  33. $end_time = $this->end_time;
  34. $query = MdCategory::find()->where(['is_delete' => 0, 'store_id' => $store_id]);
  35. if ($name) {
  36. $query->andWhere(['LIKE', 'name', $name]);
  37. }
  38. if (isset($is_show) && in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) {
  39. $query->andWhere(['is_show' => $is_show]);
  40. }
  41. if ($start_time) {
  42. $query->andWhere(['>=', 'created_at', strtotime($start_time)]);
  43. }
  44. if ($end_time) {
  45. $query->andWhere(['<=', 'created_at', strtotime($end_time)]);
  46. }
  47. $query->orderBy('sort DESC')->select('id, name, sort, is_show, created_at');
  48. $list = pagination_make($query);
  49. foreach ($list['list'] as &$item) {
  50. $item['is_show'] = intval($item['is_show']);
  51. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  52. }
  53. return [
  54. 'code' => 0,
  55. 'msg' => '',
  56. 'data' => $list
  57. ];
  58. }
  59. /**
  60. * 保存
  61. */
  62. public function save() {
  63. try {
  64. $id = $this->id;
  65. $store_id = $this->store_id;
  66. $sort = $this->sort;
  67. $is_show = $this->is_show;
  68. $name = trim($this->name);
  69. if (empty($name)) {
  70. throw new \Exception('分类名称不能为空');
  71. }
  72. if (!in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) {
  73. throw new \Exception('状态枚举值错误');
  74. }
  75. $mdCategory = MdCategory::findOne(['id' => $id, 'is_delete' => 0]);
  76. if (!$mdCategory) {
  77. $mdCategory = new MdCategory();
  78. $mdCategory->store_id = $store_id;
  79. }
  80. $mdCategory->sort = $sort ?: 0;
  81. $mdCategory->is_show = $is_show;
  82. $mdCategory->name = $name;
  83. if (!$mdCategory->save()) {
  84. throw new \Exception(implode(';', array_values($mdCategory->firstErrors)));
  85. }
  86. return [
  87. 'code' => 0,
  88. 'msg' => '保存成功'
  89. ];
  90. } catch (\Exception $e) {
  91. return [
  92. 'code' => 1,
  93. 'msg' => $e->getMessage()
  94. ];
  95. }
  96. }
  97. /**
  98. * 删除
  99. */
  100. public function del() {
  101. try {
  102. $id_arr = $this->ids;
  103. // $id_arr = explode(',', $ids);
  104. foreach ($id_arr as $item) {
  105. $mdCategory = MdCategory::findOne(['id' => $item, 'is_delete' => 0]);
  106. if ($mdCategory) {
  107. $mdCategory->is_delete = 1;
  108. if (!$mdCategory->save()) {
  109. throw new \Exception(implode(';', array_values($mdCategory->firstErrors)));
  110. }
  111. }
  112. }
  113. return [
  114. 'code' => 0,
  115. 'msg' => '处理成功'
  116. ];
  117. } catch (\Exception $e) {
  118. return [
  119. 'code' => 1,
  120. 'msg' => $e->getMessage()
  121. ];
  122. }
  123. }
  124. /**
  125. * 修改状态
  126. */
  127. public function setStatus() {
  128. try {
  129. $id_arr = $this->ids;
  130. $is_show = $this->is_show;
  131. if (!in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) {
  132. throw new \Exception('状态枚举值错误');
  133. }
  134. // $id_arr = explode(',', $ids);
  135. foreach ($id_arr as $item) {
  136. $mdCategory = MdCategory::findOne(['id' => $item, 'is_delete' => 0]);
  137. if ($mdCategory) {
  138. $mdCategory->is_show = $is_show;
  139. if (!$mdCategory->save()) {
  140. throw new \Exception(implode(';', array_values($mdCategory->firstErrors)));
  141. }
  142. }
  143. }
  144. return [
  145. 'code' => 0,
  146. 'msg' => '处理成功'
  147. ];
  148. } catch (\Exception $e) {
  149. return [
  150. 'code' => 1,
  151. 'msg' => $e->getMessage()
  152. ];
  153. }
  154. }
  155. /**
  156. * 获取门店分类数据
  157. */
  158. public function getMdCategoryData() {
  159. $store_id = $this->store_id;
  160. $name = $this->name;
  161. $is_show = $this->is_show;
  162. $id = $this->id;
  163. $start_time = $this->start_time;
  164. $end_time = $this->end_time;
  165. $trade_status = [
  166. \app\models\Order::ORDER_FLOW_NO_SEND,
  167. \app\models\Order::ORDER_FLOW_SEND,
  168. \app\models\Order::ORDER_FLOW_CONFIRM
  169. ];
  170. //排名
  171. $md_table = \app\models\Md::tableName();
  172. $md_category_table = \app\models\MdCategory::tableName();
  173. $order_table = \app\models\Order::tableName();
  174. $scan_order_table = \app\plugins\scanCodePay\models\Order::tableName();
  175. $trade_status_str = implode(',', $trade_status);
  176. $sql = "select mc.id, SUM(m.total_price) as total_price from {$md_category_table} mc left join (select m.id, SUM(o.total_price) as total_price, m.cat_id from {$md_table} m left join (
  177. select total_price, md_id from {$order_table} where trade_status in ({$trade_status_str})
  178. UNION ALL select total_price, md_id from {$scan_order_table} where is_pay = 1) o on o.md_id = m.id
  179. GROUP BY o.md_id) as m on mc.id = m.cat_id where mc.is_delete = 0 and mc.store_id = {$store_id} group by mc.id ";
  180. $ranking_data = \Yii::$app->db->createCommand($sql)->queryAll();
  181. $last_names = array_column($ranking_data,'total_price');
  182. array_multisort($last_names, SORT_DESC, $ranking_data);
  183. foreach ($ranking_data as $ranking_index => &$ranking_item) {
  184. $ranking_item['num'] = $ranking_index + 1;
  185. }
  186. $md_category_id = array_column($ranking_data, 'id');
  187. $query = MdCategory::find()->where([
  188. 'is_delete' => 0,
  189. 'store_id' => $store_id
  190. ]);
  191. if ($name) {
  192. $query->andWhere(['LIKE', 'name', $name]);
  193. }
  194. if ($id) {
  195. $query->andWhere(['id' => $id]);
  196. }
  197. if (isset($is_show) && in_array($is_show, [MdCategory::STATUS_ENABLE, MdCategory::STATUS_DISABLE])) {
  198. $query->andWhere(['is_show' => $is_show]);
  199. }
  200. if ($start_time) {
  201. $query->andWhere(['>=', 'created_at', strtotime($start_time)]);
  202. }
  203. if ($end_time) {
  204. $query->andWhere(['<=', 'created_at', strtotime($end_time)]);
  205. }
  206. $query->select('id, name, is_show, created_at');
  207. if ($md_category_id) {
  208. $md_category_id = implode(',', $md_category_id);
  209. $query->orderBy([new \yii\db\Expression("FIELD(id, {$md_category_id})")]);
  210. }
  211. $list = pagination_make($query);
  212. foreach ($list['list'] as &$item) {
  213. $item['is_show'] = intval($item['is_show']);
  214. $md_id = Md::find()->where(['is_delete' => 0, 'cat_id' => $item['id']])
  215. ->select('id')->column();
  216. $item['md_count'] = count($md_id);
  217. $scan_order = \app\plugins\scanCodePay\models\Order::find()
  218. ->where(['is_pay' => 1, 'md_id' => $md_id])->select('id, total_price')->asArray()->all();
  219. $scan_order_total_price = array_sum(array_column($scan_order, 'total_price')) ?: '0.00';
  220. $order = \app\models\Order::find()
  221. ->where(['trade_status' => $trade_status, 'md_id' => $md_id])->select('id, total_price')
  222. ->asArray()->all();
  223. $order_total_price = array_sum(array_column($order, 'total_price')) ?: '0.00';
  224. $item['order_count'] = bcadd(count($scan_order), count($order));
  225. $item['total_price'] = bcadd($scan_order_total_price, $order_total_price, 2);
  226. $ranking_ = array_values(array_filter($ranking_data, fn($ranking_value) => $ranking_value['id'] == $item['id']));
  227. $item['num'] = count($ranking_) ? $ranking_[0]['num'] : 0;
  228. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  229. }
  230. return [
  231. 'code' => 0,
  232. 'msg' => '',
  233. 'data' => $list
  234. ];
  235. }
  236. public function getMdCategoryDataDetail() {
  237. $store_id = $this->store_id;
  238. $id = $this->id;
  239. $name = trim($this->name);
  240. $trade_status = [
  241. \app\models\Order::ORDER_FLOW_NO_SEND,
  242. \app\models\Order::ORDER_FLOW_SEND,
  243. \app\models\Order::ORDER_FLOW_CONFIRM
  244. ];
  245. $query = Md::find()->where(['is_delete' => 0, 'store_id' => $store_id, 'cat_id' => $id]);
  246. if ($name) {
  247. $query->andWhere(['LIKE', 'name', $name]);
  248. }
  249. $query->select('id, name, cat_id, created_at')->orderBy('id DESC');
  250. $list = pagination_make($query);
  251. foreach ($list['list'] as &$item) {
  252. $scan_order = \app\plugins\scanCodePay\models\Order::find()
  253. ->where(['is_pay' => 1, 'md_id' => $item['id']])->select('id, total_price')->asArray()->all();
  254. $scan_order_total_price = array_sum(array_column($scan_order, 'total_price')) ?: '0.00';
  255. $order = \app\models\Order::find()
  256. ->where(['trade_status' => $trade_status, 'md_id' => $item['id']])->select('id, total_price')
  257. ->asArray()->all();
  258. $order_total_price = array_sum(array_column($order, 'total_price')) ?: '0.00';
  259. $item['order_count'] = bcadd(count($scan_order), count($order));
  260. $item['total_price'] = bcadd($scan_order_total_price, $order_total_price, 2);
  261. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  262. }
  263. return [
  264. 'code' => 0,
  265. 'msg' => '',
  266. 'data' => $list
  267. ];
  268. }
  269. }