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.

117 lines
4.1 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. /**
  14. * @param $type
  15. * @return int
  16. * 比例转换
  17. */
  18. public static function proportionalConversion($type)
  19. {
  20. switch ($type) {
  21. case self::UNIT_TYPE_WEIGHT:
  22. return 1000; //后台显示为kg,数据库保存为g
  23. break;
  24. case self::UNIT_TYPE_MONEY:
  25. return 100; //后台显示为元,数据库保存为分
  26. break;
  27. case self::UNIT_TYPE_ITEM:
  28. return 1; //后台显示和数据库都为件
  29. break;
  30. default:
  31. return 1;
  32. }
  33. }
  34. /**
  35. * @param ExpressArea|$expressAreaModel
  36. * @param ExpressTemplate|$expressTemplateModel
  37. * 区域运费模板按比例转化数据
  38. */
  39. public static function expressAreaScaleDate($expressAreaModel, $expressTemplateModel)
  40. {
  41. $expressAreaModel->basic_price *= self::proportionalConversion(self::UNIT_TYPE_MONEY);
  42. $expressAreaModel->extra_price *= self::proportionalConversion(self::UNIT_TYPE_MONEY);
  43. if ($expressTemplateModel->calculation_type == ExpressTemplate::CALCULATION_TYPE_WEIGHT) {
  44. $expressAreaModel->basic_count *= self::proportionalConversion(self::UNIT_TYPE_WEIGHT);
  45. $expressAreaModel->extra_count *= self::proportionalConversion(self::UNIT_TYPE_WEIGHT);
  46. } else {
  47. $expressAreaModel->basic_count *= self::proportionalConversion(self::UNIT_TYPE_ITEM);
  48. $expressAreaModel->extra_count *= self::proportionalConversion(self::UNIT_TYPE_ITEM);
  49. }
  50. }
  51. /**
  52. * @param ExpressArea|$expressAreaModel
  53. * @return array
  54. * 除去已被选取的城市,筛选剩下的城市数据
  55. */
  56. public static function filterCity($expressAreaModel)
  57. {
  58. $query = ExpressArea::find()
  59. ->select(['city'])
  60. ->where(['express_template' => $expressAreaModel->express_template]);
  61. if ($expressAreaModel->id) { //修改操作时,除去自身的城市
  62. $query = $query->andWhere(['!=', 'id', $expressAreaModel->id]);
  63. }
  64. $allDate = $query->all();
  65. $expressAresCityIdArr = self::filterSelectedCtiyIdArr($allDate);
  66. $leftoverCityArr = self::filterLeftoverCityArr($expressAresCityIdArr);
  67. return $leftoverCityArr;
  68. }
  69. /**
  70. * @param $expressAreas
  71. * @return array 已选的城市id数组
  72. * 获取已选的城市id数组
  73. */
  74. private static function filterSelectedCtiyIdArr($expressAreas)
  75. {
  76. $expressAresCityIdArr = [];
  77. if ($expressAreas) {
  78. foreach ($expressAreas as $expressAreaCity) {
  79. $cityIdArr = explode(',', $expressAreaCity->city);
  80. $expressAresCityIdArr = array_unique(array_merge($cityIdArr, $expressAresCityIdArr));
  81. }
  82. }
  83. return $expressAresCityIdArr;
  84. }
  85. /**
  86. * @param $expressAresCityIdArr
  87. * @return array 未选的城市id数组
  88. * 筛选剩下的城市
  89. */
  90. private static function filterLeftoverCityArr($expressAresCityIdArr)
  91. {
  92. $data = [];
  93. $provinces = Province::find()->cache(0)->all();
  94. foreach ($provinces as $key => $province) {
  95. $cities = City::find()
  96. ->where(['province_id' => $province->province_id])
  97. ->andWhere(['not in', 'city_id', $expressAresCityIdArr])
  98. ->all();
  99. if ($cities) {
  100. $data[$key]['province'] = $province->name;
  101. foreach ($cities as $city) {
  102. $data[$key]['city'][] = ['id' => $city->city_id, 'name' => $city->name];
  103. }
  104. }
  105. }
  106. return array_values($data);
  107. }
  108. }