You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.8 KiB

  1. <?php
  2. namespace backend\modules\shop\logic;
  3. use backend\modules\shop\models\ars\City;
  4. use backend\modules\shop\models\ars\ExpressArea;
  5. use backend\modules\shop\models\ars\Province;
  6. use backend\modules\shop\models\ars\ExpressTemplate;
  7. class ShopManager
  8. {
  9. //单位类型
  10. const UNIT_TYPE_WEIGHT = 1; //重量
  11. const UNIT_TYPE_MONEY = 2; //金额
  12. const UNIT_TYPE_ITEM = 3; //件
  13. const UNIT_TYPE_LENGTH = 4; //长度,宽度,高度,直径
  14. /**
  15. * @param $type
  16. * @return int
  17. * 比例转换
  18. */
  19. public static function proportionalConversion($type)
  20. {
  21. switch ($type) {
  22. case self::UNIT_TYPE_WEIGHT:
  23. return 1000; //后台显示为kg,数据库保存为g
  24. break;
  25. case self::UNIT_TYPE_MONEY:
  26. return 100; //后台显示为元,数据库保存为分
  27. break;
  28. case self::UNIT_TYPE_ITEM:
  29. return 1; //后台显示和数据库都为件
  30. break;
  31. case self::UNIT_TYPE_LENGTH:
  32. return 1; //后台和数据库都为毫米
  33. break;
  34. default:
  35. return 1;
  36. }
  37. }
  38. /**
  39. * @param ExpressArea|$expressAreaModel
  40. * @param ExpressTemplate|$expressTemplateModel
  41. * 区域运费模板按比例转化数据
  42. */
  43. public static function expressAreaScaleDate($expressAreaModel, $expressTemplateModel)
  44. {
  45. $expressAreaModel->basic_price *= self::proportionalConversion(self::UNIT_TYPE_MONEY);
  46. $expressAreaModel->extra_price *= self::proportionalConversion(self::UNIT_TYPE_MONEY);
  47. if ($expressTemplateModel->calculation_type == ExpressTemplate::CALCULATION_TYPE_WEIGHT) {
  48. $expressAreaModel->basic_count *= self::proportionalConversion(self::UNIT_TYPE_WEIGHT);
  49. $expressAreaModel->extra_count *= self::proportionalConversion(self::UNIT_TYPE_WEIGHT);
  50. } else {
  51. $expressAreaModel->basic_count *= self::proportionalConversion(self::UNIT_TYPE_ITEM);
  52. $expressAreaModel->extra_count *= self::proportionalConversion(self::UNIT_TYPE_ITEM);
  53. }
  54. }
  55. /**
  56. * @param ExpressArea|$expressAreaModel
  57. * @return array
  58. * 除去已被选取的城市,筛选剩下的城市数据
  59. */
  60. public static function filterCity($expressAreaModel)
  61. {
  62. $query = ExpressArea::find()
  63. ->select(['city'])
  64. ->where(['express_template' => $expressAreaModel->express_template]);
  65. if ($expressAreaModel->id) { //修改操作时,除去自身的城市
  66. $query = $query->andWhere(['!=', 'id', $expressAreaModel->id]);
  67. }
  68. $allDate = $query->all();
  69. $expressAresCityIdArr = self::filterSelectedCtiyIdArr($allDate);
  70. $leftoverCityArr = self::filterLeftoverCityArr($expressAresCityIdArr);
  71. return $leftoverCityArr;
  72. }
  73. /**
  74. * @param $expressAreas
  75. * @return array 已选的城市id数组
  76. * 获取已选的城市id数组
  77. */
  78. private static function filterSelectedCtiyIdArr($expressAreas)
  79. {
  80. $expressAresCityIdArr = [];
  81. if ($expressAreas) {
  82. foreach ($expressAreas as $expressAreaCity) {
  83. $cityIdArr = explode(',', $expressAreaCity->city);
  84. $expressAresCityIdArr = array_unique(array_merge($cityIdArr, $expressAresCityIdArr));
  85. }
  86. }
  87. return $expressAresCityIdArr;
  88. }
  89. /**
  90. * @param $expressAresCityIdArr
  91. * @return array 未选的城市id数组
  92. * 筛选剩下的城市
  93. */
  94. private static function filterLeftoverCityArr($expressAresCityIdArr)
  95. {
  96. $data = [];
  97. $provinces = Province::find()->cache(0)->all();
  98. foreach ($provinces as $key => $province) {
  99. $cities = City::find()
  100. ->where(['province_id' => $province->province_id])
  101. ->andWhere(['not in', 'city_id', $expressAresCityIdArr])
  102. ->all();
  103. if ($cities) {
  104. $data[$key]['province'] = $province->name;
  105. foreach ($cities as $city) {
  106. $data[$key]['city'][] = ['id' => $city->city_id, 'name' => $city->name];
  107. }
  108. }
  109. }
  110. return array_values($data);
  111. }
  112. /**
  113. * 处理所选区域数据
  114. * @param $area
  115. * @param ExpressArea|$expressAreaModel
  116. * @param ExpressTemplate|$expressTemplateModel
  117. * @return bool
  118. */
  119. public static function dealAreaInExpressArea($area, $expressAreaModel, $expressTemplateModel)
  120. {
  121. $cityIds = array_keys($area);
  122. $data['city'] = implode(',', $cityIds);
  123. $expressAreaModel->load($data, '');
  124. self::expressAreaScaleDate($expressAreaModel, $expressTemplateModel); //按比例转换数据
  125. $expressAreaModel->save();
  126. return true;
  127. }
  128. }