package com.template.controller;
import com.seewo.open.sdk.DefaultSeewoClient;
import com.seewo.open.sdk.SeewoClient;
import com.seewo.open.sdk.auth.Account;
import com.template.api.SmartVisitorControllerAPI;
import com.template.common.utils.TimeExchange;
import com.template.common.utils.paramUtils;
import com.template.config.CosConfig;
import com.template.config.SeewoConfig;
import com.template.model.enumModel.eApproveStatu;
import com.template.model.enumModel.eExamineStatu;
import com.template.model.enumModel.eVisitorType;
import com.template.model.pojo.*;
import com.template.model.request.otherAppointmentRequest;
import com.template.model.request.parentsAppointmentRequest;
import com.template.model.result.CommonResult;
import com.template.model.result.PageUtils;
import com.template.model.vo.AffiliateUserVo;
import com.template.model.vo.VisitorPageVo;
import com.template.services.SmartUserService;
import com.template.services.SmartVisitorService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author ceshi
* @since 2023-12-04
*/
@RestController
public class SmartVisitorController implements SmartVisitorControllerAPI {
@Autowired
private SmartVisitorService smartVisitorService;
@Autowired
private SmartUserService smartUserService;
@Resource
private SeewoConfig seewoConfig;
/**
* 新增访客预约
*
* @param smartApply 访客预约数据
* @param bindingResult
* @return
*/
@Override
public CommonResult insertSmartVisitor(SmartVisitor smartApply, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
int result = smartVisitorService.insertSmartVisitor(smartApply);
return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
}
/**
* 更新访客预约
*
* @param sa 访客预约数据
* @param bindingResult
* @return
*/
@Override
public CommonResult updateSmartVisitorById(SmartVisitor sa, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
int result = smartVisitorService.updateSmartVisitor(sa);
return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
}
/**
* 访客预约分页数据查询
*
* @param currentPage 当前页数
* @param pageCount 一页数据条数
* @param name 查询名称
* @return
*/
@Override
public CommonResult queryPageSmartVisitor(int currentPage, int pageCount, String name) {
PageUtils result = smartVisitorService.queryPageSmartVisitors(currentPage, pageCount, name);
return CommonResult.ok(result);
}
@Override
public CommonResult deleteSmartVisitorById(int id) {
SmartVisitor data = smartVisitorService.getSmartById(id);
if (data == null) {
return CommonResult.fail("当前数据不存在,删除失败!");
}
int result = smartVisitorService.deleteSmartVisitorById(id);
return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
}
@Override
public CommonResult parentsAppointment(parentsAppointmentRequest par, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
//参数判断 判断受访学生信息是否为空
if (par.getStudents() == null) {
return CommonResult.fail("请选择受访学生");
}
if (par.getStudents().size() <= 0) {
return CommonResult.fail("请选择受访学生");
}
//根据用户ID查询相关信息
SmartUser su = smartUserService.getSmartById(par.getUserId());
if (su == null) {
return CommonResult.fail("当前用户信息不合法,无法进行预约!");
}
List svs = new ArrayList<>();
for (AffiliateUserVo student : par.getStudents()) {
SmartVisitor sv = new SmartVisitor();
sv.setUserId(par.getUserId());
sv.setUserName(su.getName());
sv.setUserPhone(su.getPhone());
sv.setUserNumber(su.getIdCard());
sv.setPeerNum(par.getPeerNum());
//sv.setCarNum(par.getCarNum());家长预约不能填写车牌号
sv.setVisitReason(par.getVisitReason());
sv.setStatu(eApproveStatu.Audit.getValue());
sv.setVisitorTime(TimeExchange.StringToDate(par.getVisitorTime(), "yyyy-MM-dd HH:mm:ss"));
sv.setVisitorDeadline(TimeExchange.StringToDate(TimeExchange.TimeDesH(sv.getVisitorTime(),4),"yyyy-MM-dd HH:mm:ss"));
sv.setRespondent(student.getId());
sv.setResponcode(student.getCardNo());
sv.setRespondentName(student.getName());
//将第一个受访学生的部门ID带过去
sv.setDepartmentId(student.getDepartmentId());
sv.setVisitorType(eVisitorType.Parent.getValue());
svs.add(sv);
}
boolean result = smartVisitorService.insertVisitorBatch(svs);
return result ? CommonResult.ok("预约成功,等待审批通过") : CommonResult.fail("预约失败");
}
@Override
public CommonResult otherAppointment(otherAppointmentRequest oar, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
//根据用户ID查询相关信息
SmartUser su = smartUserService.getSmartById(oar.getUserId());
if (su == null) {
return CommonResult.fail("当前用户信息不合法,无法进行预约!");
}
SmartVisitor sv = new SmartVisitor();
sv.setUserId(oar.getUserId());
sv.setUserName(su.getName());
sv.setUserPhone(su.getPhone());
sv.setUserNumber(su.getIdCard());
sv.setPeerNum(oar.getPeerNum());
sv.setCarNum(oar.getCarNum());
sv.setVisitReason(oar.getVisitReason());
sv.setStatu(eApproveStatu.Audit.getValue());
sv.setVisitorTime(TimeExchange.StringToDate(oar.getVisitorTime(), "yyyy-MM-dd HH:mm:ss"));
sv.setVisitorDeadline(TimeExchange.StringToDate(TimeExchange.getEndOfDayStr(new Date()),"yyyy-MM-dd HH:mm:ss"));
sv.setRespondentName(oar.getRespondentName());
sv.setRespondentPhone(oar.getRespondentPhone());
sv.setVisitorType(eVisitorType.Other.getValue());
int result = smartVisitorService.insertSmartVisitor(sv);
return result > 0 ? CommonResult.ok("预约成功,等待审批通过") : CommonResult.ok("预约失败");
}
@Override
public CommonResult appointmentPageRecord(int currentPage, int pageCount, int userId, int type) {
PageUtils result = smartVisitorService.smartVisitorPageByUserId(currentPage, pageCount, userId, type);
return CommonResult.ok(result);
}
/**
* 访客记录审核
*
* @param id 数据ID
* @param type 操作类型:
* 同意,并推送:1
* 拒绝:2
* @return
*/
@Override
@Transactional(rollbackFor = {Exception.class})
public CommonResult examineRecord(int id, int type) throws Exception {
SmartVisitor visitor = smartVisitorService.getSmartById(id);
if (visitor == null) {
return CommonResult.fail("访客记录已失效,审核失败!");
}
try{
if (type == eExamineStatu.Agree.getValue()) {
visitor.setStatu(eApproveStatu.Pushed.getValue());
//家长访客预约才需要将消息推送到希沃电子班牌
if (visitor.getVisitorType().intValue() == eVisitorType.Parent.getValue()) {
String content = visitor.getRespondentName() + "你的家长将于" + TimeExchange.chineseDateTime(visitor.getVisitorTime()) + "到校!";
//将预约信息推送到希沃班牌
CommonResult seewo = pushInfo(visitor.getUserPhone(), visitor.getResponcode(), content);
if(!seewo.getCode().equals("200")){
throw new Exception("审核失败");
}
}
//将数据写入门禁系统逻辑
else{
//家长不能使用车牌系统 其他的可以使用车牌逻辑
}
} else if (type == eExamineStatu.Refused.getValue()) {
visitor.setStatu(eApproveStatu.Refused.getValue());
}
int result = smartVisitorService.updateSmartVisitor(visitor);
if(result <= 0){
throw new Exception("审核失败");
}
}catch (Exception e){
throw new Exception("审核失败");
}
return CommonResult.ok("审核成功");
}
/**
* 将预约信息推送到希沃电子班牌
*
* @param parentPhone 预约手机号(家长手机号 在希沃中学生会和家长手机号绑定 可以绑定多个家长)
* @param studentCode 学生编号 希沃中的学生编号和万载系统中的一致
* @param content 消息内容
* @return
*/
public CommonResult pushInfo(String parentPhone, String studentCode, String content) {
//初始化客户端
SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
HomeSchoolServiceSendNoteToKidParam param = new HomeSchoolServiceSendNoteToKidParam();
//响应体,MimeType为 application/json
HomeSchoolServiceSendNoteToKidParam.RequestBody requestBody = HomeSchoolServiceSendNoteToKidParam.RequestBody.builder()
.build();
param.setRequestBody(requestBody);
//query
HomeSchoolServiceSendNoteToKidParam.Query query = HomeSchoolServiceSendNoteToKidParam.Query.builder()
.appId(seewoConfig.getAppId())
.schoolUid(seewoConfig.getSchoolId())
.senderPhone(parentPhone)
.studentCode(studentCode)
.type(1)
.content(content)
.autoRegister(0)
.build();
requestBody.setQuery(query);
param.setRequestBody(requestBody);
HomeSchoolServiceSendNoteToKidRequest request = new HomeSchoolServiceSendNoteToKidRequest(param);
System.out.println("入参:" + request);
//如果想要调用沙箱环境,请通过设置 request 对象的 serverUrl 属性,如:
//request.setServerUrl("https://openapi.test.seewo.com")
//执行请求,如果想获取到com.seewo.open.sdk.HttpResponse对象,请调用 seewoClient.execute 方法
HomeSchoolServiceSendNoteToKidResult result = seewoClient.invoke(request);
System.out.println("出参:" + result);
if(!result.getMessage().equals("success")){
CommonResult.fail();
}
return CommonResult.ok();
}
}