1、实际情景:
实际工作中遇到一个用户反馈管理的功能开发,其中用户提交一个反馈单,管理员可以回复用户的反馈单,用户也可以回复管理员回复的消息,每次回复都会生成一条对应反馈单的回复单记录,即一条反馈单对应多条回复单。当管理员回复之后如果用户10天之内没有做出回复则关闭这条反馈单。
2、思路:
先得到所有未关闭的反馈单id,然后根据这个id找出每一个id对应的最新的回复信息,判断这条回复记录时候是管理员回复而且时间大一10天,如果是,将这条反馈单id存储到数组中,最后数组里存储的就是所有需要改变状态的反馈单的反馈单id。
3、代码实现:
public static function webCloseFeedback()
{
//得到所有未关闭的反馈单id,并将id对应的值存储在数组中
$feedback_ids=UserFeedbackRecord::find()
->select(['feedback_sheet_id'])
->where(['feedback_state'=>[1,2]])
->orderBy('feedback_sheet_id')
->asArray()
->all();
$arry1=array();
for($i=0;$i<count($feedback_ids);$i++){
array_push($arry1,$feedback_ids[$i]['feedback_sheet_id']);
}
//根据回复时间降序查询出所有未关闭反馈的回复记录
$last_reply_msg=ReplyMessage::find()
->where(['feedback_sheet_id'=>$arry1])
->orderBy('reply_time desc')
->asArray()
->all();
//判断是否满足关闭条件,如果满足,将反馈单id存储到数组中
$change_ids=array();
foreach ($arry1 as $value){
foreach ($last_reply_msg as $val){
if($val['feedback_sheet_id']==$value){
$current=strtotime(date("y-m-d h:i:s"));
$max=$val['reply_time'];
$maxtime=strtotime($max);
$day=ceil(($current-$maxtime)/86400);
if($day>10&&$val['reply_people']==0){
array_push($change_ids,$value);
}
break;
}
}
}
//最后更改反馈单状态
UserFeedbackRecord::updateAll(['feedback_state'=>3],['feedback_sheet_id'=>$change_ids]);
}
4、注意:
不应该将查询反馈单对应的最后一条回复记录放在循环中,这样会大大增加数据库的压力。