Commit 6e04d794 by huangjinxin

fix:格式化代码

1 parent b9ee0b92
...@@ -28,9 +28,9 @@ import java.util.*; ...@@ -28,9 +28,9 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
interface GroupTag { interface GroupTag {
// 订单分类tag // 订单分类tag
String getGroupTag(OrderInfoEntity order); String getGroupTag(OrderInfoEntity order);
} }
...@@ -38,625 +38,625 @@ interface GroupTag { ...@@ -38,625 +38,625 @@ interface GroupTag {
@Service @Service
public class DispatchServiceImpl implements DispatchService { public class DispatchServiceImpl implements DispatchService {
@Autowired @Autowired
private OrderInfoDao orderInfoDao; private OrderInfoDao orderInfoDao;
@Autowired @Autowired
private OrgTeamDao orgTeamDao; private OrgTeamDao orgTeamDao;
@Autowired @Autowired
private EngineerInfoDao engineerInfoDao; private EngineerInfoDao engineerInfoDao;
@Autowired @Autowired
private SkillInfoDao skillInfoDao; private SkillInfoDao skillInfoDao;
@Autowired @Autowired
private CapacityEngineerStatDao capacityEngineerStatDao; private CapacityEngineerStatDao capacityEngineerStatDao;
@Autowired @Autowired
private EntityManager entityManager; private EntityManager entityManager;
@Transactional @Transactional
@Override @Override
public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) { public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) {
// 获取派工台订单列表 // 获取派工台订单列表
// 获取技能信息 // 获取技能信息
HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo(); HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo();
// 获取工单列表 // 获取工单列表
List<OrderInfoEntity> orders = this.queryOrders(reqDTO); List<OrderInfoEntity> orders = this.queryOrders(reqDTO);
// 获取分组标签 // 获取分组标签
GroupTag gt = new GroupTagFactory().getGroupTag(reqDTO.getGroupTagId()); GroupTag gt = new GroupTagFactory().getGroupTag(reqDTO.getGroupTagId());
List<DispatchOrderListResp.Order> items = new ArrayList<>(); List<DispatchOrderListResp.Order> items = new ArrayList<>();
for (OrderInfoEntity o : orders) { for (OrderInfoEntity o : orders) {
DispatchOrderListResp.Order item = new DispatchOrderListResp.Order(); DispatchOrderListResp.Order item = new DispatchOrderListResp.Order();
item.setOrderId(o.getOrderId()); item.setOrderId(o.getOrderId());
item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(), item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(),
o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress())); o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress()));
item.setBrand(o.getBrand()); item.setBrand(o.getBrand());
item.setType(o.getType()); item.setType(o.getType());
item.setSkill(o.getSkill()); item.setSkill(o.getSkill());
item.setFaultDescribe(o.getFaultDescribe()); item.setFaultDescribe(o.getFaultDescribe());
item.setApplyNote(o.getApplyNote()); item.setApplyNote(o.getApplyNote());
String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill()); String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill());
SkillInfoEntity skill = skillInfo.get(key); SkillInfoEntity skill = skillInfo.get(key);
if (skill != null) { if (skill != null) {
item.setDuration(skill.getTakeTime()); item.setDuration(skill.getTakeTime());
item.setSkillCategory(skill.getSkillCategory()); item.setSkillCategory(skill.getSkillCategory());
item.setTypeCategory(skill.getTypeCategory()); item.setTypeCategory(skill.getTypeCategory());
} }
item.setName(o.getName()); item.setName(o.getName());
item.setPhone(o.getPhone()); item.setPhone(o.getPhone());
item.setCity(o.getCity()); item.setCity(o.getCity());
item.setAddress(o.getAddress()); item.setAddress(o.getAddress());
item.setProvince(o.getProvince()); item.setProvince(o.getProvince());
item.setCity(o.getCity()); item.setCity(o.getCity());
item.setCounty(o.getCounty()); item.setCounty(o.getCounty());
item.setAddress(o.getAddress()); item.setAddress(o.getAddress());
item.setName(o.getName()); item.setName(o.getName());
item.setPhone(o.getPhone()); item.setPhone(o.getPhone());
item.setExpectTimeDesc(o.getExpectTimeDesc()); item.setExpectTimeDesc(o.getExpectTimeDesc());
item.setSource(o.getSource()); item.setSource(o.getSource());
item.setDispatcher(o.getDispatcher()); item.setDispatcher(o.getDispatcher());
item.setAppointmentType(o.getAppointmentMethod()); item.setAppointmentType(o.getAppointmentMethod());
item.setAppointmentStatus(o.getAppointmentStatus()); item.setAppointmentStatus(o.getAppointmentStatus());
item.setOrderStatus(o.getOrderStatus()); item.setOrderStatus(o.getOrderStatus());
item.setServiceStatus(o.getServiceStatus()); item.setServiceStatus(o.getServiceStatus());
item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime())); item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
String[] tags = gt.getGroupTag(o).split("#"); String[] tags = gt.getGroupTag(o).split("#");
item.setGroupTag(tags[0]); // 设置tag名称 item.setGroupTag(tags[0]); // 设置tag名称
item.setGroupWeight(Integer.parseInt(tags[1])); // 设置tag权重 item.setGroupWeight(Integer.parseInt(tags[1])); // 设置tag权重
items.add(item); items.add(item);
} }
DispatchOrderListResp res = new DispatchOrderListResp(); DispatchOrderListResp res = new DispatchOrderListResp();
res.setOrders(items); res.setOrders(items);
return Result.success(res); return Result.success(res);
} }
@Transactional @Transactional
@Override @Override
public Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO) throws BusinessException { public Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO) throws BusinessException {
// 派工台技术员预约单列表 // 派工台技术员预约单列表
LocalDate date = TimeUtils.IsoDate2LocalDate(reqDTO.getDate()); LocalDate date = TimeUtils.IsoDate2LocalDate(reqDTO.getDate());
// 获取技能信息 // 获取技能信息
HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo(); HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo();
// 获取teamIds // 获取teamIds
List<String> teamIds = this.queryOrgTeamIds(reqDTO.getLevelType(), reqDTO.getLevelValue(), reqDTO.getBranchIds(), List<String> teamIds = this.queryOrgTeamIds(reqDTO.getLevelType(), reqDTO.getLevelValue(), reqDTO.getBranchIds(),
reqDTO.getGroupIds(), reqDTO.getTeamIds()); reqDTO.getGroupIds(), reqDTO.getTeamIds());
if (teamIds.isEmpty()) { if (teamIds.isEmpty()) {
throw new BusinessException("大区/分部/小组组织结构配置可能错误或缺失,请联系管理员/研发"); throw new BusinessException("大区/分部/小组组织结构配置可能错误或缺失,请联系管理员/研发");
} }
// 获取engineer列表 // 获取engineer列表
List<EngineerInfoEntity> engineers = this.queryEngineers(teamIds, reqDTO.getEngineerCodes(), reqDTO.getKey()); List<EngineerInfoEntity> engineers = this.queryEngineers(teamIds, reqDTO.getEngineerCodes(), reqDTO.getKey());
if (engineers.isEmpty()) { if (engineers.isEmpty()) {
// 该group下没有技术员,返回空 // 该group下没有技术员,返回空
log.warn("没有找到技术员"); log.warn("没有找到技术员");
DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp(); DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp();
List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>(); List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>();
res.setEngineers(egs); res.setEngineers(egs);
return Result.success(res); return Result.success(res);
} }
// 获取engineerCodes // 获取engineerCodes
List<String> engineerCodes = engineers.stream().map(EngineerInfoEntity::getEngineerCode).collect(Collectors.toList()); List<String> engineerCodes = engineers.stream().map(EngineerInfoEntity::getEngineerCode).collect(Collectors.toList());
// 获取技术员已指派单列表 // 获取技术员已指派单列表
Map<String, List<OrderInfoEntity>> engineerOrders = this.queryEngineerOrders(engineerCodes, date); Map<String, List<OrderInfoEntity>> engineerOrders = this.queryEngineerOrders(engineerCodes, date);
// 获取技术员的容量 // 获取技术员的容量
HashMap<String, CapacityEngineerStatEntity> engineerCap = this.queryCapacityEngineerStat(engineerCodes, reqDTO.getDate()); HashMap<String, CapacityEngineerStatEntity> engineerCap = this.queryCapacityEngineerStat(engineerCodes, reqDTO.getDate());
// 获取技术员已指派单列表 // 获取技术员已指派单列表
List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>(); List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>();
for (EngineerInfoEntity e : engineers) { for (EngineerInfoEntity e : engineers) {
List<DispatchEngineerOrderListResp.OrderInfo> items = new ArrayList<>(); List<DispatchEngineerOrderListResp.OrderInfo> items = new ArrayList<>();
// 技术员已指派的订单列表 // 技术员已指派的订单列表
List<OrderInfoEntity> records = engineerOrders.getOrDefault(e.getEngineerCode(), new ArrayList<>()); List<OrderInfoEntity> records = engineerOrders.getOrDefault(e.getEngineerCode(), new ArrayList<>());
for (OrderInfoEntity o : records) { for (OrderInfoEntity o : records) {
DispatchEngineerOrderListResp.OrderInfo item = new DispatchEngineerOrderListResp.OrderInfo(); DispatchEngineerOrderListResp.OrderInfo item = new DispatchEngineerOrderListResp.OrderInfo();
item.setOrderId(o.getOrderId()); item.setOrderId(o.getOrderId());
item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(), item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(),
o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress())); o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress()));
item.setBrand(o.getBrand()); item.setBrand(o.getBrand());
item.setType(o.getType()); item.setType(o.getType());
item.setSkill(o.getSkill()); item.setSkill(o.getSkill());
item.setFaultDescribe(o.getFaultDescribe()); item.setFaultDescribe(o.getFaultDescribe());
item.setApplyNote(o.getApplyNote()); item.setApplyNote(o.getApplyNote());
String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill()); String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill());
SkillInfoEntity skill = skillInfo.get(key); SkillInfoEntity skill = skillInfo.get(key);
if (skill != null) { if (skill != null) {
item.setDuration(skill.getTakeTime()); item.setDuration(skill.getTakeTime());
item.setSkillCategory(skill.getSkillCategory()); item.setSkillCategory(skill.getSkillCategory());
item.setTypeCategory(skill.getTypeCategory()); item.setTypeCategory(skill.getTypeCategory());
} }
item.setName(o.getName()); item.setName(o.getName());
item.setPhone(o.getPhone()); item.setPhone(o.getPhone());
item.setCity(o.getCity()); item.setCity(o.getCity());
item.setAddress(o.getAddress()); item.setAddress(o.getAddress());
item.setProvince(o.getProvince()); item.setProvince(o.getProvince());
item.setCity(o.getCity()); item.setCity(o.getCity());
item.setCounty(o.getCounty()); item.setCounty(o.getCounty());
item.setAddress(o.getAddress()); item.setAddress(o.getAddress());
item.setName(o.getName()); item.setName(o.getName());
item.setPhone(o.getPhone()); item.setPhone(o.getPhone());
String time = TimeUtils.localDateTime2String(o.getPlanStartTime(), "HH:mm"); String time = TimeUtils.localDateTime2String(o.getPlanStartTime(), "HH:mm");
String timeSlot = this.parseTimeSlot(o.getPlanStartTime()); String timeSlot = this.parseTimeSlot(o.getPlanStartTime());
item.setExpectTimeDesc(String.format("%s/%s", time, timeSlot)); item.setExpectTimeDesc(String.format("%s/%s", time, timeSlot));
item.setSource(o.getSource()); item.setSource(o.getSource());
item.setDispatcher(o.getDispatcher()); item.setDispatcher(o.getDispatcher());
item.setAppointmentType(o.getAppointmentMethod()); item.setAppointmentType(o.getAppointmentMethod());
item.setAppointmentStatus(o.getAppointmentStatus()); item.setAppointmentStatus(o.getAppointmentStatus());
item.setOrderStatus(o.getOrderStatus()); // 订单状态 item.setOrderStatus(o.getOrderStatus()); // 订单状态
item.setServiceStatus(o.getServiceStatus()); item.setServiceStatus(o.getServiceStatus());
item.setOrderStatusDesc(OrderStatus.valueOf(o.getOrderStatus()).getDescription()); item.setOrderStatusDesc(OrderStatus.valueOf(o.getOrderStatus()).getDescription());
item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime())); item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
items.add(item); items.add(item);
} }
// 获取容量 // 获取容量
int capUsed = 0; int capUsed = 0;
int capTotal = 0; int capTotal = 0;
String capacityStatus = "less"; String capacityStatus = "less";
CapacityEngineerStatEntity cap = engineerCap.get(e.getEngineerCode()); CapacityEngineerStatEntity cap = engineerCap.get(e.getEngineerCode());
if (cap != null) { if (cap != null) {
capUsed = cap.getCapUsed(); capUsed = cap.getCapUsed();
capTotal = cap.getCapTotal(); capTotal = cap.getCapTotal();
if (capTotal > 0 && (float) capUsed / capTotal < 0.8) { if (capTotal > 0 && (float) capUsed / capTotal < 0.8) {
capacityStatus = "normal"; capacityStatus = "normal";
} }
} }
DispatchEngineerOrderListResp.EngineerInfo eg = new DispatchEngineerOrderListResp.EngineerInfo(); DispatchEngineerOrderListResp.EngineerInfo eg = new DispatchEngineerOrderListResp.EngineerInfo();
eg.setOrders(items); eg.setOrders(items);
eg.setEngineerCode(e.getEngineerCode()); eg.setEngineerCode(e.getEngineerCode());
eg.setEngineerName(e.getName()); eg.setEngineerName(e.getName());
eg.setGrade(e.getGrade()); eg.setGrade(e.getGrade());
eg.setCapacity(String.format("%d/%d", capUsed, capTotal)); eg.setCapacity(String.format("%d/%d", capUsed, capTotal));
eg.setCapacityStatus(capacityStatus); eg.setCapacityStatus(capacityStatus);
egs.add(eg); egs.add(eg);
} }
DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp(); DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp();
res.setEngineers(egs); res.setEngineers(egs);
return Result.success(res); return Result.success(res);
} }
@Transactional @Transactional
@Override @Override
public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException { public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException {
// 派工台确认派单 // 派工台确认派单
LocalDate localDate = TimeUtils.IsoDate2LocalDate(date); LocalDate localDate = TimeUtils.IsoDate2LocalDate(date);
EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode); EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode);
if (engineer == null) { if (engineer == null) {
throw new BusinessException("技术员不存在"); throw new BusinessException("技术员不存在");
} }
List<OrderInfoEntity> orders = orderInfoDao.findAllByDtAndOrderIdIn(localDate, orderIds); List<OrderInfoEntity> orders = orderInfoDao.findAllByDtAndOrderIdIn(localDate, orderIds);
if (ListUtils.isEmpty(orders)) { if (ListUtils.isEmpty(orders)) {
throw new BusinessException("订单不存在"); throw new BusinessException("订单不存在");
} }
// 已经指派的订单 // 已经指派的订单
List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(localDate, engineerCode); List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(localDate, engineerCode);
engineerOrders.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime)); // 按照planStartTime排序 engineerOrders.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime)); // 按照planStartTime排序
List<OrderInfoEntity> orderAppointments = engineerOrders.stream() List<OrderInfoEntity> orderAppointments = engineerOrders.stream()
.filter(o -> o.getOrderStatus().equals("NORMAL")) .filter(o -> o.getOrderStatus().equals("NORMAL"))
.collect(Collectors.toList()); // 过滤,只有NORMAL订单才需要处理,取消订单不需要处理 .collect(Collectors.toList()); // 过滤,只有NORMAL订单才需要处理,取消订单不需要处理
// TODO,临时处理方案,后续调用派单引擎处理 // TODO,临时处理方案,后续调用派单引擎处理
OrderRequestScheduler scheduler = new OrderRequestScheduler(); OrderRequestScheduler scheduler = new OrderRequestScheduler();
List<LineSegment> results = scheduler.scheduler(orders, orderAppointments); List<LineSegment> results = scheduler.scheduler(orders, orderAppointments);
for (LineSegment r : results) { for (LineSegment r : results) {
String orderId = r.id; String orderId = r.id;
LocalDateTime planStartTime = scheduler.linePoint2DateTime(r.start, date); LocalDateTime planStartTime = scheduler.linePoint2DateTime(r.start, date);
LocalDateTime planEndTime = scheduler.linePoint2DateTime(r.end, date); LocalDateTime planEndTime = scheduler.linePoint2DateTime(r.end, date);
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaUpdate<OrderInfoEntity> update = criteriaBuilder.createCriteriaUpdate(OrderInfoEntity.class); CriteriaUpdate<OrderInfoEntity> update = criteriaBuilder.createCriteriaUpdate(OrderInfoEntity.class);
Root<OrderInfoEntity> root = update.from(OrderInfoEntity.class); Root<OrderInfoEntity> root = update.from(OrderInfoEntity.class);
update.set(root.get("planStartTime"), planStartTime); update.set(root.get("planStartTime"), planStartTime);
update.set(root.get("planEndTime"), planEndTime); update.set(root.get("planEndTime"), planEndTime);
update.set(root.get("appointmentStatus"), "CONFIRM"); update.set(root.get("appointmentStatus"), "CONFIRM");
update.set(root.get("appointmentMethod"), "MANUAL"); update.set(root.get("appointmentMethod"), "MANUAL");
update.set(root.get("engineerCode"), engineerCode); update.set(root.get("engineerCode"), engineerCode);
update.where( update.where(
criteriaBuilder.equal(root.get("orderId"), orderId), criteriaBuilder.equal(root.get("orderId"), orderId),
criteriaBuilder.equal(root.get("dt"), localDate) criteriaBuilder.equal(root.get("dt"), localDate)
); );
entityManager.createQuery(update).executeUpdate(); entityManager.createQuery(update).executeUpdate();
} }
return Result.success(null); return Result.success(null);
} }
private List<OrderInfoEntity> queryOrders(DispatchOrderListReq reqDTO) { private List<OrderInfoEntity> queryOrders(DispatchOrderListReq reqDTO) {
// 获取服务单列表 // 获取服务单列表
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<OrderInfoEntity> criteriaQuery = criteriaBuilder.createQuery(OrderInfoEntity.class); CriteriaQuery<OrderInfoEntity> criteriaQuery = criteriaBuilder.createQuery(OrderInfoEntity.class);
Root<OrderInfoEntity> root = criteriaQuery.from(OrderInfoEntity.class); Root<OrderInfoEntity> root = criteriaQuery.from(OrderInfoEntity.class);
List<Predicate> predicates = new ArrayList<>(); List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("dt"), TimeUtils.IsoDate2LocalDate(reqDTO.getDate()))); predicates.add(criteriaBuilder.equal(root.get("dt"), TimeUtils.IsoDate2LocalDate(reqDTO.getDate())));
predicates.add(criteriaBuilder.equal(root.get("appointmentStatus"), "INIT")); predicates.add(criteriaBuilder.equal(root.get("appointmentStatus"), "INIT"));
String levelType = reqDTO.getLevelType(); String levelType = reqDTO.getLevelType();
String levelValue = reqDTO.getLevelValue(); String levelValue = reqDTO.getLevelValue();
if ("cluster".equals(levelType)) { if ("cluster".equals(levelType)) {
predicates.add(criteriaBuilder.equal(root.get("orgClusterId"), levelValue)); predicates.add(criteriaBuilder.equal(root.get("orgClusterId"), levelValue));
} else if ("branch".equals(levelType)) { } else if ("branch".equals(levelType)) {
predicates.add(criteriaBuilder.equal(root.get("orgBranchId"), levelValue)); predicates.add(criteriaBuilder.equal(root.get("orgBranchId"), levelValue));
} else if ("group".equals(levelType)) { } else if ("group".equals(levelType)) {
predicates.add(criteriaBuilder.equal(root.get("orgGroupId"), levelValue)); predicates.add(criteriaBuilder.equal(root.get("orgGroupId"), levelValue));
} }
// 筛选项 // 筛选项
if (StringUtils.isNotEmpty(reqDTO.getPhone())) { if (StringUtils.isNotEmpty(reqDTO.getPhone())) {
predicates.add(criteriaBuilder.equal(root.get("phone"), reqDTO.getPhone())); predicates.add(criteriaBuilder.equal(root.get("phone"), reqDTO.getPhone()));
} }
if (StringUtils.isNotEmpty(reqDTO.getOrderId())) { if (StringUtils.isNotEmpty(reqDTO.getOrderId())) {
predicates.add(criteriaBuilder.equal(root.get("orderId"), reqDTO.getOrderId())); predicates.add(criteriaBuilder.equal(root.get("orderId"), reqDTO.getOrderId()));
} }
if (ListUtils.isNotEmpty(reqDTO.getBranchIds())) { if (ListUtils.isNotEmpty(reqDTO.getBranchIds())) {
predicates.add(root.get("orgBranchId").in(reqDTO.getBranchIds())); predicates.add(root.get("orgBranchId").in(reqDTO.getBranchIds()));
} }
if (ListUtils.isNotEmpty(reqDTO.getGroupIds())) { if (ListUtils.isNotEmpty(reqDTO.getGroupIds())) {
predicates.add(root.get("orgGroupId").in(reqDTO.getGroupIds())); predicates.add(root.get("orgGroupId").in(reqDTO.getGroupIds()));
} }
if (ListUtils.isNotEmpty(reqDTO.getTeamIds())) { if (ListUtils.isNotEmpty(reqDTO.getTeamIds())) {
predicates.add(root.get("orgTeamId").in(reqDTO.getTeamIds())); predicates.add(root.get("orgTeamId").in(reqDTO.getTeamIds()));
} }
if (ListUtils.isNotEmpty(reqDTO.getAppointmentType())) { if (ListUtils.isNotEmpty(reqDTO.getAppointmentType())) {
predicates.add(root.get("appointmentMethod").in(reqDTO.getAppointmentType())); predicates.add(root.get("appointmentMethod").in(reqDTO.getAppointmentType()));
} }
if (ListUtils.isNotEmpty(reqDTO.getPriorities())) { if (ListUtils.isNotEmpty(reqDTO.getPriorities())) {
List<Integer> p = reqDTO.getPriorities(); List<Integer> p = reqDTO.getPriorities();
if (p.contains(0) && p.contains(1)) { if (p.contains(0) && p.contains(1)) {
predicates.add(criteriaBuilder.ge(root.get("priority"), 1)); predicates.add(criteriaBuilder.ge(root.get("priority"), 1));
} else if (p.contains(0) && !p.contains(1)) { } else if (p.contains(0) && !p.contains(1)) {
predicates.add(criteriaBuilder.le(root.get("priority"), 1)); predicates.add(criteriaBuilder.le(root.get("priority"), 1));
} else if (p.contains(1) && !p.contains(0)) { } else if (p.contains(1) && !p.contains(0)) {
predicates.add(criteriaBuilder.ge(root.get("priority"), 5)); predicates.add(criteriaBuilder.ge(root.get("priority"), 5));
} }
} }
if (ListUtils.isNotEmpty(reqDTO.getEngineerCodes())) { if (ListUtils.isNotEmpty(reqDTO.getEngineerCodes())) {
Predicate engineerCodePredicate = root.get("engineerCode").in(reqDTO.getEngineerCodes()); Predicate engineerCodePredicate = root.get("engineerCode").in(reqDTO.getEngineerCodes());
Predicate engineerCodeSubPredicate = root.get("engineerCodeSub").in(reqDTO.getEngineerCodes()); Predicate engineerCodeSubPredicate = root.get("engineerCodeSub").in(reqDTO.getEngineerCodes());
predicates.add(criteriaBuilder.or(engineerCodePredicate, engineerCodeSubPredicate)); predicates.add(criteriaBuilder.or(engineerCodePredicate, engineerCodeSubPredicate));
} }
if (ListUtils.isNotEmpty(reqDTO.getTypeCategory())) { if (ListUtils.isNotEmpty(reqDTO.getTypeCategory())) {
Subquery<OrderInfoEntity> typeCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class); Subquery<OrderInfoEntity> typeCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
Root<SkillInfoEntity> skillInfoRoot = typeCategorySubquery.from(SkillInfoEntity.class); Root<SkillInfoEntity> skillInfoRoot = typeCategorySubquery.from(SkillInfoEntity.class);
typeCategorySubquery.select(root) typeCategorySubquery.select(root)
.where( .where(
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")), criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")), criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")), criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
skillInfoRoot.get("typeCategory").in(reqDTO.getTypeCategory()) skillInfoRoot.get("typeCategory").in(reqDTO.getTypeCategory())
); );
predicates.add(criteriaBuilder.exists(typeCategorySubquery)); predicates.add(criteriaBuilder.exists(typeCategorySubquery));
} }
if (ListUtils.isNotEmpty(reqDTO.getSkillCategory())) { if (ListUtils.isNotEmpty(reqDTO.getSkillCategory())) {
Subquery<OrderInfoEntity> skillCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class); Subquery<OrderInfoEntity> skillCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
Root<SkillInfoEntity> skillInfoRoot = skillCategorySubquery.from(SkillInfoEntity.class); Root<SkillInfoEntity> skillInfoRoot = skillCategorySubquery.from(SkillInfoEntity.class);
skillCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root skillCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root
.where( .where(
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")), criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")), criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")), criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
skillInfoRoot.get("skillCategory").in(reqDTO.getSkillCategory()) skillInfoRoot.get("skillCategory").in(reqDTO.getSkillCategory())
); );
predicates.add(criteriaBuilder.exists(skillCategorySubquery)); predicates.add(criteriaBuilder.exists(skillCategorySubquery));
} }
if (ListUtils.isNotEmpty(reqDTO.getGroupCategory())) { if (ListUtils.isNotEmpty(reqDTO.getGroupCategory())) {
Subquery<OrderInfoEntity> skillGroupCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class); Subquery<OrderInfoEntity> skillGroupCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
Root<SkillInfoEntity> skillInfoRoot = skillGroupCategorySubquery.from(SkillInfoEntity.class); Root<SkillInfoEntity> skillInfoRoot = skillGroupCategorySubquery.from(SkillInfoEntity.class);
skillGroupCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root skillGroupCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root
.where( .where(
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")), criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")), criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")), criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
skillInfoRoot.get("groupCategory").in(reqDTO.getGroupCategory()) skillInfoRoot.get("groupCategory").in(reqDTO.getGroupCategory())
); );
predicates.add(criteriaBuilder.exists(skillGroupCategorySubquery)); predicates.add(criteriaBuilder.exists(skillGroupCategorySubquery));
} }
criteriaQuery.where(predicates.toArray(new Predicate[0])); criteriaQuery.where(predicates.toArray(new Predicate[0]));
return entityManager.createQuery(criteriaQuery).getResultList(); return entityManager.createQuery(criteriaQuery).getResultList();
} }
private Map<String, List<OrderInfoEntity>> queryEngineerOrders(List<String> engineerCodes, LocalDate date) { private Map<String, List<OrderInfoEntity>> queryEngineerOrders(List<String> engineerCodes, LocalDate date) {
// 获取工程师服务单列表 // 获取工程师服务单列表
List<OrderInfoEntity> records = orderInfoDao.findByDtAndEngineerCodeIn(date, engineerCodes); List<OrderInfoEntity> records = orderInfoDao.findByDtAndEngineerCodeIn(date, engineerCodes);
// 排序 // 排序
records.sort(Comparator.comparing(OrderInfoEntity::getEngineerCode)); records.sort(Comparator.comparing(OrderInfoEntity::getEngineerCode));
records.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime)); records.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime));
//过滤 //过滤
List<OrderInfoEntity> orders = records.stream() List<OrderInfoEntity> orders = records.stream()
.filter(r -> r.getOrderStatus().equals("NORMAL")) .filter(r -> r.getOrderStatus().equals("NORMAL"))
.collect(Collectors.toList()); .collect(Collectors.toList());
return orders.stream().collect(Collectors.groupingBy(OrderInfoEntity::getEngineerCode)); return orders.stream().collect(Collectors.groupingBy(OrderInfoEntity::getEngineerCode));
} }
public List<EngineerInfoEntity> queryEngineers(List<String> teamIds, List<String> engineerCodes, String key) { public List<EngineerInfoEntity> queryEngineers(List<String> teamIds, List<String> engineerCodes, String key) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<EngineerInfoEntity> criteriaQuery = criteriaBuilder.createQuery(EngineerInfoEntity.class); CriteriaQuery<EngineerInfoEntity> criteriaQuery = criteriaBuilder.createQuery(EngineerInfoEntity.class);
Root<EngineerInfoEntity> root = criteriaQuery.from(EngineerInfoEntity.class); Root<EngineerInfoEntity> root = criteriaQuery.from(EngineerInfoEntity.class);
List<Predicate> predicates = new ArrayList<>(); List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("beanStatus"), 1)); predicates.add(criteriaBuilder.equal(root.get("beanStatus"), 1));
if (ListUtils.isNotEmpty(engineerCodes)) { if (ListUtils.isNotEmpty(engineerCodes)) {
predicates.add(root.get("engineerCode").in(engineerCodes)); predicates.add(root.get("engineerCode").in(engineerCodes));
} }
Subquery<Integer> teamSubquery = criteriaQuery.subquery(Integer.class); Subquery<Integer> teamSubquery = criteriaQuery.subquery(Integer.class);
Root<OrgTeamEngineerEntity> teamRoot = teamSubquery.from(OrgTeamEngineerEntity.class); Root<OrgTeamEngineerEntity> teamRoot = teamSubquery.from(OrgTeamEngineerEntity.class);
teamSubquery.select(criteriaBuilder.literal(1)) teamSubquery.select(criteriaBuilder.literal(1))
.where( .where(
criteriaBuilder.equal(teamRoot.get("engineerCode"), root.get("engineerCode")), criteriaBuilder.equal(teamRoot.get("engineerCode"), root.get("engineerCode")),
teamRoot.get("teamId").in(teamIds) teamRoot.get("teamId").in(teamIds)
); );
predicates.add(criteriaBuilder.exists(teamSubquery)); predicates.add(criteriaBuilder.exists(teamSubquery));
if (StringUtils.isNotEmpty(key)) { if (StringUtils.isNotEmpty(key)) {
predicates.add(criteriaBuilder.or( predicates.add(criteriaBuilder.or(
criteriaBuilder.like(root.get("phone"), "%" + key + "%"), criteriaBuilder.like(root.get("phone"), "%" + key + "%"),
criteriaBuilder.like(root.get("name"), "%" + key + "%"), criteriaBuilder.like(root.get("name"), "%" + key + "%"),
criteriaBuilder.like(root.get("engineerCode"), "%" + key + "%") criteriaBuilder.like(root.get("engineerCode"), "%" + key + "%")
)); ));
} }
criteriaQuery.where(predicates.toArray(new Predicate[0])); criteriaQuery.where(predicates.toArray(new Predicate[0]));
criteriaQuery.orderBy(criteriaBuilder.asc(root.get("name"))); criteriaQuery.orderBy(criteriaBuilder.asc(root.get("name")));
return entityManager.createQuery(criteriaQuery).getResultList(); return entityManager.createQuery(criteriaQuery).getResultList();
} }
private List<String> queryOrgTeamIds(String levelType, String levelIds, List<String> branchIds, List<String> groupIds, List<String> teamIds) { private List<String> queryOrgTeamIds(String levelType, String levelIds, List<String> branchIds, List<String> groupIds, List<String> teamIds) {
Specification<OrgTeamEntity> specification = (root, query, criteriaBuilder) -> { Specification<OrgTeamEntity> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>(); List<Predicate> predicates = new ArrayList<>();
if ("cluster".equals(levelType)) { if ("cluster".equals(levelType)) {
predicates.add(criteriaBuilder.in(root.get("clusterId")).value(levelIds)); predicates.add(criteriaBuilder.in(root.get("clusterId")).value(levelIds));
} else if ("branch".equals(levelType)) { } else if ("branch".equals(levelType)) {
predicates.add(criteriaBuilder.in(root.get("branchId")).value(levelIds)); predicates.add(criteriaBuilder.in(root.get("branchId")).value(levelIds));
} else if ("group".equals(levelType)) { } else if ("group".equals(levelType)) {
predicates.add(criteriaBuilder.in(root.get("groupId")).value(levelIds)); predicates.add(criteriaBuilder.in(root.get("groupId")).value(levelIds));
} }
if (ListUtils.isNotEmpty(branchIds)) { if (ListUtils.isNotEmpty(branchIds)) {
predicates.add(root.get("branchId").in(branchIds)); predicates.add(root.get("branchId").in(branchIds));
} }
if (ListUtils.isNotEmpty(groupIds)) { if (ListUtils.isNotEmpty(groupIds)) {
predicates.add(root.get("groupId").in(groupIds)); predicates.add(root.get("groupId").in(groupIds));
} }
if (ListUtils.isNotEmpty(teamIds)) { if (ListUtils.isNotEmpty(teamIds)) {
predicates.add(root.get("teamId").in(teamIds)); predicates.add(root.get("teamId").in(teamIds));
} }
return criteriaBuilder.and(predicates.toArray(new Predicate[0])); return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
}; };
List<OrgTeamEntity> teams = orgTeamDao.findAll(specification); List<OrgTeamEntity> teams = orgTeamDao.findAll(specification);
return teams.stream().map(OrgTeamEntity::getTeamId).collect(Collectors.toList()); return teams.stream().map(OrgTeamEntity::getTeamId).collect(Collectors.toList());
} }
private HashMap<String, Integer> querySkillTakeTime() { private HashMap<String, Integer> querySkillTakeTime() {
HashMap<String, Integer> map = new HashMap<>(); HashMap<String, Integer> map = new HashMap<>();
List<SkillInfoEntity> records = skillInfoDao.findAll(); List<SkillInfoEntity> records = skillInfoDao.findAll();
for (SkillInfoEntity r : records) { for (SkillInfoEntity r : records) {
String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill()); String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill());
map.put(key, r.getTakeTime()); map.put(key, r.getTakeTime());
} }
return map; return map;
} }
private HashMap<String, SkillInfoEntity> querySkillInfo() { private HashMap<String, SkillInfoEntity> querySkillInfo() {
HashMap<String, SkillInfoEntity> map = new HashMap<>(); HashMap<String, SkillInfoEntity> map = new HashMap<>();
List<SkillInfoEntity> records = skillInfoDao.findAll(); List<SkillInfoEntity> records = skillInfoDao.findAll();
for (SkillInfoEntity r : records) { for (SkillInfoEntity r : records) {
String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill()); String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill());
map.put(key, r); map.put(key, r);
} }
return map; return map;
} }
private HashMap<String, CapacityEngineerStatEntity> queryCapacityEngineerStat(List<String> engineerCodes, String date) { private HashMap<String, CapacityEngineerStatEntity> queryCapacityEngineerStat(List<String> engineerCodes, String date) {
List<CapacityEngineerStatEntity> records = capacityEngineerStatDao.getByWorkdayAndEngineerCodeIn(date, engineerCodes); List<CapacityEngineerStatEntity> records = capacityEngineerStatDao.getByWorkdayAndEngineerCodeIn(date, engineerCodes);
HashMap<String, CapacityEngineerStatEntity> map = new HashMap<>(); HashMap<String, CapacityEngineerStatEntity> map = new HashMap<>();
for (CapacityEngineerStatEntity r : records) { for (CapacityEngineerStatEntity r : records) {
map.put(r.getEngineerCode(), r); map.put(r.getEngineerCode(), r);
} }
return map; return map;
} }
private String parseTimeSlot(LocalDateTime t) { private String parseTimeSlot(LocalDateTime t) {
String h = TimeUtils.localDateTime2String(t, "HH"); String h = TimeUtils.localDateTime2String(t, "HH");
Integer hour = Integer.parseInt(h); Integer hour = Integer.parseInt(h);
if (hour <= 12) { if (hour <= 12) {
return "上午"; return "上午";
} else if (hour <= 18) { } else if (hour <= 18) {
return "下午"; return "下午";
} else { } else {
return "晚上"; return "晚上";
} }
} }
} }
class GroupTagFactory { class GroupTagFactory {
public GroupTag getGroupTag(String groupTagId) { public GroupTag getGroupTag(String groupTagId) {
if (groupTagId.equals("0")) { if (groupTagId.equals("0")) {
return new GroupTagUrgency(); return new GroupTagUrgency();
} else { } else {
return new GroupTagOmit(); return new GroupTagOmit();
} }
} }
} }
class GroupTagUrgency implements GroupTag { class GroupTagUrgency implements GroupTag {
// 根据紧急程度来分组 // 根据紧急程度来分组
public String getGroupTag(OrderInfoEntity order) { public String getGroupTag(OrderInfoEntity order) {
String s = order.getTags(); String s = order.getTags();
if (s == null) { if (s == null) {
return "正常#1"; return "正常#1";
} }
if (s.contains("VIP") || s.contains("财产损失")) { if (s.contains("VIP") || s.contains("财产损失")) {
return "超急#10"; return "超急#10";
} else if (s.contains("自保点") || s.contains("紧急")) { } else if (s.contains("自保点") || s.contains("紧急")) {
return "紧急#8"; return "紧急#8";
} else if (s.contains("3天前单") || s.contains("同地址多单") || s.contains("超重需多人")) { } else if (s.contains("3天前单") || s.contains("同地址多单") || s.contains("超重需多人")) {
return "一般#5"; return "一般#5";
} else { } else {
return "正常#1"; return "正常#1";
} }
} }
} }
class GroupTagOmit implements GroupTag { class GroupTagOmit implements GroupTag {
public String getGroupTag(OrderInfoEntity order) { public String getGroupTag(OrderInfoEntity order) {
return "默认分类#5"; return "默认分类#5";
} }
} }
class LineSegment { class LineSegment {
public String id; public String id;
public int start; public int start;
public int end; public int end;
public LineSegment(String id, int start, int end) { public LineSegment(String id, int start, int end) {
this.id = id; this.id = id;
this.start = start; this.start = start;
this.end = end; this.end = end;
} }
} }
class Line { class Line {
public String id; public String id;
public int length; public int length;
public Line(String id, int length) { public Line(String id, int length) {
this.id = id; this.id = id;
this.length = length; this.length = length;
} }
} }
class LineSegmentScheduler { class LineSegmentScheduler {
public List<LineSegment> scheduleLineSegments(List<LineSegment> used, List<Line> newTasks) { public List<LineSegment> scheduleLineSegments(List<LineSegment> used, List<Line> newTasks) {
used.sort(Comparator.comparingInt(a -> a.start)); used.sort(Comparator.comparingInt(a -> a.start));
List<LineSegment> result = new ArrayList<>(); List<LineSegment> result = new ArrayList<>();
for (Line task : newTasks) { for (Line task : newTasks) {
String taskId = task.id; String taskId = task.id;
int taskLength = task.length; int taskLength = task.length;
boolean scheduled = false; boolean scheduled = false;
int startRange = 480; int startRange = 480;
int endRange = 1440; int endRange = 1440;
if (!scheduled) { if (!scheduled) {
for (int i = 0; i <= used.size(); i++) { for (int i = 0; i <= used.size(); i++) {
int start; int start;
if (i == 0) { if (i == 0) {
start = startRange; start = startRange;
} else { } else {
start = used.get(i - 1).end; start = used.get(i - 1).end;
} }
int end; int end;
if (i == used.size() || used.get(i).start > endRange) { if (i == used.size() || used.get(i).start > endRange) {
end = endRange; end = endRange;
} else { } else {
end = used.get(i).start; end = used.get(i).start;
} }
if (end - start >= taskLength) { if (end - start >= taskLength) {
int taskStart = start; int taskStart = start;
int taskEnd = start + taskLength; int taskEnd = start + taskLength;
LineSegment s = new LineSegment(taskId, taskStart, taskEnd); LineSegment s = new LineSegment(taskId, taskStart, taskEnd);
result.add(s); result.add(s);
used.add(i, s); used.add(i, s);
break; break;
} }
} }
} }
} }
return result; return result;
} }
} }
class OrderRequestScheduler { class OrderRequestScheduler {
public List<LineSegment> scheduler(List<OrderInfoEntity> orderRequests, List<OrderInfoEntity> orderAppointments) { public List<LineSegment> scheduler(List<OrderInfoEntity> orderRequests, List<OrderInfoEntity> orderAppointments) {
List<LineSegment> used = new ArrayList<>(); List<LineSegment> used = new ArrayList<>();
for (OrderInfoEntity o : orderAppointments) { for (OrderInfoEntity o : orderAppointments) {
LineSegment s = new LineSegment(o.getOrderId(), LineSegment s = new LineSegment(o.getOrderId(),
this.localTime2LinePoint(o.getPlanStartTime()), this.localTime2LinePoint(o.getPlanStartTime()),
this.localTime2LinePoint(o.getPlanEndTime())); this.localTime2LinePoint(o.getPlanEndTime()));
used.add(s); used.add(s);
} }
List<Line> newTasks = new ArrayList<>(); List<Line> newTasks = new ArrayList<>();
for (OrderInfoEntity o : orderRequests) { for (OrderInfoEntity o : orderRequests) {
if (!o.getAppointmentStatus().equals("INIT")) { if (!o.getAppointmentStatus().equals("INIT")) {
continue; continue;
} }
Line t = new Line(o.getOrderId(), 30); Line t = new Line(o.getOrderId(), 30);
newTasks.add(t); newTasks.add(t);
} }
if (newTasks.isEmpty()) { if (newTasks.isEmpty()) {
List<LineSegment> empty = new ArrayList<>(); List<LineSegment> empty = new ArrayList<>();
return empty; return empty;
} }
LineSegmentScheduler scheduler = new LineSegmentScheduler(); LineSegmentScheduler scheduler = new LineSegmentScheduler();
return scheduler.scheduleLineSegments(used, newTasks); return scheduler.scheduleLineSegments(used, newTasks);
} }
public int localTime2LinePoint(LocalDateTime datetime) { public int localTime2LinePoint(LocalDateTime datetime) {
return datetime.getHour() * 60 + datetime.getMinute(); return datetime.getHour() * 60 + datetime.getMinute();
} }
public LocalDateTime linePoint2DateTime(int x, String date) { public LocalDateTime linePoint2DateTime(int x, String date) {
int base = 60; int base = 60;
int hour = x / base; int hour = x / base;
int minute = x % base; int minute = x % base;
String datetime = String.format("%s %02d:%02d:00", date, hour, minute); String datetime = String.format("%s %02d:%02d:00", date, hour, minute);
return TimeUtils.IsoDateTime2LocalDateTime(datetime); return TimeUtils.IsoDateTime2LocalDateTime(datetime);
} }
} }
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!