Commit e718deb7 by 丁伟峰

Merge branch 'feature-dingwf-0715' into develop

# Conflicts:
#	project-order/src/main/java/com/dituhui/pea/order/controller/EngineerController.java
#	project-order/src/main/java/com/dituhui/pea/order/service/impl/EngineerServiceImpl.java
2 parents 32ba502e 4363ef22
...@@ -6,6 +6,8 @@ import com.dituhui.pea.order.dto.EngineerBusinessUpdateReqDTO; ...@@ -6,6 +6,8 @@ import com.dituhui.pea.order.dto.EngineerBusinessUpdateReqDTO;
import com.dituhui.pea.order.dto.EngineerCalendarDTO; import com.dituhui.pea.order.dto.EngineerCalendarDTO;
import com.dituhui.pea.order.dto.EngineerSkillUpdateReqDTO; import com.dituhui.pea.order.dto.EngineerSkillUpdateReqDTO;
import com.dituhui.pea.order.dto.EngineersGanttReqDTO; import com.dituhui.pea.order.dto.EngineersGanttReqDTO;
import com.dituhui.pea.order.service.EngineerCalendarService;
import com.dituhui.pea.order.service.EngineerGanttService;
import com.dituhui.pea.order.service.EngineerService; import com.dituhui.pea.order.service.EngineerService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -17,141 +19,159 @@ import org.springframework.web.bind.annotation.*; ...@@ -17,141 +19,159 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/pea-order") @RequestMapping("/pea-order")
public class EngineerController { public class EngineerController {
@Autowired @Autowired
private EngineerService engineerService; private EngineerService engineerService;
@GetMapping("/engineer/info/list") @Autowired
public Result<?> getEngineerInfoList(@RequestParam String levelType, private EngineerGanttService engineerGanttService;
@RequestParam String levelValue,
@RequestParam long page, @Autowired
@RequestParam long size, private EngineerCalendarService engineerCalendarService;
@RequestParam(required = false) String kind,
@RequestParam(required = false) String key) { @GetMapping("/engineer/info/list")
// 获取工程师基础信息列表 public Result<?> getEngineerInfoList(@RequestParam String levelType,
Result<?> res = null; @RequestParam String levelValue,
try { @RequestParam long page,
res = engineerService.getEngineerInfoList(levelType, levelValue, page, size, kind, key); @RequestParam long size,
} catch (BusinessException e) { @RequestParam(required = false) String kind,
return Result.failed(e.getMessage()); @RequestParam(required = false) String key) {
} // 获取工程师基础信息列表
return res; Result<?> res = null;
} try {
res = engineerService.getEngineerInfoList(levelType, levelValue, page, size, kind, key);
@GetMapping("/engineer/info/detail") } catch (BusinessException e) {
public Result<?> getEngineerInfoDetail(@RequestParam String engineerCode) { return Result.failed(e.getMessage());
// 获取工程师基础信息列表 }
Result<?> res = null; return res;
try { }
res = engineerService.getEngineerInfoDetail(engineerCode);
} catch (BusinessException e) { @GetMapping("/engineer/info/detail")
return Result.failed(e.getMessage()); public Result<?> getEngineerInfoDetail(@RequestParam String engineerCode) {
} // 获取工程师基础信息列表
return res; Result<?> res = null;
} try {
res = engineerService.getEngineerInfoDetail(engineerCode);
@GetMapping("/engineer/skill/list") } catch (BusinessException e) {
public Result<?> getEngineerSkillList(@RequestParam String levelType, return Result.failed(e.getMessage());
@RequestParam String levelValue, }
@RequestParam long page, return res;
@RequestParam long size, }
@RequestParam(required = false) String kind,
@RequestParam(required = false) String key) { @GetMapping("/engineer/skill/list")
// 获取工程师技能信息列表 public Result<?> getEngineerSkillList(@RequestParam String levelType,
Result<?> res = null; @RequestParam String levelValue,
try { @RequestParam long page,
res = engineerService.getEngineerSkillList(levelType, levelValue, page, size, kind, key); @RequestParam long size,
} catch (BusinessException e) { @RequestParam(required = false) String kind,
return Result.failed(e.getMessage()); @RequestParam(required = false) String key) {
} // 获取工程师技能信息列表
return res; Result<?> res = null;
} try {
res = engineerService.getEngineerSkillList(levelType, levelValue, page, size, kind, key);
@GetMapping("/engineer/skill/detail") } catch (BusinessException e) {
public Result<?> getEngineerSkillDetail(@RequestParam String engineerCode) { return Result.failed(e.getMessage());
// 获取工程师技能信息列表 }
Result<?> res = null; return res;
try { }
res = engineerService.getEngineerSkillDetail(engineerCode);
} catch (BusinessException e) { @GetMapping("/engineer/skill/detail")
return Result.failed(e.getMessage()); public Result<?> getEngineerSkillDetail(@RequestParam String engineerCode) {
} // 获取工程师技能信息列表
return res; Result<?> res = null;
} try {
res = engineerService.getEngineerSkillDetail(engineerCode);
@PostMapping("/engineer/skill/update") } catch (BusinessException e) {
public Result<?> engineerSkillUpdate(@RequestBody EngineerSkillUpdateReqDTO req) { return Result.failed(e.getMessage());
// 获取工程师技能信息修改 }
try { return res;
engineerService.engineerSkillUpdate(req.getEngineerCode(), req.getSkillGroupIds()); }
} catch (BusinessException e) {
return Result.failed(e.getMessage()); @PostMapping("/engineer/skill/update")
} public Result<?> engineerSkillUpdate(@RequestBody EngineerSkillUpdateReqDTO req) {
return Result.success(null); // 获取工程师技能信息修改
} try {
engineerService.engineerSkillUpdate(req.getEngineerCode(), req.getSkillGroupIds());
@GetMapping("/engineer/business/list") } catch (BusinessException e) {
public Result<?> getEngineerBusinessList(@RequestParam String levelType, return Result.failed(e.getMessage());
@RequestParam String levelValue, }
@RequestParam long page, return Result.success(null);
@RequestParam long size, }
@RequestParam(required = false) String kind,
@RequestParam(required = false) String key) { @GetMapping("/engineer/business/list")
// 技术员业务属性配置列表 public Result<?> getEngineerBusinessList(@RequestParam String levelType,
Result<?> res = null; @RequestParam String levelValue,
try { @RequestParam long page,
res = engineerService.getEngineerBusinessList(levelType, levelValue, page, size, kind, key); @RequestParam long size,
} catch (BusinessException e) { @RequestParam(required = false) String kind,
return Result.failed(e.getMessage()); @RequestParam(required = false) String key) {
} // 技术员业务属性配置列表
return res; Result<?> res = null;
} try {
res = engineerService.getEngineerBusinessList(levelType, levelValue, page, size, kind, key);
@GetMapping("/engineer/business/detail") } catch (BusinessException e) {
public Result<?> getEngineerBusinessDetail(@RequestParam String engineerCode) { return Result.failed(e.getMessage());
// 技术员业务属性配置列表 }
Result<?> res = null; return res;
try { }
res = engineerService.getEngineerBusinessDetail(engineerCode);
} catch (BusinessException e) { @GetMapping("/engineer/business/detail")
return Result.failed(e.getMessage()); public Result<?> getEngineerBusinessDetail(@RequestParam String engineerCode) {
} // 技术员业务属性配置列表
return res; Result<?> res = null;
} try {
res = engineerService.getEngineerBusinessDetail(engineerCode);
@PostMapping("/engineer/business/update") } catch (BusinessException e) {
public Result<?> engineerBusinessUpdate(@RequestBody EngineerBusinessUpdateReqDTO req) { return Result.failed(e.getMessage());
// 技术员业务属性配置更新 }
Result<?> res = null; return res;
try { }
res = engineerService.engineerBusinessUpdate(
req.getEngineerCode(), req.getMaxNum(), req.getMaxMinute(), @PostMapping("/engineer/business/update")
req.getDeparture(), req.getPriority()); public Result<?> engineerBusinessUpdate(@RequestBody EngineerBusinessUpdateReqDTO req) {
} catch (BusinessException e) { // 技术员业务属性配置更新
return Result.failed(e.getMessage()); Result<?> res = null;
} try {
return res; res = engineerService.engineerBusinessUpdate(
} req.getEngineerCode(), req.getMaxNum(), req.getMaxMinute(),
req.getDeparture(), req.getPriority());
@PostMapping(value = "/engineer/schedule/gantt") } catch (BusinessException e) {
public Result<?> getEngineersGanttList(@Validated @RequestBody EngineersGanttReqDTO reqDTO) { return Result.failed(e.getMessage());
log.info("getEngineersGanttList: {}", reqDTO); }
Result<?> res = null; return res;
try { }
res = engineerService.getEngineersGanttList(reqDTO);
} catch (BusinessException e) { @PostMapping(value = "/engineer/schedule/gantt")
return Result.failed(e.getMessage()); public Result<?> getEngineersGanttList(@Validated @RequestBody EngineersGanttReqDTO reqDTO) {
} log.info("getEngineersGanttList: {}", reqDTO);
return res; Result<?> res = null;
} try {
res = engineerService.getEngineersGanttList(reqDTO);
@GetMapping("/engineer/calendar") } catch (BusinessException e) {
public Result<?> getEngineerCalendar(@Validated EngineerCalendarDTO.Request reqDTO) { return Result.failed(e.getMessage());
Result<?> res = null; }
try { return res;
res = engineerService.getEngineersCalendar(reqDTO); }
} catch (BusinessException e) {
return Result.failed(e.getMessage()); @GetMapping("/engineer/calendar")
} public Result<?> getEngineerCalendar(@Validated EngineerCalendarDTO.Request reqDTO) {
return res; Result<?> res = null;
} try {
res = engineerService.getEngineersCalendar(reqDTO);
} catch (BusinessException e) {
return Result.failed(e.getMessage());
}
return res;
}
@PostMapping("/engineer/schedule/gantt")
public Result<?> getEngineersGanttList(@Validated @RequestBody EngineersGanttReqDTO reqDTO) {
log.info("getEngineersGanttList: {}", reqDTO);
Result<?> res = null;
try {
res = engineerGanttService.getEngineersGanttList(reqDTO);
} catch (BusinessException e) {
return Result.failed(e.getMessage());
}
return res;
}
} }
package com.dituhui.pea.order.service;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dto.EngineerCalendarDTO;
public interface EngineerCalendarService {
Result<?> getEngineersCalendar(EngineerCalendarDTO.Request engineerCalendarReq);
}
package com.dituhui.pea.order.service;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dto.EngineersGanttReqDTO;
public interface EngineerGanttService {
Result<?> getEngineersGanttList(EngineersGanttReqDTO ganttReqDTO);
}
...@@ -23,8 +23,4 @@ public interface EngineerService { ...@@ -23,8 +23,4 @@ public interface EngineerService {
// 技术员业务属性配置修改 // 技术员业务属性配置修改
Result<?> engineerBusinessUpdate(String engineerCode, Integer maxNum, Integer maxMutine, String departure, String priority); Result<?> engineerBusinessUpdate(String engineerCode, Integer maxNum, Integer maxMutine, String departure, String priority);
Result<?> getEngineersGanttList(EngineersGanttReqDTO ganttReqDTO);
Result<?> getEngineersCalendar(EngineerCalendarDTO.Request engineerCalendarReq);
} }
package com.dituhui.pea.order.service.impl;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.date.Week;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.common.EngineerUtil;
import com.dituhui.pea.order.dao.CapacityEngineerCalendarDao;
import com.dituhui.pea.order.dao.OrgTeamDao;
import com.dituhui.pea.order.dao.OrgTeamEngineerDao;
import com.dituhui.pea.order.dto.EngineerCalendarDTO;
import com.dituhui.pea.order.entity.CapacityEngineerCalendarEntity;
import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.OrgTeamEntity;
import com.dituhui.pea.order.service.EngineerCalendarService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static com.dituhui.pea.order.config.OrderConfig.PATTERN_DATE;
import static com.dituhui.pea.order.config.OrderConfig.PATTERN_DATETIME;
@Slf4j
@Service
public class EngineerCalendarServiceImpl implements EngineerCalendarService {
@Autowired
private EngineerUtil engineerUtil;
@Autowired
private OrgTeamEngineerDao orgTeamEngineerDao;
@Autowired
private CapacityEngineerCalendarDao capacityEngineerCalendarDao;
@Autowired
private OrgTeamDao orgTeamDao;
@Override
public Result<?> getEngineersCalendar(EngineerCalendarDTO.Request req) {
// 技术员日历,查询 capacity_engineer_calendar表,如果当日有各种事项,进行显示;否则显示正常上班;
List<EngineerCalendarDTO.Engineer> engineers = new ArrayList<>();
List<EngineerInfoEntity> entities = engineerUtil.getEngineesByLevel(req.getLevelType(), req.getLevelValue());
String edate = LocalDate.parse(req.getDate()).plusDays(14).toString();
for (EngineerInfoEntity e : entities) {
EngineerCalendarDTO.Engineer engineer = new EngineerCalendarDTO.Engineer();
engineer.setEngineerCode(e.getEngineerCode());
engineer.setName(e.getName());
engineer.setCalendar(getOneEngineerCalendars(e.getEngineerCode(), req.getDate(), edate));
engineers.add(engineer);
}
EngineerCalendarDTO.Result rs = new EngineerCalendarDTO.Result();
rs.setEngineers(engineers);
return Result.success(rs);
}
private List<EngineerCalendarDTO.Calendar> getOneEngineerCalendars(String engineerCode, String bdate, String edate) {
// 返回某一个技术员,日期范围内的日历列表
List<EngineerCalendarDTO.Calendar> calendars = null;
List<String> teamIds = orgTeamEngineerDao.getTeamIdsByEngineerCode(engineerCode);
if (teamIds == null || teamIds.size() == 0) {
return new ArrayList<>();
}
LocalDate startDate = LocalDate.parse(bdate);
LocalDate endDate = LocalDate.parse(edate);
List<LocalDate> datesInRange = Stream.iterate(startDate, date -> date.plusDays(1))
.limit(ChronoUnit.DAYS.between(startDate, endDate.plusDays(1)))
.collect(Collectors.toList());
Map<String, List<CapacityEngineerCalendarEntity>> configs = capacityEngineerCalendarDao.findCalendarByEngineerCodeAndDateBetween(engineerCode, bdate, edate).stream()
.collect(Collectors.groupingBy(CapacityEngineerCalendarEntity::getWorkday));
for (LocalDate date : datesInRange) {
String sDate = LocalDateTimeUtil.format(date, PATTERN_DATE);
EngineerCalendarDTO.Calendar calander = null;
if (!configs.containsKey(sDate)) {
calander = getEmptyCalendar(teamIds.get(0), sDate);
} else {
calander = new EngineerCalendarDTO.Calendar();
calander.setDate(sDate);
int week = LocalDate.parse(sDate).getDayOfWeek().getValue();
calander.setWeek(Week.of(week).toChinese("周"));
List<EngineerCalendarDTO.Content> contents = new ArrayList<>();
// 有配置
for (CapacityEngineerCalendarEntity e : configs.get(sDate)) {
EngineerCalendarDTO.Content content = new EngineerCalendarDTO.Content();
content.setType("rest");
content.setTitle(e.getType());
content.setValue(getCalendarDuration(e.getStartTime(), e.getEndTime()));
}
calander.setContent(contents);
}
calendars.add(calander);
}
return calendars;
}
private String getCalendarDuration(LocalDateTime btime, LocalDateTime etime) {
String b2 = LocalDateTimeUtil.format(btime, PATTERN_DATETIME);
String e2 = LocalDateTimeUtil.format(etime, PATTERN_DATETIME);
return getCalendarDuration(b2, e2);
}
private String getCalendarDuration(String btime, String etime) {
LocalTime t1 = LocalTime.parse(btime);
LocalTime t2 = LocalTime.parse(etime);
Duration duration = Duration.between(t1, t2);
long hours = duration.toHours();
long minutes = duration.toMinutesPart();
if (minutes > 0 && hours == 0) {
return String.format("%d分钟", minutes);
} else if (minutes == 0 && hours > 0) {
return String.format("%d小时", hours);
} else {
return String.format("%d小时%d分钟", hours, minutes);
}
}
private EngineerCalendarDTO.Calendar getEmptyCalendar(String teamId, String date) {
// 初始化一天的日历
OrgTeamEntity e = orgTeamDao.getByTeamId(teamId);
EngineerCalendarDTO.Calendar calendar = new EngineerCalendarDTO.Calendar();
calendar.setDate(date);
int week = LocalDate.parse(date).getDayOfWeek().getValue();
EngineerCalendarDTO.Content content = new EngineerCalendarDTO.Content();
List<String> workdays = Arrays.asList(e.getWorkdays().split(","));
if (workdays.contains(String.valueOf(week))) {
content.setType("woring");
content.setTitle(String.format("日常出勤 %s-%s", e.getWorkOn(), e.getWorkOff()));
content.setValue(getCalendarDuration(e.getWorkOn(), e.getWorkOff()));
} else {
content.setType("rest");
content.setTitle("休息");
}
calendar.setContent(Collections.singletonList(content));
return calendar;
}
}
package com.dituhui.pea.order.service.impl;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dao.CapacityEngineerStatDao;
import com.dituhui.pea.order.dao.EngineerInfoDao;
import com.dituhui.pea.order.dao.OrderAppointmentDao;
import com.dituhui.pea.order.dao.OrderRequestDao;
import com.dituhui.pea.order.dto.EngineersGanttReqDTO;
import com.dituhui.pea.order.dto.EngineersGanttRespDTO;
import com.dituhui.pea.order.dto.LabelValueDTO;
import com.dituhui.pea.order.entity.CapacityEngineerStatEntity;
import com.dituhui.pea.order.entity.EngineerInfoEntity;
import com.dituhui.pea.order.entity.OrderAppointmentEntity;
import com.dituhui.pea.order.entity.OrderRequestEntity;
import com.dituhui.pea.order.service.EngineerGanttService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class EngineerGanttServiceImpl implements EngineerGanttService {
@Autowired
private OrderAppointmentDao orderAppointmentDao;
@Autowired
private CapacityEngineerStatDao capacityEngineerStatDao;
@Autowired
private EngineerInfoDao engineerInfoDao;
@Autowired
private OrderRequestDao orderRequestDao;
@Override
public Result<?> getEngineersGanttList(EngineersGanttReqDTO reqDTO) {
// 按日期返回技术员们当天的服务甘特图,不需要翻页
log.info("getEngineersGanttList: {}", reqDTO);
List<OrderAppointmentEntity> orderAppointments = orderAppointmentDao.findByDateAndEngineerCodeIn(reqDTO.getDate(), reqDTO.getEngineerCodes());
List<String> orderIds = orderAppointments.stream().map(OrderAppointmentEntity::getOrderId).collect(Collectors.toList());
Map<String, OrderRequestEntity> mapOrderRequest = getOrdersByOrderIds(orderIds);
HashMap<String, List<EngineersGanttRespDTO.Order>> mapEngineers = new HashMap<>();
for (OrderAppointmentEntity e : orderAppointments) {
log.info("===== order_id: [{}]", e.getOrderId());
EngineersGanttRespDTO.Order order = new EngineersGanttRespDTO.Order();
// todo 需要根据订单时间和状态,采用expectXXXX或者actualXXXX
order.setStartTime(e.getExpectStartTime()).setEndTime(e.getExpectEndTime());
order.setOrderId(e.getOrderId()).setPreStatus(e.getPreStatus());
order.setTips(getOrderTips(e.getOrderId()));
order.setAppointmentStatus(mapOrderRequest.get(e.getOrderId()).getAppointmentStatus());
List<EngineersGanttRespDTO.Order> orders = null;
if (mapEngineers.containsKey(e.getEngineerCode())) {
orders = mapEngineers.get(e.getEngineerCode());
} else {
orders = new ArrayList<>();
}
orders.add(order);
mapEngineers.put(e.getEngineerCode(), orders);
}
List<EngineersGanttRespDTO.GanttChart> engineers = new ArrayList<>();
for (String engineerCode : reqDTO.getEngineerCodes()) {
EngineerInfoEntity engineerInfo = engineerInfoDao.getByEngineerCode(engineerCode);
EngineersGanttRespDTO.GanttChart engineer = new EngineersGanttRespDTO.GanttChart();
engineer.setEngineerCode(engineerCode)
.setStartTime(String.format("%s 08:00", reqDTO.getDate()))
.setEndTime(String.format("%s 18:00", reqDTO.getDate()))
.setHoliday(false) // todo
.setEngineerName(engineerInfo.getName())
.setGrade(engineerInfo.getGrade());
CapacityEngineerStatEntity capacityEngineerStat = capacityEngineerStatDao.getByEngineerCodeAndWorkday(engineerCode, reqDTO.getDate());
if (capacityEngineerStat == null) {
log.warn("技术员当日的容量数据不存在,{}{}", engineerCode, reqDTO.getDate());
} else {
engineer.setCapTotal(capacityEngineerStat.getCapTotal().toString()).setCapUsed(capacityEngineerStat.getCapUsed().toString());
}
if (mapEngineers.containsKey(engineerCode)) {
engineer.setOrders(mapEngineers.get(engineerCode));
}
// engineer.setErrorTip(); todo
engineers.add(engineer);
}
EngineersGanttRespDTO data = new EngineersGanttRespDTO().setDate(reqDTO.getDate()).setEngineers(engineers);
return Result.success(data);
}
public Map<String, OrderRequestEntity> getOrdersByOrderIds(List<String> orderIds) {
List<OrderRequestEntity> orders = orderRequestDao.findAllByOrderIdIn(orderIds);
return orders.stream()
.collect(Collectors.toMap(OrderRequestEntity::getOrderId, order -> order));
}
private List<?> getOrderTips(String orderId) {
log.info("==> getOrderTips: orderId[{}]", orderId);
OrderRequestEntity order = orderRequestDao.getByOrderId(orderId);
if (order == null) {
log.error("对应的订单不存在!{}", orderId);
return null;
}
List<LabelValueDTO> tips = new ArrayList<>();
tips.add(new LabelValueDTO().setLabel("工单号码").setValue(orderId));
tips.add(new LabelValueDTO().setLabel("类型/品牌").setValue(String.format("%s %s", order.getBrand(), order.getType())));
tips.add(new LabelValueDTO().setLabel("电话/地址").setValue(String.format("%s %s\n %s", order.getName(), order.getPhone(), order.getAddress())));
if (StringUtils.isNotBlank(order.getApplyNote())) {
tips.add(new LabelValueDTO().setLabel("备注").setValue(order.getApplyNote()));
}
tips.add(new LabelValueDTO().setLabel("标签").setValue(order.getTags()));
return tips;
}
}
...@@ -25,533 +25,539 @@ import java.util.stream.Collectors; ...@@ -25,533 +25,539 @@ import java.util.stream.Collectors;
@Service @Service
public class EngineerServiceImpl implements EngineerService { public class EngineerServiceImpl implements EngineerService {
@Autowired @Autowired
private EngineerInfoMPDao engineerInfoMPDao; private EngineerInfoMPDao engineerInfoMPDao;
@Autowired @Autowired
private EngineerSkillGroupMPDao engineerSkillGroupMPDao; private EngineerSkillGroupMPDao engineerSkillGroupMPDao;
@Autowired @Autowired
private OrgGroupMPDao orgGroupMPDao; private OrgGroupMPDao orgGroupMPDao;
@Autowired @Autowired
private EngineerBusinessMPDao engineerBusinessDao; private EngineerBusinessMPDao engineerBusinessDao;
@Autowired @Autowired
private OrderRequestDao orderRequestDao; private OrderRequestDao orderRequestDao;
@Autowired @Autowired
private OrderAppointmentDao orderAppointmentDao; private OrderAppointmentDao orderAppointmentDao;
@Autowired @Autowired
private EngineerInfoDao engineerInfoDao; private EngineerInfoDao engineerInfoDao;
@Autowired @Autowired
private CapacityEngineerStatDao capacityEngineerStatDao; private CapacityEngineerStatDao capacityEngineerStatDao;
@Transactional @Transactional
@Override @Override
public Result<?> getEngineerInfoList(String levelType, String levelValue, long page, long size, String kind, String key) { public Result<?> getEngineerInfoList(String levelType, String levelValue, long page, long size, String kind, String key) {
// 查询工程师信息 // 查询工程师信息
IPage<EngineerInfo> pg = this.queryEngineerInfoIPage(levelType, levelValue, page, size, kind, key); IPage<EngineerInfo> pg = this.queryEngineerInfoIPage(levelType, levelValue, page, size, kind, key);
List<EngineerInfo> records = pg.getRecords(); List<EngineerInfo> records = pg.getRecords();
// 获取groupIds // 获取groupIds
List<String> groupIds = records.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList()); List<String> groupIds = records.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList());
// 获取Map<groupId, groupName> // 获取Map<groupId, groupName>
HashMap<String, String> groupNames = this.queryGroupNames(groupIds); HashMap<String, String> groupNames = this.queryGroupNames(groupIds);
// 设置返回值 // 设置返回值
EngineerInfoListResp res = new EngineerInfoListResp(); EngineerInfoListResp res = new EngineerInfoListResp();
res.setContent(this.packEngineerInfos(records, groupNames)); res.setContent(this.packEngineerInfos(records, groupNames));
res.setTotal(pg.getTotal()); res.setTotal(pg.getTotal());
res.setPages(pg.getPages()); res.setPages(pg.getPages());
res.setPageCurrent(pg.getCurrent()); res.setPageCurrent(pg.getCurrent());
res.setPageSize(pg.getSize()); res.setPageSize(pg.getSize());
return Result.success(res); return Result.success(res);
} }
@Override @Override
public Result<?> getEngineerInfoDetail(String engineerCode) throws BusinessException { public Result<?> getEngineerInfoDetail(String engineerCode) throws BusinessException {
// 获取技术员基础信息详情 // 获取技术员基础信息详情
// 获取技术员列表 // 获取技术员列表
List<EngineerInfo> records = engineerInfoMPDao.selectByEngineerCode(engineerCode); List<EngineerInfo> records = engineerInfoMPDao.selectByEngineerCode(engineerCode);
if (records.isEmpty()) { if (records.isEmpty()) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
List<String> groupIds = records.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList()); List<String> groupIds = records.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList());
HashMap<String, String> groupNames = this.queryGroupNames(groupIds); HashMap<String, String> groupNames = this.queryGroupNames(groupIds);
List<EngineerInfoListResp.EngineerInfo> items = this.packEngineerInfos(records, groupNames); List<EngineerInfoListResp.EngineerInfo> items = this.packEngineerInfos(records, groupNames);
if (items.isEmpty()) { if (items.isEmpty()) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
return Result.success(items.get(0)); return Result.success(items.get(0));
} }
@Transactional @Transactional
@Override @Override
public Result<?> getEngineerSkillList(String levelType, String levelValue, long page, long size, String kind, String key) { public Result<?> getEngineerSkillList(String levelType, String levelValue, long page, long size, String kind, String key) {
// 获取技术员技能列表 // 获取技术员技能列表
IPage<EngineerInfo> pg = this.queryEngineerInfoIPage(levelType, levelValue, page, size, kind, key); IPage<EngineerInfo> pg = this.queryEngineerInfoIPage(levelType, levelValue, page, size, kind, key);
List<EngineerInfo> engineers = pg.getRecords(); List<EngineerInfo> engineers = pg.getRecords();
EngineerSkillListResp res = new EngineerSkillListResp(); EngineerSkillListResp res = new EngineerSkillListResp();
res.setTotal(pg.getTotal()); res.setTotal(pg.getTotal());
res.setPages(pg.getPages()); res.setPages(pg.getPages());
res.setPageCurrent(pg.getCurrent()); res.setPageCurrent(pg.getCurrent());
res.setPageSize(pg.getSize()); res.setPageSize(pg.getSize());
res.setContent(this.packEngineerSkills(engineers)); res.setContent(this.packEngineerSkills(engineers));
return Result.success(res); return Result.success(res);
} }
@Override @Override
public Result<?> getEngineerSkillDetail(String engineerCode) throws BusinessException { public Result<?> getEngineerSkillDetail(String engineerCode) throws BusinessException {
// 获取工程师技能详情 // 获取工程师技能详情
List<EngineerInfo> engineers = engineerInfoMPDao.selectByEngineerCode(engineerCode); List<EngineerInfo> engineers = engineerInfoMPDao.selectByEngineerCode(engineerCode);
if (engineers.isEmpty()) { if (engineers.isEmpty()) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
List<EngineerSkillListResp.EngineerSkill> items = this.packEngineerSkills(engineers); List<EngineerSkillListResp.EngineerSkill> items = this.packEngineerSkills(engineers);
if (items.isEmpty()) { if (items.isEmpty()) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
return Result.success(items.get(0)); return Result.success(items.get(0));
} }
@Transactional @Transactional
@Override @Override
public Result<?> engineerSkillUpdate(String engineerCode, List<String> skillGroupIds) { public Result<?> engineerSkillUpdate(String engineerCode, List<String> skillGroupIds) {
// 更新技术员技能 // 更新技术员技能
// 先将所有技能更新为0-不可用状态 // 先将所有技能更新为0-不可用状态
LambdaUpdateWrapper<EngineerSkillGroup> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<EngineerSkillGroup> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(EngineerSkillGroup::getEngineerCode, engineerCode).set(EngineerSkillGroup::getStatus, 0); wrapper.eq(EngineerSkillGroup::getEngineerCode, engineerCode).set(EngineerSkillGroup::getStatus, 0);
engineerSkillGroupMPDao.update(null, wrapper); engineerSkillGroupMPDao.update(null, wrapper);
if (skillGroupIds.isEmpty()) { if (skillGroupIds.isEmpty()) {
return null; return null;
} }
// 更新categoryIds状态为1 // 更新categoryIds状态为1
wrapper.eq(EngineerSkillGroup::getEngineerCode, engineerCode); wrapper.eq(EngineerSkillGroup::getEngineerCode, engineerCode);
wrapper.in(EngineerSkillGroup::getSkillGroupCode, skillGroupIds); wrapper.in(EngineerSkillGroup::getSkillGroupCode, skillGroupIds);
wrapper.set(EngineerSkillGroup::getStatus, 1); wrapper.set(EngineerSkillGroup::getStatus, 1);
int n = engineerSkillGroupMPDao.update(null, wrapper); int n = engineerSkillGroupMPDao.update(null, wrapper);
if (skillGroupIds.size() == n) { if (skillGroupIds.size() == n) {
// 更新记录条数等于提交记录条数 // 更新记录条数等于提交记录条数
return null; return null;
} }
// 可能存在engineerSkill表不存在的记录,需要补充录入 // 可能存在engineerSkill表不存在的记录,需要补充录入
List<Integer> statuses = new ArrayList<Integer>(Arrays.asList(1, 0)); List<Integer> statuses = new ArrayList<Integer>(Arrays.asList(1, 0));
List<String> engineerCodes = new ArrayList<>(Collections.singletonList(engineerCode)); List<String> engineerCodes = new ArrayList<>(Collections.singletonList(engineerCode));
HashMap<String, List<String>> engineerSkills = this.queryEngineerSkills(engineerCodes, statuses); HashMap<String, List<String>> engineerSkills = this.queryEngineerSkills(engineerCodes, statuses);
Set<String> sInput = new HashSet<>(skillGroupIds); Set<String> sInput = new HashSet<>(skillGroupIds);
Set<String> sDB = new HashSet<>(engineerSkills.getOrDefault(engineerCode, new ArrayList<>())); Set<String> sDB = new HashSet<>(engineerSkills.getOrDefault(engineerCode, new ArrayList<>()));
sInput.removeAll(sDB); sInput.removeAll(sDB);
for (String skillGroupId : sInput) { for (String skillGroupId : sInput) {
EngineerSkillGroup e = new EngineerSkillGroup(); EngineerSkillGroup e = new EngineerSkillGroup();
e.setEngineerCode(engineerCode); e.setEngineerCode(engineerCode);
e.setSkillGroupCode(skillGroupId); e.setSkillGroupCode(skillGroupId);
e.setDescription(""); e.setDescription("");
e.setStatus(1); e.setStatus(1);
engineerSkillGroupMPDao.insert(e); engineerSkillGroupMPDao.insert(e);
} }
return null; return null;
} }
@Transactional @Transactional
@Override @Override
public Result<?> getEngineerBusinessList(String levelType, String levelValue, long page, long size, String kind, String key) { public Result<?> getEngineerBusinessList(String levelType, String levelValue, long page, long size, String kind, String key) {
// 技术员业务属性配置列表 // 技术员业务属性配置列表
// 查询技术员列表 // 查询技术员列表
IPage<EngineerInfo> pg = this.queryEngineerInfoIPage(levelType, levelValue, page, size, kind, key); IPage<EngineerInfo> pg = this.queryEngineerInfoIPage(levelType, levelValue, page, size, kind, key);
List<EngineerInfo> engineers = pg.getRecords(); List<EngineerInfo> engineers = pg.getRecords();
// 查询技术员业务属性 // 查询技术员业务属性
EngineerBusinessListResp res = new EngineerBusinessListResp(); EngineerBusinessListResp res = new EngineerBusinessListResp();
res.setTotal(pg.getTotal()); res.setTotal(pg.getTotal());
res.setPages(pg.getPages()); res.setPages(pg.getPages());
res.setPageCurrent(pg.getCurrent()); res.setPageCurrent(pg.getCurrent());
res.setPageSize(pg.getSize()); res.setPageSize(pg.getSize());
res.setContent(this.packEngineerBusinesses(engineers)); res.setContent(this.packEngineerBusinesses(engineers));
return Result.success(res); return Result.success(res);
} }
@Override @Override
public Result<?> getEngineerBusinessDetail(String engineerCode) { public Result<?> getEngineerBusinessDetail(String engineerCode) {
// 获取技术员业务熟悉详情 // 获取技术员业务熟悉详情
List<EngineerInfo> engineers = engineerInfoMPDao.selectByEngineerCode(engineerCode); List<EngineerInfo> engineers = engineerInfoMPDao.selectByEngineerCode(engineerCode);
if (engineers.isEmpty()) { if (engineers.isEmpty()) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
List<?> items = this.packEngineerBusinesses(engineers); List<?> items = this.packEngineerBusinesses(engineers);
if (items.isEmpty()) { if (items.isEmpty()) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
return Result.success(items.get(0)); return Result.success(items.get(0));
} }
@Transactional @Transactional
@Override @Override
public Result<?> engineerBusinessUpdate(String engineerCode, Integer maxNum, Integer maxMinute, String departure, String priority) { public Result<?> engineerBusinessUpdate(String engineerCode, Integer maxNum, Integer maxMinute, String departure, String priority) {
// 技术员业务属性配置修改 // 技术员业务属性配置修改
LambdaUpdateWrapper<EngineerBusiness> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<EngineerBusiness> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(EngineerBusiness::getEngineerCode, engineerCode); wrapper.eq(EngineerBusiness::getEngineerCode, engineerCode);
wrapper.set(maxNum >= 0, EngineerBusiness::getMaxNum, maxNum); wrapper.set(maxNum >= 0, EngineerBusiness::getMaxNum, maxNum);
wrapper.set(maxMinute >= 0, EngineerBusiness::getMaxMinute, maxMinute); wrapper.set(maxMinute >= 0, EngineerBusiness::getMaxMinute, maxMinute);
Integer dep = (departure.equals("配件仓")) ? 1 : 2; Integer dep = (departure.equals("配件仓")) ? 1 : 2;
wrapper.set(EngineerBusiness::getDeparture, dep); wrapper.set(EngineerBusiness::getDeparture, dep);
int pri; int pri;
if (priority.equals("高")) { if (priority.equals("高")) {
pri = 3; pri = 3;
} else if (priority.equals("中")) { } else if (priority.equals("中")) {
pri = 2; pri = 2;
} else { } else {
pri = 1; pri = 1;
} }
wrapper.set(EngineerBusiness::getPriority, pri); wrapper.set(EngineerBusiness::getPriority, pri);
// 更新字段 // 更新字段
engineerBusinessDao.update(null, wrapper); engineerBusinessDao.update(null, wrapper);
return Result.success(null); return Result.success(null);
} }
private IPage<EngineerInfo> queryEngineerInfoIPage(String levelType, String levelValue, long page, long size, String kind, String key) { private IPage<EngineerInfo> queryEngineerInfoIPage(String levelType, String levelValue, long page, long size, String kind, String key) {
// 分页查询工程师基础信息 // 分页查询工程师基础信息
// 查询技术员所在的groupIds // 查询技术员所在的groupIds
LambdaQueryWrapper<OrgGroup> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<OrgGroup> wrapper = new LambdaQueryWrapper<>();
wrapper.select(OrgGroup::getGroupId); wrapper.select(OrgGroup::getGroupId);
wrapper.eq(levelType.equals("cluster"), OrgGroup::getClusterId, levelValue); wrapper.eq(levelType.equals("cluster"), OrgGroup::getClusterId, levelValue);
wrapper.eq(levelType.equals("branch"), OrgGroup::getBranchId, levelValue); wrapper.eq(levelType.equals("branch"), OrgGroup::getBranchId, levelValue);
wrapper.eq(levelType.equals("group"), OrgGroup::getGroupId, levelValue); wrapper.eq(levelType.equals("group"), OrgGroup::getGroupId, levelValue);
List<String> groupIds = orgGroupMPDao.selectList(wrapper).stream().map(OrgGroup::getGroupId).collect(Collectors.toList()); List<String> groupIds = orgGroupMPDao.selectList(wrapper).stream().map(OrgGroup::getGroupId).collect(Collectors.toList());
LambdaQueryWrapper<EngineerInfo> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EngineerInfo> lqw = new LambdaQueryWrapper<>();
lqw.in(groupIds != null && !groupIds.isEmpty(), EngineerInfo::getGroupId, groupIds); lqw.in(groupIds != null && !groupIds.isEmpty(), EngineerInfo::getGroupId, groupIds);
if(StringUtils.isNotEmpty(kind)) { if (StringUtils.isNotEmpty(kind)) {
lqw.eq(EngineerInfo::getKind, (kind.equals("fullJob")) ? 1 : 2); lqw.eq(EngineerInfo::getKind, (kind.equals("fullJob")) ? 1 : 2);
} }
if (StringUtils.isNotEmpty(key)) { if (StringUtils.isNotEmpty(key)) {
lqw.and(w -> lqw.and(w ->
w.like(EngineerInfo::getPhone, key) w.like(EngineerInfo::getPhone, key)
.or() .or()
.like(EngineerInfo::getName, key) .like(EngineerInfo::getName, key)
.or() .or()
.like(EngineerInfo::getEngineerCode, key) .like(EngineerInfo::getEngineerCode, key)
); );
} }
lqw.orderByAsc(EngineerInfo::getGroupId); lqw.orderByAsc(EngineerInfo::getGroupId);
lqw.orderByAsc(EngineerInfo::getEngineerCode); lqw.orderByAsc(EngineerInfo::getEngineerCode);
IPage<EngineerInfo> pg = new Page(page, size); IPage<EngineerInfo> pg = new Page(page, size);
engineerInfoMPDao.selectPage(pg, lqw); engineerInfoMPDao.selectPage(pg, lqw);
return pg; return pg;
} }
private HashMap<String, String> queryGroupNames(List<String> groupIds) { private HashMap<String, String> queryGroupNames(List<String> groupIds) {
//查询小组名称映射关系 //查询小组名称映射关系
HashMap<String, String> map = new HashMap<>(); HashMap<String, String> map = new HashMap<>();
if (groupIds.isEmpty()) { if (groupIds.isEmpty()) {
return map; return map;
} }
LambdaQueryWrapper<OrgGroup> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<OrgGroup> lqw = new LambdaQueryWrapper<>();
lqw.select(OrgGroup::getGroupId, OrgGroup::getGroupName); lqw.select(OrgGroup::getGroupId, OrgGroup::getGroupName);
lqw.in(OrgGroup::getGroupId, groupIds); lqw.in(OrgGroup::getGroupId, groupIds);
List<OrgGroup> groups = orgGroupMPDao.selectList(lqw); List<OrgGroup> groups = orgGroupMPDao.selectList(lqw);
for (OrgGroup g : groups) { for (OrgGroup g : groups) {
map.put(g.getGroupId(), g.getGroupName()); map.put(g.getGroupId(), g.getGroupName());
} }
return map; return map;
} }
private HashMap<String, List<String>> queryEngineerSkills(List<String> engineerCodes, List<Integer> statuses) { private HashMap<String, List<String>> queryEngineerSkills(List<String> engineerCodes, List<Integer> statuses) {
// 获取engineerCode对应的技能表, HashMap<engineerCode, List<skillId>> // 获取engineerCode对应的技能表, HashMap<engineerCode, List<skillId>>
HashMap<String, List<String>> map = new HashMap<>(); HashMap<String, List<String>> map = new HashMap<>();
if (engineerCodes.isEmpty()) { if (engineerCodes.isEmpty()) {
return map; return map;
} }
LambdaQueryWrapper<EngineerSkillGroup> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EngineerSkillGroup> lqw = new LambdaQueryWrapper<>();
lqw.in(EngineerSkillGroup::getEngineerCode, engineerCodes); lqw.in(EngineerSkillGroup::getEngineerCode, engineerCodes);
lqw.in(EngineerSkillGroup::getStatus, statuses); lqw.in(EngineerSkillGroup::getStatus, statuses);
List<EngineerSkillGroup> records = engineerSkillGroupMPDao.selectList(lqw); List<EngineerSkillGroup> records = engineerSkillGroupMPDao.selectList(lqw);
if(records == null || records.isEmpty()) { if (records == null || records.isEmpty()) {
return map; return map;
} }
Comparator<EngineerSkillGroup> ec = Comparator.comparing(EngineerSkillGroup::getEngineerCode, String.CASE_INSENSITIVE_ORDER); Comparator<EngineerSkillGroup> ec = Comparator.comparing(EngineerSkillGroup::getEngineerCode, String.CASE_INSENSITIVE_ORDER);
List<EngineerSkillGroup> results = records.stream().sorted(ec).collect(Collectors.toList()); List<EngineerSkillGroup> results = records.stream().sorted(ec).collect(Collectors.toList());
// 根据engineerCode分组 // 根据engineerCode分组
Map<String, List<EngineerSkillGroup>> g = results.stream().collect(Collectors.groupingBy(EngineerSkillGroup::getEngineerCode)); Map<String, List<EngineerSkillGroup>> g = results.stream().collect(Collectors.groupingBy(EngineerSkillGroup::getEngineerCode));
for (String engineerCode : g.keySet()) { for (String engineerCode : g.keySet()) {
// 技术员技能ID列表 // 技术员技能ID列表
List<String> skillGroupIds = g.get(engineerCode).stream().map(EngineerSkillGroup::getSkillGroupCode).collect(Collectors.toList()); List<String> skillGroupIds = g.get(engineerCode).stream().map(EngineerSkillGroup::getSkillGroupCode).collect(Collectors.toList());
map.put(engineerCode, skillGroupIds); map.put(engineerCode, skillGroupIds);
} }
return map; return map;
} }
private HashMap<String, EngineerBusiness> queryEngineerBusiness(List<String> engineerCodes) { private HashMap<String, EngineerBusiness> queryEngineerBusiness(List<String> engineerCodes) {
HashMap<String, EngineerBusiness> map = new HashMap<>(); HashMap<String, EngineerBusiness> map = new HashMap<>();
if (engineerCodes.isEmpty()) { if (engineerCodes.isEmpty()) {
return map; return map;
} }
LambdaQueryWrapper<EngineerBusiness> lqw = new LambdaQueryWrapper<>(); LambdaQueryWrapper<EngineerBusiness> lqw = new LambdaQueryWrapper<>();
lqw.in(EngineerBusiness::getEngineerCode, engineerCodes); lqw.in(EngineerBusiness::getEngineerCode, engineerCodes);
List<EngineerBusiness> records = engineerBusinessDao.selectList(lqw); List<EngineerBusiness> records = engineerBusinessDao.selectList(lqw);
for (EngineerBusiness r : records) { for (EngineerBusiness r : records) {
map.put(r.getEngineerCode(), r); map.put(r.getEngineerCode(), r);
} }
return map; return map;
} }
private List<EngineerInfoListResp.EngineerInfo> packEngineerInfos(List<EngineerInfo> engineers, HashMap<String, String> groups) { private List<EngineerInfoListResp.EngineerInfo> packEngineerInfos(List<EngineerInfo> engineers, HashMap<String, String> groups) {
String groupName, age, kind; String groupName, age, kind;
List<EngineerInfoListResp.EngineerInfo> items = new ArrayList<>(); List<EngineerInfoListResp.EngineerInfo> items = new ArrayList<>();
for (EngineerInfo e : engineers) { for (EngineerInfo e : engineers) {
EngineerInfoListResp.EngineerInfo item = new EngineerInfoListResp.EngineerInfo(); EngineerInfoListResp.EngineerInfo item = new EngineerInfoListResp.EngineerInfo();
item.setEngineerCode(e.getEngineerCode()); item.setEngineerCode(e.getEngineerCode());
item.setNumber(e.getEngineerCode()); item.setNumber(e.getEngineerCode());
item.setName(e.getName()); item.setName(e.getName());
item.setSex(e.getGender()); item.setSex(e.getGender());
item.setPhone(e.getPhone()); item.setPhone(e.getPhone());
item.setAddress(e.getAddress()); item.setAddress(e.getAddress());
item.setGrade(e.getGrade()); item.setGrade(e.getGrade());
// group name // group name
groupName = groups.getOrDefault(e.getGroupId(), ""); groupName = groups.getOrDefault(e.getGroupId(), "");
item.setGroupName(groupName); item.setGroupName(groupName);
// 年龄 // 年龄
age = this.getEngineerAge(e.getBirth()); age = this.getEngineerAge(e.getBirth());
item.setAge(age); item.setAge(age);
// 工作类型:全职/兼职 // 工作类型:全职/兼职
kind = (e.getKind() == 1) ? "fullJob" : "partJob"; kind = (e.getKind() == 1) ? "fullJob" : "partJob";
item.setKind(kind); item.setKind(kind);
if (e.getCredentials() != null) { if (e.getCredentials() != null) {
item.setCredentials(Arrays.asList(e.getCredentials().split("、"))); item.setCredentials(Arrays.asList(e.getCredentials().split("、")));
} else { } else {
item.setCredentials(new ArrayList<String>()); item.setCredentials(new ArrayList<String>());
} }
// 标签 // 标签
List<String> tags = new ArrayList<>(); List<String> tags = new ArrayList<>();
if (e.getTags() != null && !e.getTags().isEmpty()) { if (e.getTags() != null && !e.getTags().isEmpty()) {
for (Map.Entry<String, Object> entry : e.getTags().entrySet()) { for (Map.Entry<String, Object> entry : e.getTags().entrySet()) {
tags.add(String.format("%s+%s", entry.getKey(), entry.getValue().toString())); tags.add(String.format("%s+%s", entry.getKey(), entry.getValue().toString()));
} }
} }
item.setTags(tags); item.setTags(tags);
items.add(item); items.add(item);
} }
return items; return items;
} }
private List<EngineerSkillListResp.EngineerSkill> packEngineerSkills(List<EngineerInfo> engineers) { private List<EngineerSkillListResp.EngineerSkill> packEngineerSkills(List<EngineerInfo> engineers) {
// 获取groupId类表 // 获取groupId类表
List<String> groupIds = engineers.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList()); List<String> groupIds = engineers.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList());
HashMap<String, String> groupNames = this.queryGroupNames(groupIds); HashMap<String, String> groupNames = this.queryGroupNames(groupIds);
// 获取技术员code列表 // 获取技术员code列表
List<String> engineerCodes = engineers.stream().map(EngineerInfo::getEngineerCode).collect(Collectors.toList()); List<String> engineerCodes = engineers.stream().map(EngineerInfo::getEngineerCode).collect(Collectors.toList());
// 获取技术员的可用技能列表 // 获取技术员的可用技能列表
List<Integer> statuses = Collections.singletonList(1); List<Integer> statuses = Collections.singletonList(1);
HashMap<String, List<String>> engineerSkillGroups = this.queryEngineerSkills(engineerCodes, statuses); HashMap<String, List<String>> engineerSkillGroups = this.queryEngineerSkills(engineerCodes, statuses);
List<String> emptySkills = Collections.emptyList(); List<String> emptySkills = Collections.emptyList();
List<EngineerSkillListResp.EngineerSkill> items = new ArrayList<>(); List<EngineerSkillListResp.EngineerSkill> items = new ArrayList<>();
for (EngineerInfo e : engineers) { for (EngineerInfo e : engineers) {
EngineerSkillListResp.EngineerSkill skill = new EngineerSkillListResp.EngineerSkill(); EngineerSkillListResp.EngineerSkill skill = new EngineerSkillListResp.EngineerSkill();
skill.setEngineerCode(e.getEngineerCode()); skill.setEngineerCode(e.getEngineerCode());
skill.setEngineerName(e.getName()); skill.setEngineerName(e.getName());
skill.setGroupName(groupNames.getOrDefault(e.getGroupId(), "")); skill.setGroupName(groupNames.getOrDefault(e.getGroupId(), ""));
skill.setUpdateTime(TimeUtils.IsoTimestamp2DateTime(e.getUpdateTime())); skill.setUpdateTime(TimeUtils.IsoTimestamp2DateTime(e.getUpdateTime()));
// 获取一个工程师的技能列表 // 获取一个工程师的技能列表
skill.setSkillGroupIds(engineerSkillGroups.getOrDefault(e.getEngineerCode(), emptySkills)); skill.setSkillGroupIds(engineerSkillGroups.getOrDefault(e.getEngineerCode(), emptySkills));
items.add(skill); items.add(skill);
} }
return items; return items;
} }
private List<EngineerBusinessListResp.EngineerBusiness> packEngineerBusinesses(List<EngineerInfo> engineers) { private List<EngineerBusinessListResp.EngineerBusiness> packEngineerBusinesses(List<EngineerInfo> engineers) {
// 获取技术员code列表 // 获取技术员code列表
List<String> engineerCodes = engineers.stream().map(EngineerInfo::getEngineerCode).collect(Collectors.toList()); List<String> engineerCodes = engineers.stream().map(EngineerInfo::getEngineerCode).collect(Collectors.toList());
List<String> groupIds = engineers.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList()); List<String> groupIds = engineers.stream().map(EngineerInfo::getGroupId).collect(Collectors.toList());
HashMap<String, String> groupNames = this.queryGroupNames(groupIds); HashMap<String, String> groupNames = this.queryGroupNames(groupIds);
HashMap<String, EngineerBusiness> buss = this.queryEngineerBusiness(engineerCodes); HashMap<String, EngineerBusiness> buss = this.queryEngineerBusiness(engineerCodes);
List<EngineerBusinessListResp.EngineerBusiness> items = new ArrayList<>(); List<EngineerBusinessListResp.EngineerBusiness> items = new ArrayList<>();
for (EngineerInfo e : engineers) { for (EngineerInfo e : engineers) {
EngineerBusinessListResp.EngineerBusiness item = new EngineerBusinessListResp.EngineerBusiness(); EngineerBusinessListResp.EngineerBusiness item = new EngineerBusinessListResp.EngineerBusiness();
item.setEngineerCode(e.getEngineerCode()); item.setEngineerCode(e.getEngineerCode());
item.setGroupName(groupNames.getOrDefault(e.getGroupId(), "")); item.setGroupName(groupNames.getOrDefault(e.getGroupId(), ""));
item.setEngineerName(e.getName()); item.setEngineerName(e.getName());
item.setKind((e.getKind() == 1) ? "fullJob" : "partJob"); item.setKind((e.getKind() == 1) ? "fullJob" : "partJob");
EngineerBusiness b = buss.getOrDefault(e.getEngineerCode(), null); EngineerBusiness b = buss.getOrDefault(e.getEngineerCode(), null);
if (b == null) { if (b == null) {
item.setAddress(""); item.setAddress("");
item.setLocation(""); item.setLocation("");
item.setDeparture(""); item.setDeparture("");
item.setMaxMinute(0); item.setMaxMinute(0);
item.setMaxNum(0); item.setMaxNum(0);
item.setPriority("低"); item.setPriority("低");
} else { } else {
item.setAddress(b.getAddress()); item.setAddress(b.getAddress());
item.setLocation(String.format("%s,%s", b.getX(), b.getY())); item.setLocation(String.format("%s,%s", b.getX(), b.getY()));
item.setDeparture((b.getDeparture() == 1) ? "配件仓" : "住址"); item.setDeparture((b.getDeparture() == 1) ? "配件仓" : "住址");
item.setMaxMinute(b.getMaxMinute()); item.setMaxMinute(b.getMaxMinute());
item.setMaxNum(b.getMaxNum()); item.setMaxNum(b.getMaxNum());
String priority; String priority;
if (b.getPriority() == 3) { if (b.getPriority() == 3) {
priority = "高"; priority = "高";
} else if (b.getPriority() == 2) { } else if (b.getPriority() == 2) {
priority = "中"; priority = "中";
} else { } else {
priority = "低"; priority = "低";
} }
item.setPriority(priority); item.setPriority(priority);
} }
items.add(item); items.add(item);
} }
return items; return items;
} }
private HashMap<String, Integer> getEngineerSkillIds(List<String> skillIds, HashMap<String, Integer> engineerSkillIds) { private HashMap<String, Integer> getEngineerSkillIds(List<String> skillIds, HashMap<String, Integer> engineerSkillIds) {
HashMap<String, Integer> map = new HashMap<>(); HashMap<String, Integer> map = new HashMap<>();
for (String skillId : skillIds) { for (String skillId : skillIds) {
map.put(skillId, engineerSkillIds.getOrDefault(skillId, 0)); map.put(skillId, engineerSkillIds.getOrDefault(skillId, 0));
} }
return map; return map;
} }
private String getEngineerAge(String birth) { private String getEngineerAge(String birth) {
// 获取工程师年龄 // 获取工程师年龄
if (birth.isEmpty()) { if (birth.isEmpty()) {
return ""; return "";
} }
int age; int age;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try { try {
Date birthDate = dateFormat.parse(birth); Date birthDate = dateFormat.parse(birth);
Calendar birthCalendar = Calendar.getInstance(); Calendar birthCalendar = Calendar.getInstance();
birthCalendar.setTime(birthDate); birthCalendar.setTime(birthDate);
Calendar nowCalendar = Calendar.getInstance(); Calendar nowCalendar = Calendar.getInstance();
age = nowCalendar.get(Calendar.YEAR) - birthCalendar.get(Calendar.YEAR); age = nowCalendar.get(Calendar.YEAR) - birthCalendar.get(Calendar.YEAR);
if (nowCalendar.get(Calendar.DAY_OF_YEAR) < birthCalendar.get(Calendar.DAY_OF_YEAR)) { if (nowCalendar.get(Calendar.DAY_OF_YEAR) < birthCalendar.get(Calendar.DAY_OF_YEAR)) {
age--; age--;
} }
} catch (Exception e) { } catch (Exception e) {
return ""; return "";
} }
return (age <= 0) ? "" : Integer.toString(age); return (age <= 0) ? "" : Integer.toString(age);
} }
@Override @Override
public Result<?> getEngineersGanttList(EngineersGanttReqDTO reqDTO) { public Result<?> getEngineersGanttList(EngineersGanttReqDTO reqDTO) {
// 按日期返回技术员们当天的服务甘特图,不需要翻页 // 按日期返回技术员们当天的服务甘特图,不需要翻页
log.info("getEngineersGanttList: {}", reqDTO); log.info("getEngineersGanttList: {}", reqDTO);
List<OrderAppointmentEntity> orderAppointments = orderAppointmentDao.findByDateAndEngineerCodeIn(reqDTO.getDate(), reqDTO.getEngineerCodes()); List<OrderAppointmentEntity> orderAppointments = orderAppointmentDao.findByDateAndEngineerCodeIn(reqDTO.getDate(), reqDTO.getEngineerCodes());
List<String> orderIds = orderAppointments.stream().map(OrderAppointmentEntity::getOrderId).collect(Collectors.toList()); List<String> orderIds = orderAppointments.stream().map(OrderAppointmentEntity::getOrderId).collect(Collectors.toList());
Map<String, OrderRequestEntity> mapOrderRequest = getOrdersByOrderIds(orderIds); Map<String, OrderRequestEntity> mapOrderRequest = getOrdersByOrderIds(orderIds);
HashMap<String, List<EngineersGanttRespDTO.Order>> mapEngineers = new HashMap<>(); HashMap<String, List<EngineersGanttRespDTO.Order>> mapEngineers = new HashMap<>();
for (OrderAppointmentEntity e : orderAppointments) { for (OrderAppointmentEntity e : orderAppointments) {
log.info("===== order_id: [{}]", e.getOrderId()); log.info("===== order_id: [{}]", e.getOrderId());
EngineersGanttRespDTO.Order order = new EngineersGanttRespDTO.Order(); EngineersGanttRespDTO.Order order = new EngineersGanttRespDTO.Order();
// todo 需要根据订单时间和状态,采用expectXXXX或者actualXXXX // todo 需要根据订单时间和状态,采用expectXXXX或者actualXXXX
order.setStartTime(e.getExpectStartTime()).setEndTime(e.getExpectEndTime()); order.setStartTime(e.getExpectStartTime()).setEndTime(e.getExpectEndTime());
order.setOrderId(e.getOrderId()).setPreStatus(e.getPreStatus()); order.setOrderId(e.getOrderId()).setPreStatus(e.getPreStatus());
order.setTips(getOrderTips(e.getOrderId())); order.setTips(getOrderTips(e.getOrderId()));
order.setAppointmentStatus(mapOrderRequest.get(e.getOrderId()).getAppointmentStatus()); order.setAppointmentStatus(mapOrderRequest.get(e.getOrderId()).getAppointmentStatus());
List<EngineersGanttRespDTO.Order> orders = null; List<EngineersGanttRespDTO.Order> orders = null;
if (mapEngineers.containsKey(e.getEngineerCode())) { if (mapEngineers.containsKey(e.getEngineerCode())) {
orders = mapEngineers.get(e.getEngineerCode()); orders = mapEngineers.get(e.getEngineerCode());
} else { } else {
orders = new ArrayList<>(); orders = new ArrayList<>();
} }
orders.add(order); orders.add(order);
mapEngineers.put(e.getEngineerCode(), orders); mapEngineers.put(e.getEngineerCode(), orders);
} }
List<EngineersGanttRespDTO.GanttChart> engineers = new ArrayList<>(); List<EngineersGanttRespDTO.GanttChart> engineers = new ArrayList<>();
for (String engineerCode : reqDTO.getEngineerCodes()) { for (String engineerCode : reqDTO.getEngineerCodes()) {
EngineerInfoEntity engineerInfo = engineerInfoDao.getByEngineerCode(engineerCode); EngineerInfoEntity engineerInfo = engineerInfoDao.getByEngineerCode(engineerCode);
EngineersGanttRespDTO.GanttChart engineer = new EngineersGanttRespDTO.GanttChart(); EngineersGanttRespDTO.GanttChart engineer = new EngineersGanttRespDTO.GanttChart();
engineer.setEngineerCode(engineerCode) engineer.setEngineerCode(engineerCode)
.setStartTime(String.format("%s 08:00", reqDTO.getDate())) .setStartTime(String.format("%s 08:00", reqDTO.getDate()))
.setEndTime(String.format("%s 18:00", reqDTO.getDate())) .setEndTime(String.format("%s 18:00", reqDTO.getDate()))
.setHoliday(false) // todo .setHoliday(false) // todo
.setEngineerName(engineerInfo.getName()) .setEngineerName(engineerInfo.getName())
.setGrade(engineerInfo.getGrade()); .setGrade(engineerInfo.getGrade());
CapacityEngineerStatEntity capacityEngineerStat = capacityEngineerStatDao.getByEngineerCodeAndWorkday(engineerCode, reqDTO.getDate()); CapacityEngineerStatEntity capacityEngineerStat = capacityEngineerStatDao.getByEngineerCodeAndWorkday(engineerCode, reqDTO.getDate());
if (capacityEngineerStat == null) { if (capacityEngineerStat == null) {
log.warn("技术员当日的容量数据不存在,{}{}", engineerCode, reqDTO.getDate()); log.warn("技术员当日的容量数据不存在,{}{}", engineerCode, reqDTO.getDate());
} else { } else {
engineer.setCapTotal(capacityEngineerStat.getCapTotal().toString()).setCapUsed(capacityEngineerStat.getCapUsed().toString()); engineer.setCapTotal(capacityEngineerStat.getCapTotal().toString()).setCapUsed(capacityEngineerStat.getCapUsed().toString());
} }
if (mapEngineers.containsKey(engineerCode)) { if (mapEngineers.containsKey(engineerCode)) {
engineer.setOrders(mapEngineers.get(engineerCode)); engineer.setOrders(mapEngineers.get(engineerCode));
} }
// engineer.setErrorTip(); todo // engineer.setErrorTip(); todo
engineers.add(engineer); engineers.add(engineer);
} }
EngineersGanttRespDTO data = new EngineersGanttRespDTO().setDate(reqDTO.getDate()).setEngineers(engineers); EngineersGanttRespDTO data = new EngineersGanttRespDTO().setDate(reqDTO.getDate()).setEngineers(engineers);
return Result.success(data); return Result.success(data);
} }
public Map<String, OrderRequestEntity> getOrdersByOrderIds(List<String> orderIds) { public Map<String, OrderRequestEntity> getOrdersByOrderIds(List<String> orderIds) {
List<OrderRequestEntity> orders = orderRequestDao.findAllByOrderIdIn(orderIds); List<OrderRequestEntity> orders = orderRequestDao.findAllByOrderIdIn(orderIds);
return orders.stream() return orders.stream()
.collect(Collectors.toMap(OrderRequestEntity::getOrderId, order -> order)); .collect(Collectors.toMap(OrderRequestEntity::getOrderId, order -> order));
} }
private List<?> getOrderTips(String orderId) { private List<?> getOrderTips(String orderId) {
log.info("==> getOrderTips: orderId[{}]", orderId); log.info("==> getOrderTips: orderId[{}]", orderId);
OrderRequestEntity order = orderRequestDao.getByOrderId(orderId); OrderRequestEntity order = orderRequestDao.getByOrderId(orderId);
if (order == null) { if (order == null) {
log.error("对应的订单不存在!{}", orderId); log.error("对应的订单不存在!{}", orderId);
return null; return null;
} }
List<LabelValueDTO> tips = new ArrayList<>(); List<LabelValueDTO> tips = new ArrayList<>();
tips.add(new LabelValueDTO().setLabel("工单号码").setValue(orderId)); tips.add(new LabelValueDTO().setLabel("工单号码").setValue(orderId));
tips.add(new LabelValueDTO().setLabel("类型/品牌").setValue(String.format("%s %s", order.getBrand(), order.getType()))); tips.add(new LabelValueDTO().setLabel("类型/品牌").setValue(String.format("%s %s", order.getBrand(), order.getType())));
tips.add(new LabelValueDTO().setLabel("电话/地址").setValue(String.format("%s %s\n %s", order.getName(), order.getPhone(), order.getAddress()))); tips.add(new LabelValueDTO().setLabel("电话/地址").setValue(String.format("%s %s\n %s", order.getName(), order.getPhone(), order.getAddress())));
if (StringUtils.isNotBlank(order.getApplyNote())) { if (StringUtils.isNotBlank(order.getApplyNote())) {
tips.add(new LabelValueDTO().setLabel("备注").setValue(order.getApplyNote())); tips.add(new LabelValueDTO().setLabel("备注").setValue(order.getApplyNote()));
} }
tips.add(new LabelValueDTO().setLabel("标签").setValue(order.getTags())); tips.add(new LabelValueDTO().setLabel("标签").setValue(order.getTags()));
return tips; return tips;
} }
private String Timestamp2Datetime(Timestamp t, String pattern) {
DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
return df.format(t.toLocalDateTime());
}
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!