Commit fd8c3051 by huluobin

Merge branch 'technician_push' into branch

# Conflicts:
#	src/main/resources/application-dev.yml
#	src/main/resources/application-test.yml
parents c04ae62c b6943319
log
\ No newline at end of file
......@@ -783,28 +783,37 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
/*2、校验提交的预约时间是否可约*/
IdleTimeQuery query = new IdleTimeQuery();
//店铺id
query.setDepartmentId(scheduleManage.getDepartmentId());
//预约日期
query.setScheduleDate(new SimpleDateFormat("yyyy-MM-dd").format(scheduleManage.getArriveTime()));
query.setListScheduleServer(scheduleManage.getListScheduleServer()
.stream()
.map(scheduleServeCommand -> {
ScheduleServeQuery scheduleServe = new ScheduleServeQuery();
//时长
scheduleServe.setLengthTimeForEndTime(scheduleServeCommand.getLengthTime());
//款式id
scheduleServe.setProduceId(scheduleServeCommand.getProduceId());
//服务id
scheduleServe.setServeId(scheduleServeCommand.getServeId());
return scheduleServe;
})
.collect(Collectors.toList()));
//是否显示详情
query.setShowNodeDetail(true);
//查询时间节点
query.setDateTimeList(Lists.newArrayList(scheduleManage.getArriveTime().getTime()));
//查询方案树
List<IdleTimeDTO> idleTimeDTOList = this.queryIdleTime(query);
//如果时间节点不可用返回false
IdleTimeDTO idleTimeDTO = idleTimeDTOList.stream().findAny().orElseThrow(NullPointerException::new);
if (!idleTimeDTO.isStatus()) {
throw new RRException("预约时间不可用");
}
/*3、判断美甲师是否是可用的美甲师*/
//构造子树
/*3、如果是指定美甲师、判断美甲师是否仍然可用*/
//构造路径
List<TreeProgram> treeProgramList = new ArrayList<>();
TreeProgram treeProgram = new TreeProgram();
List<ScheduleServe> scheduleServeList = scheduleManage.getListScheduleServer()
......@@ -812,14 +821,17 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
.filter(scheduleServe -> scheduleServe.getServeId() == null)
.collect(Collectors.toList());
List<List<ScheduleServe>> params = new ArrayList<>();
scheduleServeList.forEach(scheduleServe -> {
params.add(CloneUtil.deepClone(scheduleServeList));
});
//方案树
TreeProgram targetTree = idleTimeDTO.getTreeProgram();
boolean isPath = treeProgram.isSubTree(targetTree);
if (!isPath) {
throw new RRException("请重新选择美甲师");
}
}
}
/**
* 通过ScheduleServe构建TreeProgram
*
......@@ -869,6 +881,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
public void submitSchedule(SubmitScheduleCommand cmd) throws ParseException, ExecutionException, InterruptedException {
/*1、校验*/
cmd.getScheduleManageDTO().setScheduledUser(SessionUtils.getCustomerId());
//参数补全
ScheduleManage scheduleManage = this.setScheduleServe(cmd.getScheduleManageDTO(), cmd.getDefaultNodeList());
this.validSubmit(scheduleManage);
......@@ -1139,7 +1152,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
List<ScheduleServeCommand> scheduleServeCommandList = cmd.getScheduleServeDTOList();
//根据defaultNodeList的参数设置服务开始时间,服务结束时间,服务美甲师
//如果defaultNodeList不为空 根据defaultNodeList的参数设置服务开始时间,服务结束时间,服务美甲师
if (ListUtil.isNotEmpty(defaultNodeList)) {
defaultNodeList.forEach(defaultNode -> {
scheduleServeCommandList
......
......@@ -34,7 +34,7 @@ public class PurchaseSkuServiceImpl extends ServiceImpl<PurchaseSkuMapper, Purch
LambdaQueryWrapper<PurchaseSku> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotEmpty(keyWord)) {
wrapper.eq(PurchaseSku::getSkuName, keyWord);
wrapper.like(PurchaseSku::getSkuName, keyWord);
}
return purchaseSkuMapper.selectPage(purchaseSkuIPage, wrapper);
}
......
......@@ -169,6 +169,11 @@ public class CareerCmdServiceImpl implements CareerCmdService {
@Override
public Career career(Integer technicianId) {
return careerMapper.selectOne(new LambdaQueryWrapper<Career>().eq(Career::getTechnicianId, technicianId));
Career career = careerMapper.selectOne(new LambdaQueryWrapper<Career>().eq(Career::getTechnicianId, technicianId));
if (career == null) {
career = new Career();
career.setTechnicianId(technicianId);
}
return career;
}
}
package com.gogirl.dto;
import lombok.Data;
import java.util.List;
@Data
public class EnterpriseWxMsg {
private String msgType;
private EnterpriseTextWxMsg text;
@Data
public static class EnterpriseTextWxMsg {
private String content;
private List<String> mentioned_mobile_list;
}
}
......@@ -43,8 +43,7 @@ public class RRException extends RuntimeException implements Serializable {
private Map<String, Object> errorMap = new HashMap<>();
private RRException() {
this.code = 500;
this.message = "业务异常";
}
public RRException(String message) {
......
......@@ -42,11 +42,7 @@ public class RRExceptionHandler {
result.setCode(e.getCode());
result.setMessage(e.getMessage());
if (e.getCode() == 500 && e.getMessage().equals("业务异常")) {
log.error(e.getMessage(), e);
} else {
log.error(e.getMessage());
}
log.error(e.getMessage());
return result;
}
......@@ -60,8 +56,11 @@ public class RRExceptionHandler {
result.setSuccess(false);
result.setCode(500);
result.setMessage(e.getMessage());
//输出日志
this.log(e, request);
//错误邮件内容
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
......@@ -82,24 +81,7 @@ public class RRExceptionHandler {
String name = enumeration.nextElement();
log.error(name + "---" + request.getParameter(name));
}
if (ex instanceof RRException) {
if (((RRException) ex).getCode() == 500 && ex.getMessage().equals("业务异常")) {
this.logStackTrace(ex);
} else {
log.error(ex.getMessage());
}
} else {
this.logStackTrace(ex);
}
log.error(ex.getMessage(), ex);
log.error("************************异常结束*******************************");
}
private void logStackTrace(Exception ex) {
for (StackTraceElement stackTraceElement : ex.getStackTrace()) {
log.error(stackTraceElement.toString());
}
}
}
......@@ -62,4 +62,6 @@ public class GogirlProperties {
private String adminBackendUrl;
private String adminBackendAchievementsUrl;
private String enterpriseWechatWebhook;
}
......@@ -357,7 +357,6 @@ public class Schedule {
.eq(StoreTechnician::getStatus, 1)
.eq(StoreTechnician::getIsAdmin, false));
storeTechnicianList.forEach(storeTechnician -> {
ParameterizedTypeReference<AdminResult<AdminPage<AdminTechnicianScore>>> responseBodyType = new ParameterizedTypeReference<AdminResult<AdminPage<AdminTechnicianScore>>>() {
......
......@@ -8,6 +8,15 @@ import java.util.Date;
*/
public interface PushMsgService {
/**
* 发送预约消息
*
* @param openId
* @param scheduleName
* @param arriveTime
* @param departmentName
* @param address
*/
void sendScheduleMsg(String openId,
String scheduleName,
Date arriveTime,
......
package com.gogirl.infrastructure.service.push;
public interface TechnicianPushService {
/**
* 预约提醒
*
* @param scheduledId
*/
void scheduledMsg(Integer scheduledId);
/**
* 取消预约提醒
*
* @param scheduledId
*/
void cancelScheduledMsg(Integer scheduledId);
/**
* 预约过期
*
* @param scheduledId
*/
void ScheduledOverTimeMsg(Integer scheduledId);
}
package com.gogirl.infrastructure.service.push.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.gogirl.domain.order.serve.ScheduleManage;
import com.gogirl.domain.order.serve.ScheduleServe;
import com.gogirl.domain.store.store.StoreTechnician;
import com.gogirl.dto.EnterpriseWxMsg;
import com.gogirl.infrastructure.config.property.GogirlProperties;
import com.gogirl.infrastructure.mapper.order.serve.ScheduleManageMapper;
import com.gogirl.infrastructure.mapper.order.serve.ScheduleServeMapper;
import com.gogirl.infrastructure.mapper.store.store.StoreTechnicianMapper;
import com.gogirl.infrastructure.service.push.TechnicianPushService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class TechnicianPushServiceImpl implements TechnicianPushService {
@Resource
RestTemplate restTemplate;
@Resource
ScheduleManageMapper scheduleManageMapper;
@Resource
ScheduleServeMapper scheduleServeMapper;
@Resource
StoreTechnicianMapper storeTechnicianMapper;
@Resource
GogirlProperties gogirlProperties;
@Override
public void scheduledMsg(Integer scheduledId) {
ScheduleManage scheduleManage = scheduleManageMapper.selectById(scheduledId);
String name = scheduleManage.getStoreScheduleUsername();
String phone = scheduleManage.getTelephone();
String date = scheduleManage.getArriveTime().toString();
List<ScheduleServe> scheduleServeList = scheduleServeMapper.selectList(new LambdaQueryWrapper<ScheduleServe>().eq(ScheduleServe::getSchId, scheduledId));
String serves = scheduleServeList.stream().map(ScheduleServe::getServeName).collect(Collectors.joining(","));
List<StoreTechnician> storeTechnicianList = storeTechnicianMapper.selectBatchIds(scheduleServeList.stream().map(ScheduleServe::getTechnicianId).collect(Collectors.toList()));
String technicianNames = storeTechnicianList.stream().map(StoreTechnician::getName).collect(Collectors.joining(","));
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
EnterpriseWxMsg enterpriseWxMsg = new EnterpriseWxMsg();
enterpriseWxMsg.setMsgType("text");
EnterpriseWxMsg.EnterpriseTextWxMsg textWxMsg = new EnterpriseWxMsg.EnterpriseTextWxMsg();
StringBuilder builder = new StringBuilder();
String content = builder.append("预约提醒\n")
.append("预约客户 :").append(name).append("\n")
.append("预约客户手机 :").append(phone).append("\n")
.append("预约时间:").append(date).append("\n")
.append("预约技师").append(technicianNames).append("\n")
.append("预约项目: ").append(serves).append("\n")
.toString();
textWxMsg.setMentioned_mobile_list(storeTechnicianList.stream().map(StoreTechnician::getMobile).collect(Collectors.toList()));
textWxMsg.setContent(content);
enterpriseWxMsg.setText(textWxMsg);
HttpEntity<EnterpriseWxMsg> httpEntity = new HttpEntity<>(enterpriseWxMsg, httpHeaders);
restTemplate.postForEntity(gogirlProperties.getEnterpriseWechatWebhook(), httpEntity, String.class);
}
@Override
public void cancelScheduledMsg(Integer scheduledId) {
}
@Override
public void ScheduledOverTimeMsg(Integer scheduledId) {
}
}
......@@ -97,4 +97,39 @@ public class TreeProgram implements Serializable {
return this.getStoreTechnicianDTO().getTechnicianId().equals(treeProgram.getStoreTechnicianDTO().getTechnicianId())
&& this.getScheduleServeQuery().getServeId().equals(treeProgram.getScheduleServeQuery().getServeId());
}
public boolean isSubTree(TreeProgram treeProgram) {
if (treeProgram == null) {
return true;
}
boolean bool = this.isSameNode(treeProgram);
if (!bool) {
return false;
} else {
TreeProgram subPath = this.getChildList().stream().findAny().orElseThrow(NullPointerException::new);
List<TreeProgram> targetTreeList = treeProgram.getChildList();
TreeProgram targetTree = targetTreeList.stream().filter(val -> val.isSameNode(subPath)).findAny().orElse(null);
if (targetTree == null) {
return false;
}
return subPath.isSubTree(targetTree);
}
}
public boolean isSameNode(TreeProgram treeProgram) {
/**/
boolean sameServe = this.getScheduleServeQuery().getLengthTimeForEndTime()
.equals(treeProgram.getScheduleServeQuery().getLengthTimeForEndTime())
&& this.getScheduleServeQuery().getServeId().equals(treeProgram.getScheduleServeQuery().getServeId())
&& this.getScheduleServeQuery().getProduceId().equals(treeProgram.getScheduleServeQuery().getProduceId())
&& this.getScheduleServeQuery().getPeriod().equals(treeProgram.getScheduleServeQuery().getPeriod());
/**/
boolean sameTech = this.getStoreTechnicianDTO().getTechnicianId().equals(treeProgram.getStoreTechnicianDTO().getTechnicianId());
/**/
return sameServe && sameTech;
}
}
......@@ -67,6 +67,8 @@ spring:
required: true
port: 465
#项目属性
gogirl:
#充值回调地址
......@@ -92,9 +94,11 @@ gogirl:
#评论延迟时间
test-paper-time: 1440
#后台后端接口访问地址
admin-backend-url: http://test.admin.begogirls.com:7712/api/ReportTable/GetTechnicianPage
admin-backend-url: http://test.admin.begogirls.com:7712/api/ReportTable/GetTechnicianPage、
#
admin-backend-achievements-url: http://test.admin.begogirls.com:7712/api/salary/AchievementsPersonaResultPageApi
#
enterprise-wechat-webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa"
wx:
pay:
appId: wx058b46db3cd0e979
......
......@@ -93,10 +93,11 @@ gogirl:
#评论延迟时间
test-paper-time: 1
#后台后端接口访问地址
admin-backend-url: http://test.admin.begogirls.com:7712/api/ReportTable/GetTechnicianPage
admin-backend-url: "http://test.admin.begogirls.com:7712/api/ReportTable/GetTechnicianPage"
admin-backend-achievements-url: http://test.admin.begogirls.com:7712/api/salary/AchievementsPersonaResultPageApi
admin-backend-achievements-url: "http://test.admin.begogirls.com:7712/api/salary/AchievementsPersonaResultPageApi"
enterprise-wechat-webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa"
wx:
pay:
appId: wx058b46db3cd0e979
......
......@@ -94,7 +94,7 @@ gogirl:
#后台后端接口访问地址
admin-backend-url: http://admin.begogirls.com:7712/api/ReportTable/GetTechnicianPageApi
admin-backend-achievements-url: http://admin.begogirls.com:7712/api/salary/AchievementsPersonaResultPageApi
enterprise-wechat-webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa"
wx:
pay:
appId: wx058b46db3cd0e979
......
......@@ -67,6 +67,7 @@ spring:
required: true
port: 465
#项目属性
gogirl:
#充值回调地址
......@@ -94,7 +95,7 @@ gogirl:
#后台后端接口访问地址
admin-backend-url: http://test.admin.begogirls.com:7712/api/ReportTable/GetTechnicianPage
admin-backend-achievements-url: http://test.admin.begogirls.com:7712/api/salary/AchievementsPersonaResultPageApi
enterprise-wechat-webhook: "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693axxx6-7aoc-4bc4-97a0-0ec2sifa5aaa"
wx:
pay:
appId: wx058b46db3cd0e979
......
......@@ -18,31 +18,7 @@
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<contextName>${contextName}</contextName>
   
<property name="smtpHost" value="smtp.exmail.qq.com"/>
<property name="username" value="name@new4g.cn"/>
<property name="email_to" value="name@new4g.cn"/>
<property name="password" value="ykglyxhfwurjbjbi"/>
<property name="SSL" value="fasle"/>
<property name="email_subject" value="服务器日志报错"/>
<!--邮件-->    
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"> 
        <smtpHost>${smtpHost}</smtpHost>  
        <Username>${username}</Username>  
        <Password>${password}</Password>  
        <SSL>${SSL}</SSL>  
        <to>${email_to}</to>  
        <from>${username}</from>  
        <subject>${email_subject}</subject>  
<asynchronousSending>true</asynchronousSending>
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date %X{ip}  %-5level %logger{35} - %message%n</pattern>
</layout>
   
</appender>
<!-- info日志 appender -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志回滚策略-->
......@@ -50,10 +26,10 @@
<!-- 按天回滚 daily -->
<fileNamePattern>${LOG_HOME}/${contextName}-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 30天 -->
<maxHistory>30</maxHistory>
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
......@@ -69,10 +45,10 @@
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${contextName}-warn.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>30</maxHistory>
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
......@@ -86,10 +62,10 @@
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/${contextName}-error.%d{yyyy-MM-dd}.log</FileNamePattern>
<maxHistory>30</maxHistory>
<maxHistory>3</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${LOG_PATTERN}</pattern>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter"><!-- 只打印错误日志 -->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment