OrderCommentForm.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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\Option;
  9. use app\models\SaasUser;
  10. use app\models\Store;
  11. use app\models\User;
  12. use app\models\WechatConfig;
  13. use EasyWeChat\Factory;
  14. use EasyWeChat\Kernel\BaseClient;
  15. use yii\helpers\Html;
  16. use Yii;
  17. use yii\base\Model;
  18. use yii\helpers\Json;
  19. class OrderCommentForm extends Model
  20. {
  21. public $store_id;
  22. public $user_id;
  23. public $saas_id;
  24. public $order_id;
  25. public $goods_list;
  26. public $type;
  27. public $is_virtual;
  28. public function rules()
  29. {
  30. return [
  31. [['goods_list', 'order_id'], 'required'],
  32. [['type'], 'string'],
  33. [['is_virtual', 'saas_id'], 'integer']
  34. ];
  35. }
  36. public function save()
  37. {
  38. if (!$this->validate()) {
  39. return ['code' => 1, 'msg' => $this->getErrorSummary(false)[0]];
  40. }
  41. $orderClass = 'app\models\Order';
  42. $commentClass = 'app\models\OrderComment';
  43. $detailClass = 'app\models\OrderDetail';
  44. $order = $orderClass::findOne([
  45. 'id' => $this->order_id,
  46. 'saas_id' => $this->saas_id,
  47. 'is_delete' => 0,
  48. ]);
  49. if (!$order) {
  50. return [
  51. 'code' => 1,
  52. 'msg' => '订单不存在或已删除',
  53. ];
  54. }
  55. $goods_list = Json::decode($this->goods_list);
  56. if (!$goods_list) {
  57. return [
  58. 'code' => 1,
  59. 'msg' => '商品信息不能为空',
  60. ];
  61. }
  62. Yii::error($goods_list);
  63. $t = \Yii::$app->db->beginTransaction();
  64. foreach ($goods_list as $goods) {
  65. $order_detail = $detailClass::findOne([
  66. 'id' => $goods['order_detail_id'],
  67. 'order_id' => $order->id,
  68. 'goods_id' => $goods['goods_id'],
  69. 'is_delete' => 0,
  70. ]);
  71. if (!$order_detail) {
  72. continue;
  73. }
  74. if (empty($goods['content'])) {
  75. return [
  76. 'code' => 1,
  77. 'msg' => '评论失败,请输入评价内容!',
  78. ];
  79. }
  80. if(is_wechat_platform()){
  81. if (!is_open_platform()) {
  82. $app = Yii::$app->controller->wechatMini;
  83. } else {
  84. if($order->store_id == -1){
  85. $storeInfo = [];
  86. }else{
  87. $storeInfo = Store::findOne($order->store_id);
  88. }
  89. $plugin = \Yii::$app->getAttr('plugin');
  90. $open = false;
  91. if (in_array('duli_store', $plugin['union'])) {
  92. $open = true;
  93. }
  94. $self_mini = Option::get('self_mini', $order->store_id,'store', 0)['value'];
  95. if (\Yii::$app->prod_is_dandianpu() && (!$self_mini || !$open)) {
  96. $app = $this->setSingleStoreWechat($order->is_platform);
  97. } else {
  98. if((isset($storeInfo->business_model) && $storeInfo->business_model != 1) || !$storeInfo || $order->is_platform){
  99. $app = $this->setBussinessWechat();
  100. }else{
  101. $app = $this->setWechat($order->store_id);
  102. }
  103. }
  104. }
  105. if ($app) {
  106. $res = $app->content_security->checkText($goods['content']);
  107. if ($res['errcode'] > 0) {
  108. return [
  109. 'code' => 1,
  110. 'msg' => '评论失败,内容违法!'.json_encode($res['errmsg']),
  111. ];
  112. }
  113. }
  114. }
  115. $user_id = 0;
  116. if ($order->store_id > 0) {
  117. $saasUser = SaasUser::findOne($this->saas_id);
  118. $user = User::findOne(['binding' => $saasUser->mobile, 'store_id' => $order->store_id]);
  119. $user_id = $user->id ?? 0;
  120. }
  121. $order_comment = new $commentClass();
  122. $order_comment->store_id = $this->store_id;
  123. $order_comment->order_detail_id = $order_detail->id;
  124. $order_comment->user_id = $user_id;
  125. $order_comment->saas_id = $this->saas_id;
  126. $order_comment->order_id = $this->order_id;
  127. $order_comment->goods_id = $order_detail->goods_id;
  128. $order_comment->score = $goods['score'];
  129. $order_comment->content = Html::encode($goods['content']);
  130. $order_comment->created_at = time();
  131. if ($this->is_virtual) {
  132. $order_comment->is_virtual = 1;
  133. $order_comment->virtual_user = '匿名用户';
  134. $order_comment->virtual_avatar = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/web/v1/statics/images/avatar.png';
  135. }
  136. if ($order->mch_id > 0) {
  137. $order_comment->mch_id = $order->mch_id;
  138. }
  139. $order_comment->content = preg_replace('/[\xf0-\xf7].{3}/', '', $order_comment->content);
  140. $pic_list = [];
  141. foreach ($goods['pic_list'] as $pic) {
  142. if ($pic['url']) {
  143. $pic_list[] = Html::encode($pic['url']);
  144. } else {
  145. $pic_list[] = Html::encode($pic);
  146. }
  147. }
  148. $order_comment->pic_list = Json::encode($pic_list);
  149. if (!$order_comment->save()) {
  150. $t->rollBack();
  151. return ['code' => 1, 'msg' => $order_comment->errors[0]];
  152. }
  153. }
  154. $order->is_comment = 1;
  155. if ($order->save()) {
  156. $t->commit();
  157. return [
  158. 'code' => 0,
  159. 'msg' => '提交成功',
  160. 'type' => $this->type,
  161. ];
  162. } else {
  163. $t->rollBack();
  164. return ['code' => 1, 'msg' => $order->errors[0]];
  165. }
  166. }
  167. // 单店铺
  168. public function setSingleStoreWechat($is_platform = false)
  169. {
  170. if($is_platform){
  171. // 证书
  172. if (!is_dir(\Yii::$app->runtimePath . '/pem_dandianpu')) {
  173. mkdir(\Yii::$app->runtimePath . '/pem_dandianpu');
  174. file_put_contents(\Yii::$app->runtimePath . '/pem_dandianpu/index.html', '');
  175. }
  176. $config = [
  177. 'app_id' => Option::get('platform_mch_appid', 0, 'saas', '')['value'],
  178. 'secret' => Option::get('platform_mch_key', 0, 'saas', '')['value'],
  179. 'response_type' => 'array'
  180. ];
  181. $wechatMini = Factory::miniProgram($config);
  182. return $wechatMini->app_code;
  183. }
  184. // 证书
  185. if (!is_dir(\Yii::$app->runtimePath . '/pem')) {
  186. mkdir(\Yii::$app->runtimePath . '/pem');
  187. file_put_contents(\Yii::$app->runtimePath . '/pem/index.html', '');
  188. }
  189. $config = [
  190. 'app_id' => Option::get('one_store_wechat_appid', 0, 'saas', '')['value'],
  191. 'secret' => Option::get('one_store_wechat_secret', 0, 'saas', '')['value'],
  192. 'response_type' => 'array'
  193. ];
  194. return Factory::miniProgram($config);
  195. }
  196. public function setBussinessWechat()
  197. {
  198. // 证书
  199. if (!is_dir(\Yii::$app->runtimePath . '/pem')) {
  200. mkdir(\Yii::$app->runtimePath . '/pem');
  201. file_put_contents(\Yii::$app->runtimePath . '/pem/index.html', '');
  202. }
  203. $config = [
  204. 'app_id' => Option::get('platform_appid', 0, 'saas')['value'],
  205. 'secret' => Option::get('platform_key', 0, 'saas')['value'],
  206. 'response_type' => 'array'
  207. ];
  208. return Factory::miniProgram($config);
  209. }
  210. }