| @@ -70,7 +70,7 @@ public class DmRecognizedRecordsPo extends TBaseEntity { | |||
| /** 识别时间 */ | |||
| @Excel(name = "识别时间") | |||
| @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") | |||
| @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") | |||
| @JsonDeserialize(using = LocalDateTimeDeserializer.class) | |||
| @JsonSerialize(using = LocalDateTimeSerializer.class) | |||
| protected LocalDateTime recognizedTime; | |||
| @@ -54,10 +54,6 @@ public class TokenController { | |||
| @Autowired | |||
| private SysLoginService sysLoginService; | |||
| @Autowired | |||
| private RemoteSmsService smsService; | |||
| @Autowired | |||
| private RemoteSmsService remoteSmsService; | |||
| @@ -1,15 +1,37 @@ | |||
| package com.xueyi.system.staff.controller; | |||
| import cn.hutool.core.date.LocalDateTimeUtil; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||
| import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
| import com.xueyi.common.core.constant.basic.SqlConstants; | |||
| import com.xueyi.common.core.web.result.AjaxResult; | |||
| import com.xueyi.common.core.web.validate.V_A; | |||
| import com.xueyi.common.core.web.validate.V_E; | |||
| import com.xueyi.common.log.annotation.Log; | |||
| import com.xueyi.common.log.enums.BusinessType; | |||
| import com.xueyi.common.security.annotation.RequiresPermissions; | |||
| import com.xueyi.common.sms.configure.SmsProperties; | |||
| import com.xueyi.common.web.entity.controller.BaseController; | |||
| import com.xueyi.common.web.utils.MyDateUtils; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanExtPo; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmDigitalmanPo; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitRecordsPo; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.api.sms.domain.vo.SmsReqEntity; | |||
| import com.xueyi.system.api.sms.feign.RemoteSmsService; | |||
| import com.xueyi.system.api.staff.domain.po.DmStaffPo; | |||
| import com.xueyi.system.digitalmans.mapper.DmDigitalmanExtMapper; | |||
| import com.xueyi.system.digitalmans.mapper.DmDigitalmanMapper; | |||
| import com.xueyi.system.staff.domain.dto.DmVisitorSmsConfigDto; | |||
| import com.xueyi.system.staff.domain.po.DmVisitorSmsConfigPo; | |||
| import com.xueyi.system.staff.domain.query.DmVisitorSmsConfigQuery; | |||
| import com.xueyi.system.staff.mapper.DmStaffMapper; | |||
| import com.xueyi.system.staff.mapper.DmVisitRecordsMapper; | |||
| import com.xueyi.system.staff.mapper.DmVisitorSmsConfigMapper; | |||
| import com.xueyi.system.staff.mapper.DmVisitorsMapper; | |||
| import com.xueyi.system.staff.service.IDmVisitorSmsConfigService; | |||
| import com.xueyi.system.staff.service.impl.DmVisitRecordsServiceImpl; | |||
| import com.xueyi.system.staff.service.impl.DmVisitorSmsConfigServiceImpl; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.validation.annotation.Validated; | |||
| @@ -20,6 +42,7 @@ import org.springframework.web.bind.annotation.PostMapping; | |||
| import org.springframework.web.bind.annotation.PutMapping; | |||
| import org.springframework.web.bind.annotation.RequestBody; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestParam; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import java.io.Serializable; | |||
| @@ -37,6 +60,32 @@ public class DmVisitorSmsConfigController extends BaseController<DmVisitorSmsCon | |||
| @Autowired | |||
| private DmVisitorSmsConfigServiceImpl visitorSmsConfigService; | |||
| @Autowired | |||
| private RemoteSmsService smsService; | |||
| @Autowired | |||
| private DmVisitRecordsServiceImpl visitRecordsService; | |||
| @Autowired | |||
| private DmVisitRecordsMapper visitRecordsMapper; | |||
| @Autowired | |||
| private DmVisitorsMapper visitorsMapper; | |||
| @Autowired | |||
| private SmsProperties smsProperties; | |||
| @Autowired | |||
| private DmVisitorSmsConfigMapper visitorSmsConfigMapper; | |||
| @Autowired | |||
| private DmDigitalmanExtMapper digitalmanExtMapper; | |||
| @Autowired | |||
| private DmDigitalmanMapper digitalmanMapper; | |||
| @Autowired | |||
| private DmStaffMapper staffMapper; | |||
| /** 定义节点名称 */ | |||
| @Override | |||
| protected String getNodeName() { | |||
| @@ -105,6 +154,49 @@ public class DmVisitorSmsConfigController extends BaseController<DmVisitorSmsCon | |||
| return super.batchRemove(idList); | |||
| } | |||
| @GetMapping("/send-sms") | |||
| public AjaxResult sendVisitorSms(@RequestParam("visitRecordId") Long visitRecordId) { | |||
| if (null != visitRecordId) { | |||
| DmVisitRecordsPo po = visitRecordsMapper.selectById(visitRecordId); | |||
| if (null != po && null != po.getVisitorId()) { | |||
| DmVisitorsPo visitorsPo = visitorsMapper.selectById(po.getVisitorId()); | |||
| SmsReqEntity send = new SmsReqEntity(); | |||
| try { | |||
| if (null != visitorsPo && StringUtils.isNotEmpty(visitorsPo.getPhone())) { | |||
| DmVisitorSmsConfigPo dmVisitorSmsConfigPo = visitorSmsConfigMapper.selectOne(Wrappers.<DmVisitorSmsConfigPo>query().lambda().last(SqlConstants.LIMIT_ONE)); | |||
| DmDigitalmanPo dmDigitalmanPo = digitalmanMapper.selectByCode(digitalmanExtMapper.selectOne(Wrappers.<DmDigitalmanExtPo>query().lambda().last(SqlConstants.LIMIT_ONE)).getManCode()); | |||
| DmStaffPo staffPo = staffMapper.selectById(po.getUserId()); | |||
| JSONObject json = new JSONObject(); | |||
| String code = visitRecordsService.genVisitorCode(); | |||
| json.put("code", code); | |||
| json.put("nickName", visitorsPo.getName()); | |||
| json.put("robotName", dmDigitalmanPo.getName()); | |||
| json.put("dateTime", LocalDateTimeUtil.format(po.getVisitDate(), MyDateUtils.DEFAULT_DATE_PATTERN)); | |||
| json.put("companyName", dmVisitorSmsConfigPo!=null?dmVisitorSmsConfigPo.getCompanyName():""); | |||
| json.put("companyAddr", dmVisitorSmsConfigPo!=null?dmVisitorSmsConfigPo.getCompanyAddress():""); | |||
| json.put("receiverName", staffPo!=null?staffPo.getUserName():""); | |||
| json.put("receiverPhone", staffPo!=null?staffPo.getPhone():""); | |||
| json.put("parkInfo", dmVisitorSmsConfigPo!=null?dmVisitorSmsConfigPo.getParkPrompt():""); | |||
| //给访客发送短信 | |||
| send.setPhone(visitorsPo.getPhone()); | |||
| send.setTemplate(smsProperties.getVisitorTemplate()); | |||
| send.setDataMap(json.toJSONString()); | |||
| smsService.sendSms(send); | |||
| } | |||
| } catch (Exception e) { | |||
| e.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| return AjaxResult.success(); | |||
| } | |||
| /** | |||
| * 获取租户访客接待短信模板配置选择框列表 | |||
| */ | |||
| @@ -0,0 +1,25 @@ | |||
| package com.xueyi.system.staff.domain.dto; | |||
| import com.xueyi.system.staff.domain.po.DmVisitorOperateLogPo; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import java.io.Serial; | |||
| /** | |||
| * 租户访客接待短信模板配置 数据传输对象 | |||
| * | |||
| * @author xueyi | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class DmVisitorOperateLogDto extends DmVisitorOperateLogPo { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| public static final Integer BUSINESS_TYPE_CREATE = 1; | |||
| public static final Integer BUSINESS_TYPE_UPDATE = 2; | |||
| public static final Integer BUSINESS_TYPE_DELETE = 3; | |||
| public static final Integer BUSINESS_TYPE_OTHER = 0; | |||
| } | |||
| @@ -0,0 +1,64 @@ | |||
| package com.xueyi.system.staff.domain.po; | |||
| import com.baomidou.mybatisplus.annotation.OrderBy; | |||
| import com.baomidou.mybatisplus.annotation.TableName; | |||
| import com.fasterxml.jackson.annotation.JsonFormat; | |||
| import com.xueyi.common.core.annotation.Excel; | |||
| import com.xueyi.common.core.web.tenant.base.TBaseEntity; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import java.io.Serial; | |||
| import java.time.LocalDateTime; | |||
| /** | |||
| * 操作日志 持久化对象 | |||
| * | |||
| * @author xueyi | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| @TableName(value = "dm_visitor_operate_log",excludeProperty = {"name","sort","createBy","createTime","updateBy","updateTime","remark"}) | |||
| public class DmVisitorOperateLogPo extends TBaseEntity { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| /** 操作模块 */ | |||
| protected String title; | |||
| /** 业务类型(0其它 1新增 2修改 3删除) */ | |||
| protected Integer businessType; | |||
| /** 请求方法 */ | |||
| protected String method; | |||
| /** 请求方式 */ | |||
| protected String requestMethod; | |||
| protected Long visitorId; | |||
| /** 操作Id */ | |||
| protected Long userId; | |||
| /** 操作人员账号 */ | |||
| protected String userName; | |||
| /** 操作人员名称 */ | |||
| protected String userNick; | |||
| /** 请求参数 */ | |||
| protected String param; | |||
| /** 返回参数 */ | |||
| protected String jsonResult; | |||
| /** 操作时间 */ | |||
| @OrderBy(sort = 10) | |||
| @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") | |||
| @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") | |||
| protected LocalDateTime operateTime; | |||
| } | |||
| @@ -0,0 +1,21 @@ | |||
| package com.xueyi.system.staff.domain.query; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.staff.domain.po.DmVisitorOperateLogPo; | |||
| import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import java.io.Serial; | |||
| /** | |||
| * 访客 数据查询对象 | |||
| * | |||
| * @author xueyi | |||
| */ | |||
| @Data | |||
| @EqualsAndHashCode(callSuper = true) | |||
| public class DmVisitorOperateLogQuery extends DmVisitorOperateLogPo { | |||
| @Serial | |||
| private static final long serialVersionUID = 1L; | |||
| } | |||
| @@ -26,15 +26,15 @@ class VisitRecordGraphQLMutationResolver implements GraphQLMutationResolver { | |||
| private DmVisitRecordsConverter converter; | |||
| public boolean createVisitRecord(DmVisitRecordsPo input){ | |||
| public boolean createVisitRecord(DmVisitRecordsPo input, Long staffId){ | |||
| return mapper.insert(input) > 0; | |||
| } | |||
| public boolean updateVisitRecord(DmVisitRecordsPo input){ | |||
| public boolean updateVisitRecord(DmVisitRecordsPo input, Long staffId){ | |||
| return mapper.updateById(input) > 0; | |||
| } | |||
| public Boolean deleteVisitRecord(Long id){ | |||
| public Boolean deleteVisitRecord(Long id, Long staffId){ | |||
| return mapper.deleteById(id) > 0; | |||
| } | |||
| } | |||
| @@ -43,15 +43,15 @@ class VisitorGraphQLMutationResolver implements GraphQLMutationResolver { | |||
| return po; | |||
| } | |||
| public boolean updateVisitor(DmVisitorsPo po){ | |||
| public boolean updateVisitor(DmVisitorsPo po, Long staffId){ | |||
| return mapper.updateOne(initPo(po)) > 0; | |||
| } | |||
| public boolean createVisitor(DmVisitorsPo po){ | |||
| public boolean createVisitor(DmVisitorsPo po, Long staffId){ | |||
| return mapper.insert(initPo(po)) > 0; | |||
| } | |||
| public Boolean deleteVisitor(Long id){ | |||
| public Boolean deleteVisitor(Long id, Long staffId){ | |||
| return mapper.deleteById(id) > 0; | |||
| } | |||
| } | |||
| @@ -0,0 +1,58 @@ | |||
| package com.xueyi.system.staff.graphql; | |||
| import cn.hutool.core.date.LocalDateTimeUtil; | |||
| import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||
| import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||
| import com.xueyi.common.web.utils.MyDateUtils; | |||
| import com.xueyi.system.staff.domain.po.DmVisitorOperateLogPo; | |||
| import com.xueyi.system.staff.mapper.DmVisitorOperateLogMapper; | |||
| import graphql.kickstart.tools.GraphQLQueryResolver; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import java.time.LocalDate; | |||
| import java.util.List; | |||
| /* | |||
| * @author yk | |||
| * @description | |||
| * @date 2023-12-25 19:55 | |||
| */ | |||
| @Component | |||
| class VisitorLogsGraphQLQueryResolver implements GraphQLQueryResolver { | |||
| @Autowired | |||
| private DmVisitorOperateLogMapper mapper; | |||
| public DmVisitorOperateLogPo visitorLog(Long id) { | |||
| return mapper.selectById(id); | |||
| } | |||
| public List<DmVisitorOperateLogPo> visitorLogs(String userName, Long userId, Long visitorId, Integer businessType, LocalDate startDate, LocalDate endDate){ | |||
| QueryWrapper<DmVisitorOperateLogPo> query = new QueryWrapper<>(); | |||
| if (StringUtils.isNotEmpty(userName)) { | |||
| query.like("user_name", userName); | |||
| } | |||
| if (null != userId) { | |||
| query.eq("user_id", userId); | |||
| } | |||
| if (null != visitorId) { | |||
| query.eq("visitor_id", visitorId); | |||
| } | |||
| if (null != businessType) { | |||
| query.eq("business_type", businessType); | |||
| } | |||
| if (null != startDate && null != endDate){ | |||
| query.between("operate_time", LocalDateTimeUtil.format(startDate, MyDateUtils.DEFAULT_DATE_PATTERN),LocalDateTimeUtil.format(endDate, MyDateUtils.DEFAULT_DATE_PATTERN)); | |||
| } | |||
| return mapper.selectList(query); | |||
| } | |||
| } | |||
| @@ -1,89 +0,0 @@ | |||
| package com.xueyi.system.staff.graphql.config; | |||
| import graphql.ExecutionResult; | |||
| import graphql.GraphQL; | |||
| import graphql.GraphQLContext; | |||
| import graphql.execution.instrumentation.ExecutionStrategyInstrumentationContext; | |||
| import graphql.execution.instrumentation.Instrumentation; | |||
| import graphql.execution.instrumentation.InstrumentationContext; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; | |||
| import graphql.kickstart.autoconfigure.tools.GraphQLJavaToolsAutoConfiguration; | |||
| import graphql.kickstart.tools.GraphQLResolver; | |||
| import graphql.kickstart.tools.SchemaParser; | |||
| import graphql.language.Document; | |||
| import graphql.schema.GraphQLSchema; | |||
| import graphql.validation.ValidationError; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.context.annotation.Bean; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.context.annotation.Import; | |||
| import java.util.List; | |||
| /** | |||
| * @author yk | |||
| * @description | |||
| * @date 2024-01-04 22:03 | |||
| */ | |||
| @Configuration | |||
| @Import(GraphQLJavaToolsAutoConfiguration.class) | |||
| public class GraphQLConfig { | |||
| @Bean | |||
| public GraphQL graphQL(List<GraphQLResolver<?>> resolvers, List<SchemaParser> schemaParsers, GraphQLSchema graphQLSchema) { | |||
| return GraphQL.newGraphQL(graphQLSchema) | |||
| .instrumentation(new SimpleAuthInstrumentation()) | |||
| .build(); | |||
| } | |||
| private static class SimpleAuthInstrumentation implements Instrumentation { | |||
| Logger logger = LoggerFactory.getLogger(SimpleAuthInstrumentation.class); | |||
| @Override | |||
| public InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<ExecutionResult> beginExecuteOperation(InstrumentationExecuteOperationParameters parameters) { | |||
| GraphQLContext context = parameters.getExecutionContext().getGraphQLContext(); | |||
| // 从上下文中获取请求头中的token | |||
| String token = context.get("Authorization"); | |||
| logger.error("token: {}", token); | |||
| return null; | |||
| } | |||
| @Override | |||
| public ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<ExecutionResult> beginField(InstrumentationFieldParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters) { | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| package com.xueyi.system.staff.mapper; | |||
| import com.xueyi.common.datasource.annotation.Isolate; | |||
| import com.xueyi.common.web.entity.mapper.BaseMapper; | |||
| import com.xueyi.system.staff.domain.dto.DmVisitorOperateLogDto; | |||
| import com.xueyi.system.staff.domain.po.DmVisitorOperateLogPo; | |||
| import com.xueyi.system.staff.domain.query.DmVisitorOperateLogQuery; | |||
| @Isolate | |||
| public interface DmVisitorOperateLogMapper extends BaseMapper<DmVisitorOperateLogQuery, DmVisitorOperateLogDto, DmVisitorOperateLogPo> { | |||
| } | |||
| @@ -16,6 +16,7 @@ type PassRecord { | |||
| userName: String | |||
| userId: ID | |||
| faceUrl: String | |||
| recognizedTime: DateTime | |||
| recognizedTime: String | |||
| createTime: Date | |||
| type: Int | |||
| } | |||
| @@ -1,6 +1,7 @@ | |||
| scalar Long | |||
| scalar DateTime | |||
| scalar Date | |||
| scalar Time | |||
| type Query { | |||
| @@ -21,12 +21,17 @@ input VisitRecordInput { | |||
| extend type Mutation { | |||
| createVisitRecord( | |||
| input:VisitRecordInput! | |||
| staffId: Long! | |||
| ): Boolean | |||
| updateVisitRecord( | |||
| input:VisitRecordInput! | |||
| staffId: Long! | |||
| ): Boolean | |||
| deleteVisitRecord(id:Long): Boolean | |||
| deleteVisitRecord( | |||
| id:Long! | |||
| staffId: Long! | |||
| ): Boolean | |||
| } | |||
| type VisitRecord { | |||
| @@ -24,13 +24,18 @@ input VisitorInput { | |||
| extend type Mutation { | |||
| createVisitor( | |||
| input: VisitorInput! | |||
| staffId: Long! | |||
| ): Boolean | |||
| updateVisitor( | |||
| input: VisitorInput! | |||
| staffId: Long! | |||
| ): Boolean | |||
| deleteVisitor(id: Long!): Boolean | |||
| deleteVisitor( | |||
| id: Long!, | |||
| staffId: Long! | |||
| ): Boolean | |||
| } | |||
| type Visitor { | |||
| @@ -0,0 +1,25 @@ | |||
| extend type Query { | |||
| visitorLogs( | |||
| userName:String | |||
| userId:ID | |||
| visitorId:ID | |||
| businessType:Int | |||
| startDate:Date | |||
| endDate:Date | |||
| ): [VisitorLog!] | |||
| visitorLog(id:Long!): VisitorLog | |||
| } | |||
| type VisitorLog { | |||
| id: ID | |||
| businessType: Int | |||
| method: String | |||
| visitorId: ID | |||
| userId: ID | |||
| userName: String | |||
| param: String | |||
| jsonResult: String | |||
| operateTime: String | |||
| } | |||