| @@ -26,4 +26,6 @@ public class DmVisitRecordsDto extends DmVisitRecordsPo { | |||
| private String visitorName; | |||
| private DmVisitorsDto visitor; | |||
| } | |||
| @@ -7,6 +7,7 @@ import lombok.Data; | |||
| import lombok.EqualsAndHashCode; | |||
| import java.io.Serial; | |||
| import java.time.LocalDate; | |||
| import java.util.Date; | |||
| import static com.xueyi.common.core.constant.basic.EntityConstants.NAME; | |||
| @@ -53,7 +54,7 @@ public class DmVisitRecordsPo extends TBaseEntity { | |||
| /** 邀约访问日期 */ | |||
| @Excel(name = "邀约访问日期") | |||
| protected Date visitDate; | |||
| protected LocalDate visitDate; | |||
| /** 邀约访问时间 */ | |||
| @Excel(name = "邀约访问时间") | |||
| @@ -3,6 +3,8 @@ package com.xueyi.system.api.staff.domain.dto; | |||
| import com.alibaba.fastjson2.JSONObject; | |||
| import lombok.Data; | |||
| import java.util.Date; | |||
| /** | |||
| * 访客及数据的 数据传输对象 | |||
| * | |||
| @@ -36,6 +38,9 @@ public class DmVisitCommonDto { | |||
| private String visitorBase64Img; | |||
| public String toSmsJson(String code, String name, String companyName, String companyAddress, String parkInfo){ | |||
| JSONObject json = new JSONObject(); | |||
| json.put("code", code); | |||
| @@ -0,0 +1,30 @@ | |||
| package com.xueyi.system.api.staff.domain.dto; | |||
| import com.alibaba.fastjson2.JSON; | |||
| import lombok.Data; | |||
| import java.util.Date; | |||
| /** | |||
| * 访客及数据的 数据传输对象 | |||
| * | |||
| * @author xueyi | |||
| */ | |||
| @Data | |||
| public class GraphqlVisitRecordInput { | |||
| private String name; | |||
| private String nickname; | |||
| private String phone; | |||
| private String visitorCompany; | |||
| private Boolean isVip; | |||
| private Boolean isVital; | |||
| private Date visitDate; | |||
| @Override | |||
| public String toString() { | |||
| return JSON.toJSONString(this); | |||
| } | |||
| } | |||
| @@ -1,5 +1,6 @@ | |||
| package com.xueyi.system.staff.controller.api; | |||
| import cn.hutool.core.date.LocalDateTimeUtil; | |||
| import cn.hutool.core.util.ObjectUtil; | |||
| import com.alibaba.fastjson.JSONArray; | |||
| import com.alibaba.fastjson.JSONObject; | |||
| @@ -57,6 +58,7 @@ import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RequestParam; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| import java.time.LocalDate; | |||
| import java.util.ArrayList; | |||
| import java.util.Date; | |||
| import java.util.List; | |||
| @@ -217,7 +219,7 @@ public class DmVisitorInnerApiController extends BaseApiController { | |||
| visitRecords.setDeptId(emp.getDeptId()); | |||
| visitRecords.setVisitorId(v.getId()); | |||
| if (StringUtils.isNotEmpty(commonDto.getVisitDate())) { | |||
| visitRecords.setVisitDate(DateUtils.parseStrToDate(commonDto.getVisitDate(), "yyyy-MM-dd")); | |||
| visitRecords.setVisitDate(LocalDateTimeUtil.of(DateUtils.parseStrToDate(commonDto.getVisitDate(), "yyyy-MM-dd")).toLocalDate()); | |||
| } | |||
| visitRecords.setUserId(commonDto.getEmpId()); | |||
| visitRecords.setRecordStatus(VisitRecordStatus.getRecordStatusStart()); | |||
| @@ -323,7 +325,7 @@ public class DmVisitorInnerApiController extends BaseApiController { | |||
| d.setVisitorName(visitorsPo.getName()); | |||
| } | |||
| if (null != item.getVisitDate()) { | |||
| d.setVisitDateStr(DateUtils.formatDate(item.getVisitDate(), "yyyy-MM-dd")); | |||
| d.setVisitDateStr(LocalDateTimeUtil.format(item.getVisitDate(), "yyyy-MM-dd")); | |||
| } | |||
| dtos.add(d); | |||
| }); | |||
| @@ -353,7 +355,7 @@ public class DmVisitorInnerApiController extends BaseApiController { | |||
| d.setVisitorName(visitorsPo.getName()); | |||
| } | |||
| if (null != item.getVisitDate()) { | |||
| d.setVisitDateStr(DateUtils.formatDate(item.getVisitDate(), "yyyy-MM-dd")); | |||
| d.setVisitDateStr(LocalDateTimeUtil.format(item.getVisitDate(), "yyyy-MM-dd")); | |||
| } | |||
| dtos.add(d); | |||
| } | |||
| @@ -0,0 +1,53 @@ | |||
| package com.xueyi.system.staff.graphql; | |||
| import com.alibaba.fastjson2.JSONObject; | |||
| import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A; | |||
| import com.xueyi.common.core.utils.core.IdUtil; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitRecordsPo; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.api.staff.domain.dto.DmVisitCommonDto; | |||
| import com.xueyi.system.api.staff.domain.dto.GraphqlVisitRecordInput; | |||
| import com.xueyi.system.staff.domain.model.DmVisitRecordsConverter; | |||
| import com.xueyi.system.staff.domain.model.DmVisitorsConverter; | |||
| import com.xueyi.system.staff.mapper.DmVisitRecordsMapper; | |||
| import com.xueyi.system.staff.mapper.DmVisitorsMapper; | |||
| import graphql.kickstart.tools.GraphQLMutationResolver; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.Date; | |||
| /* | |||
| * @author yk | |||
| * @description | |||
| * @date 2023-12-25 19:55 | |||
| */ | |||
| @Component | |||
| class VisitRecordGraphQLMutationResolver implements GraphQLMutationResolver { | |||
| @Autowired | |||
| private DmVisitRecordsMapper mapper; | |||
| @Autowired | |||
| private DmVisitorsMapper visitorsMapper; | |||
| @Autowired | |||
| private DmVisitRecordsConverter converter; | |||
| public boolean saveVisitRecord(GraphqlVisitRecordInput input){ | |||
| DmVisitorsPo po = JSONObject.parseObject(input.toString(), DmVisitorsPo.class); | |||
| Long id = IdUtil.getSnowflakeNextId(); | |||
| po.setId(id); | |||
| visitorsMapper.insert(po); | |||
| DmVisitRecordsPo visitRecordsPo = JSONObject.parseObject(input.toString(), DmVisitRecordsPo.class); | |||
| visitRecordsPo.setVisitorId(id); | |||
| return mapper.insert(visitRecordsPo) > 0; | |||
| } | |||
| public Boolean deleteVisitRecord(Long id){ | |||
| return mapper.deleteById(id) > 0; | |||
| } | |||
| } | |||
| @@ -0,0 +1,54 @@ | |||
| package com.xueyi.system.staff.graphql; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmVisitRecordsDto; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.staff.domain.model.DmVisitRecordsConverter; | |||
| import com.xueyi.system.staff.domain.model.DmVisitorsConverter; | |||
| import com.xueyi.system.staff.mapper.DmVisitRecordsMapper; | |||
| import com.xueyi.system.staff.mapper.DmVisitorsMapper; | |||
| import graphql.kickstart.tools.GraphQLQueryResolver; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.List; | |||
| import java.util.stream.Collectors; | |||
| /* | |||
| * @author yk | |||
| * @description | |||
| * @date 2023-12-25 19:55 | |||
| */ | |||
| @Component | |||
| class VisitRecordsGraphQLQueryResolver implements GraphQLQueryResolver { | |||
| @Autowired | |||
| private DmVisitRecordsMapper mapper; | |||
| @Autowired | |||
| private DmVisitorsMapper visitorsMapper; | |||
| @Autowired | |||
| private DmVisitRecordsConverter converter; | |||
| @Autowired | |||
| private DmVisitorsConverter visitorsConverter; | |||
| // public boolean saveVisitRecord(String phone, String name){ | |||
| // return true; | |||
| // } | |||
| public DmVisitRecordsDto visitRecord(Long id) { | |||
| return converter.mapperDto(mapper.selectById(id)); | |||
| } | |||
| public List<DmVisitRecordsDto> visitRecords(String receiverName, String receiverPhone){ | |||
| return mapper.selectList(null).stream().map( | |||
| t -> { | |||
| DmVisitorsPo po = visitorsMapper.selectById(t.getVisitorId()); | |||
| DmVisitRecordsDto dto = converter.mapperDto(t); | |||
| dto.setVisitor(visitorsConverter.mapperDto(po)); | |||
| return dto; | |||
| } | |||
| ).collect(Collectors.toList()); | |||
| } | |||
| } | |||
| @@ -26,16 +26,17 @@ class VisitorGraphQLMutationResolver implements GraphQLMutationResolver { | |||
| @Autowired | |||
| private DmVisitorsConverter converter; | |||
| public Boolean update(Long id, String phone, String name, String nickName){ | |||
| DmVisitorsPo dto = mapper.selectById(id); | |||
| if (dto == null) return null; | |||
| public boolean saveVisitor( String name, String nickname, String phone, Integer type){ | |||
| DmVisitorsPo dto =new DmVisitorsPo(); | |||
| dto.setPhone(phone); | |||
| dto.setNickname(nickName); | |||
| dto.setNickname(nickname); | |||
| dto.setName(name); | |||
| dto.setType(type.longValue()); | |||
| return mapper.updateById(dto) > 0; | |||
| } | |||
| public Boolean delete(Long id){ | |||
| public Boolean deleteVisitor(Long id){ | |||
| return mapper.deleteById(id) > 0; | |||
| } | |||
| } | |||
| @@ -3,6 +3,7 @@ package com.xueyi.system.staff.graphql; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.staff.domain.model.DmVisitorsConverter; | |||
| import com.xueyi.system.staff.domain.query.DmVisitorsQuery; | |||
| import com.xueyi.system.staff.mapper.DmVisitorsMapper; | |||
| import graphql.kickstart.tools.GraphQLQueryResolver; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| @@ -25,11 +26,11 @@ class VisitorGraphQLQueryResolver implements GraphQLQueryResolver { | |||
| @Autowired | |||
| private DmVisitorsConverter converter; | |||
| public DmVisitorsDto selectOne(Long id){ | |||
| public DmVisitorsDto visitor(Long id){ | |||
| return converter.mapperDto(mapper.selectById(id)); | |||
| } | |||
| public List<DmVisitorsDto> list(){ | |||
| public List<DmVisitorsDto> visitors(Long id, String name, Integer type, String phone){ | |||
| return mapper.selectList(null).stream().map(t->converter.mapperDto(t)).collect(Collectors.toList()); | |||
| } | |||
| } | |||
| @@ -1,8 +1,30 @@ | |||
| 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.web.servlet.config.annotation.CorsRegistry; | |||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||
| import org.springframework.context.annotation.Import; | |||
| import java.util.List; | |||
| /** | |||
| * @author yk | |||
| @@ -10,10 +32,58 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | |||
| * @date 2024-01-04 22:03 | |||
| */ | |||
| @Configuration | |||
| public class GraphQLConfig implements WebMvcConfigurer { | |||
| @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 void addCorsMappings(CorsRegistry registry) { | |||
| registry.addMapping("/graphql").allowedOrigins("*"); | |||
| @Override | |||
| public InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters) { | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,12 +1,10 @@ | |||
| scalar Long | |||
| scalar DateTime | |||
| scalar Date | |||
| type Query { | |||
| selectOne(id: Long): DmVisitorsDto | |||
| list: [DmVisitorsDto] | |||
| # queryVisitList: [DmVisitRecordsDto] | |||
| } | |||
| type Mutation { | |||
| update(id: Long, phone: String, name: String, nickName: String): Boolean | |||
| delete(id: Long): Boolean | |||
| } | |||
| @@ -1,11 +1,39 @@ | |||
| extend type Query { | |||
| visitRecords( | |||
| receiverName:String | |||
| receiverPhone:String | |||
| ): [VisitRecord] | |||
| type DmVisitRecordsDto { | |||
| id: String | |||
| visitRecord(id:Long): VisitRecord | |||
| } | |||
| input visitRecordInput{ | |||
| name:String | |||
| phone:String | |||
| nickname:String | |||
| visitDate:Date | |||
| visitorCompany:String | |||
| isVip:Boolean | |||
| isVital:Boolean | |||
| resourceId:Long | |||
| } | |||
| extend type Mutation { | |||
| saveVisitRecord( | |||
| input: visitRecordInput | |||
| ): Boolean | |||
| deleteVisitRecord(id:Long): Boolean | |||
| } | |||
| type VisitRecord { | |||
| id: Long | |||
| visitorId: Long | |||
| userId: Long | |||
| receiverName: String | |||
| receiverPhone: String | |||
| recordStatus: Int | |||
| visitDate: DateTime | |||
| visitDate: Date | |||
| visitorCode: String | |||
| visitor: Visitor | |||
| } | |||
| @@ -1,9 +1,29 @@ | |||
| extend type Query { | |||
| visitors( | |||
| id: Long | |||
| name: String | |||
| type: Int | |||
| phone: String | |||
| ): [Visitor!] | |||
| visitor(id: Long): Visitor | |||
| } | |||
| extend type Mutation { | |||
| saveVisitor( | |||
| name: String | |||
| nickname: String | |||
| type: Int | |||
| phone: String): Boolean | |||
| deleteVisitor(id: Long!): Boolean | |||
| } | |||
| type DmVisitorsDto { | |||
| type Visitor { | |||
| id: String | |||
| age: String | |||
| name: String | |||
| nickname: String | |||
| phone: String | |||
| type: Int | |||
| visitorCompany: String | |||