1 public function actionGarbage()
  2     {
  3 //        $param = \Yii::$app->request->post('rubbish', '');
  4         // 接收json 数据
  5         $rubbish = file_get_contents('php://input');
  6         $rubbish = json_decode($rubbish, true);
  7         $param = $rubbish['inquire']['utterance']['original'];
  8         if(empty($param)){
  9             return [
 10                 'code' => 4001,
 11                 'msg' => 'rubbish参数不能为空',
 12             ];
 13         }
 14         /*  status有几种状态来判断用户传进来的语句格式,根据status的值进行对应处理,返回结果。
 15             0:初始化,默认表示xxx是什么垃圾 1:如何处理垃圾,2:xxx是不是垃圾,3:xxx是xx垃圾还是xx垃圾 */
 16         $status = 0;
 17
 18         /* 在字符串中寻找字符串中的子串是否存在 */
 19         $word = ['扔','放','投放','处理'];
 20         if($this->wordSearch($word, $param)){
 21             $status = 1;
 22         }
 23
 24         /* 【属不属于垃圾】 */
 25         $word = ['是不是','吗','属不属于','算不算', '么'];
 26         if($this->wordSearch($word, $param)){
 27             $status = 2;
 28         }
 29
 30         /* 【xxx是xx垃圾还是xx垃圾】 */
 31         $word = '垃圾还是';
 32         if($this->wordSearch($word, $param)){
 33             $status = 3;
 34         }
 35
 36         /* 【干垃圾哪里扔】 */
 37         $word_r = ['干垃圾', '湿垃圾', '可回收物', '其它垃圾', '厨余垃圾', '有害垃圾', '可回收', '有害', '其它', '厨余', '其他垃圾', '其他', '湿', '干',];
 38         $action = ['投放', '扔', '放' ];
 39         if($this->wordSearch($word_r, $param) && $this->wordSearch($action, $param)){
 40             $status = 4;
 41         }
 42
 43         /* 干垃圾有哪些 */
 44         $word_r = ['干垃圾', '湿垃圾', '可回收物', '其它垃圾', '厨余垃圾', '有害垃圾', '可回收', '有害', '其它', '厨余', '其他垃圾', '其他', '湿', '干',];
 45         $what = ['包括哪些', '包括什么', '都有什么', '有什么', '有哪些', '什么是', '是什么', '包括', '哪些', '什么', ];
 46         if($this->wordSearch($word_r, $param) && $this->wordSearch($what, $param)){
 47             $status = 5;
 48         }
 49
 50         /* {garbage}和{garbage}是一种垃圾么? */
 51         $word = ['是一种垃圾么', '是一种垃圾吗', '算一种垃圾么', '算一种垃圾吗', '属于一种垃圾么', '属于一种垃圾吗', ];
 52         if($this->wordSearch('和', $param) && $this->wordSearch($word, $param)){
 53             $status = 6;
 54         }
 55
 56         /* 【垃圾分类的意义】 */
 57         if(strpos($param, '意义') !== false){
 58             return [
 59                 'code' => 0,
 60                 'msg' => 'success',
 61                 'result' => '1.有助于改善垃圾品质,使末端焚烧(或填埋)得以更好的无害化处理 2.有助于再生资源循环利用,节约原生资源 3.有助于城市的干净整洁,减少清扫人员的负担,进而减少雇佣人力资源的浪费',
 62             ];
 63         }
 64
 65         //针对每一种情况进行对应的字符串处理, 截取出垃圾关键词, 查询数据库
 66         switch ($status){
 67             case 0:
 68                 //todo what is it rubbish?
 69                 $patt = ['哪一类', '哪一种', '哪类', '哪种', '什么', '属于', '垃圾', '是', '算', '啥', ];
 70                 $keyword = str_replace($patt, '', $param);
 71                 break;
 72             case 1:
 73                 //todo how to deal with rubbish?
 74                 $patt = ['怎么扔','垃圾箱', '应该','投放','哪里','哪儿','哪个','怎么样','怎么','咋样','处理','咋','往','该','扔','放','哪',];
 75                 $keyword = str_replace($patt, '', $param);
 76                 break;
 77             case 2:
 78                 //todo Is it rubbish? 【XXX是不是xx垃圾】这类词语过滤
 79                 $patt = ['是不是', '垃圾吗', '属不属于', '算不算', '哪一种', '哪一类', '哪种', '哪类', '属于', '一种', '垃圾', '什么', '算', '啥', '是', '么', '吗'];  //字数多的放在前面优先匹配
 80                 $new_param = str_replace($patt, '*', $param);
 81                 $pos = mb_strpos(trim($new_param, '*'), '*'); //截取垃圾关键词
 82                 $keyword = mb_substr($new_param, 0, $pos);
 83                 $cate = trim(mb_substr($new_param, $pos), '*');  //获取垃圾类别关键词, 用来判断结果返回【是】或者【不是】
 84                 break;
 85             case 3:
 86                 //todo xxx 是xx垃圾还是 xx垃圾
 87                 $patt = ['垃圾','还是','属于','是',];
 88                 $new_param = str_replace($patt, '*', $param);  //用*替换掉无用的词语
 89                 $pos = mb_strpos(trim($new_param, '*'), '*');   //截取垃圾关键词
 90                 $keyword = mb_substr($new_param, 0, $pos);  //得到垃圾关键词
 91                 $rest = trim(mb_substr($new_param, $pos), '*');  //去掉垃圾关键词剩余的部分
 92                 $rest_pos = mb_strpos($rest, '*');
 93                 $cate_one = mb_substr($rest, 0, $rest_pos);  //截取第一个垃圾类别关键词
 94                 $cate_two = trim(mb_substr($rest, $rest_pos), '*');  //截取第二个垃圾类别关键词
 95                 break;
 96             case 4:
 97                 //todo 干垃圾怎么扔
 98                 $patt = ['怎么扔','垃圾箱', '应该','投放','哪里','哪儿','哪个','怎么样','怎么','咋样','处理','咋','往','该','扔','放','哪',];
 99                 $keyword = str_replace($patt, '', $param);
100                 break;
101             case 5:
102                 //todo 干垃圾包括什么
103                 $patt = ['包括哪些', '包括什么', '都有什么', '有什么', '有哪些', '什么是', '是什么', '包括', '哪些', '什么', ];
104                 $keyword = str_replace($patt, '', $param);
105                 break;
106             case 6:
107                 //todo {garbage}和{garbage}是一种垃圾么
108                 $patt = ['一种垃圾', '垃圾', '一种', '属不属于', '属于', '不', '是', '算', '吗', '么', '嘛'];
109                 $new_param = str_replace($patt, '', $param);  // 去掉上面的字词,剩下{garbage}和{garbage}
110                 $pos = mb_strpos($new_param, '和');
111                 $keywordOne = mb_substr($new_param, 0, $pos);  //以“和”来分隔第一个垃圾关键词和第二个垃圾关键词
112                 $keywordTwo = mb_substr($new_param, $pos+1);  //不从“和”开始截取
113                 break;
114         }
115         //不同的情况查询不同的数据库
116         switch($status){
117             case 0:
118             case 1:
119             case 2:
120             case 3:
121                 //TODO 查询数据库
122                 $where['r.name'] = $keyword;
123                 $result = RecycleModel::find()
124                     ->alias('r')
125                     ->leftJoin(['c'=>RecycleCateModel::tableName()], 'r.category_id = c.id')
126                     ->select('c.name as cat_name, c.code, c.des as desc, c.req as handle')
127                     ->where($where)
128                     ->asArray()
129                     ->one();
130                 break;
131             case 4:
132             case 5:
133                 //TODO 针对查询干垃圾往哪扔查询数据库
134                 $result = RecycleCateModel::find()->select(' inc, des, req')->where(['like', 'name', $keyword])->asArray()->one();
135                 break;
136             case 6:
137                 //TODO 同一个字段按两个条件查询使用 where in
138                 $where = ['in', 'r.name', [$keywordOne, $keywordTwo]];
139                 $result = RecycleModel::find()
140                     ->alias('r')
141                     ->leftJoin(['c'=>RecycleCateModel::tableName()], 'r.category_id = c.id')
142                     ->select('c.name as cat_name, c.code')
143                     ->where($where)
144                     ->asArray()
145                     ->all();
146                 break;
147         }
148
149         if(!$result){
150             return [
151                 'code' => 4002,
152                 'msg' => '对不起,暂未查询到有关【'.$keyword.'】的信息',
153             ];
154         }
155         //不同的输入,返回不同的结果
156         switch($status){
157             case 0:
158                 //todo 结果返回是什么垃圾
159                 return [
160                     'code' => 0,
161                     'msg' => 'success',
162                     'result' => $keyword.'是'.$result['cat_name'],
163                 ];
164             case 1:
165                 //todo 结果返回处理的方法
166                 return [
167                     'code' => 0,
168                     'msg' => 'success',
169                     'result' => $keyword.'的处理方法是:'.$result['handle'],
170                 ];
171             case 2:
172                 //todo 结果返回 “是”或 “否”
173                 if(strpos($result['cat_name'], $cate) !== false){
174                     return [
175                         'code' => 0,
176                         'msg' => 'success',
177                         'result' => '是',
178                     ];
179                 }
180                 return [
181                     'code' => 0,
182                     'msg' => 'success',
183                     'result' => '否',
184                 ];
185             case 3:
186                 //todo 结果返回 “是xx垃圾” 或 “都不是”
187                 if(strpos($result['cat_name'], $cate_one) !== false || strpos($result['cat_name'], $cate_two) !== false){
188                     return [
189                         'code' => 0,
190                         'msg' => 'success',
191                         'result' => $keyword.'是'.$result['cat_name'],
192                     ];
193                 }else{
194                     return [
195                         'code' => 0,
196                         'msg' => 'success',
197                         'result' => '都不是',
198                     ];
199                 }
200             case 4:
201                 //todo
202                 return [
203                     'code' => 0,
204                     'msg' => 'success',
205                     'result' => $keyword.'的处理方法是:'.$result['req'],
206                 ];
207             case 5:
208                 //todo
209                 return [
210                     'code' => 0,
211                     'msg' => 'success',
212                     'result' => $keyword.'包括:'.$result['inc'],
213                 ];
214             case 6:
215                 //todo
216                 if(count($result) < 2){
217                     //说明至少有一个关键词没有查询到结果, 肯定就不能算一种垃圾
218                     return [
219                         'code' => 0,
220                         'msg' => 'success',
221                         'result' => $keywordOne.'和'.$keywordTwo.'不是一种垃圾',
222                     ];
223                 }
224                 if($result[0]['code'] != $result[1]['code']){
225                     return [
226                         'code' => 0,
227                         'msg' => 'success',
228                         'result' => $keywordOne.'和'.$keywordTwo.'不是一种垃圾',
229                     ];
230                 }
231                 return [
232                     'code' => 0,
233                     'msg' => 'success',
234                     'result' => $keywordOne.'和'.$keywordTwo.'是一种垃圾',
235                 ];
236         }
237     }
View Code

yii写的垃圾分类接口

01-05 02:19