Commit aa4c0747 by wangli

修改

1 parent f6e0b73c
......@@ -2,12 +2,13 @@ package com.dituhui.pea.order.dao;
import com.dituhui.pea.order.entity.OrderInfoEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.time.LocalDate;
import java.util.List;
public interface OrderInfoDao extends JpaRepository<OrderInfoEntity, Long> {
public interface OrderInfoDao extends JpaRepository<OrderInfoEntity, Long>, JpaSpecificationExecutor<OrderInfoEntity> {
OrderInfoEntity getByOrderId(String orderId);
OrderInfoEntity getByOrderIdAndDt(String orderId, LocalDate dt);
List<OrderInfoEntity> findByOrderId(String orderId);
......
package com.dituhui.pea.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.dituhui.pea.common.BusinessException;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.common.ListUtils;
......@@ -21,8 +20,8 @@ import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.criteria.Predicate;
import java.sql.Timestamp;
import javax.persistence.EntityManager;
import javax.persistence.criteria.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
......@@ -31,7 +30,7 @@ import java.util.stream.Collectors;
interface GroupTag {
// 订单分类tag
String getGroupTag(OrderInfo order);
String getGroupTag(OrderInfoEntity order);
}
......@@ -40,18 +39,12 @@ interface GroupTag {
public class DispatchServiceImpl implements DispatchService {
@Autowired
private OrderInfoMPDao orderInfoMPDao;
@Autowired
private OrderInfoDao orderInfoDao;
@Autowired
private OrgTeamDao orgTeamDao;
@Autowired
private EngineerInfoMPDao engineerInfoMPDao;
@Autowired
private EngineerInfoDao engineerInfoDao;
@Autowired
......@@ -60,6 +53,9 @@ public class DispatchServiceImpl implements DispatchService {
@Autowired
private CapacityEngineerStatDao capacityEngineerStatDao;
@Autowired
private EntityManager entityManager;
@Transactional
@Override
public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) {
......@@ -69,13 +65,13 @@ public class DispatchServiceImpl implements DispatchService {
HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo();
// 获取工单列表
List<OrderInfo> orders = this.queryOrders(reqDTO);
List<OrderInfoEntity> orders = this.queryOrders(reqDTO);
// 获取分组标签
GroupTag gt = new GroupTagFactory().getGroupTag(reqDTO.getGroupTagId());
List<DispatchOrderListResp.Order> items = new ArrayList<>();
for (OrderInfo o : orders) {
for (OrderInfoEntity o : orders) {
DispatchOrderListResp.Order item = new DispatchOrderListResp.Order();
item.setOrderId(o.getOrderId());
......@@ -111,7 +107,7 @@ public class DispatchServiceImpl implements DispatchService {
item.setAppointmentStatus(o.getAppointmentStatus());
item.setOrderStatus(o.getOrderStatus());
item.setServiceStatus(o.getServiceStatus());
item.setCreateTime(TimeUtils.IsoTimestamp2DateTime(o.getCreateTime()));
item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
String[] tags = gt.getGroupTag(o).split("#");
item.setGroupTag(tags[0]); // 设置tag名称
......@@ -143,7 +139,7 @@ public class DispatchServiceImpl implements DispatchService {
}
// 获取engineer列表
List<EngineerInfo> engineers = this.queryEngineers(teamIds, reqDTO.getEngineerCodes(), reqDTO.getKey());
List<EngineerInfoEntity> engineers = this.queryEngineers(teamIds, reqDTO.getEngineerCodes(), reqDTO.getKey());
if (engineers.isEmpty()) {
// 该group下没有技术员,返回空
log.warn("没有找到技术员");
......@@ -154,7 +150,7 @@ public class DispatchServiceImpl implements DispatchService {
}
// 获取engineerCodes
List<String> engineerCodes = engineers.stream().map(EngineerInfo::getEngineerCode).collect(Collectors.toList());
List<String> engineerCodes = engineers.stream().map(EngineerInfoEntity::getEngineerCode).collect(Collectors.toList());
// 获取技术员已指派单列表
Map<String, List<OrderInfoEntity>> engineerOrders = this.queryEngineerOrders(engineerCodes, date);
......@@ -164,7 +160,7 @@ public class DispatchServiceImpl implements DispatchService {
// 获取技术员已指派单列表
List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>();
for (EngineerInfo e : engineers) {
for (EngineerInfoEntity e : engineers) {
List<DispatchEngineerOrderListResp.OrderInfo> items = new ArrayList<>();
......@@ -272,78 +268,123 @@ public class DispatchServiceImpl implements DispatchService {
List<LineSegment> results = scheduler.scheduler(orders, orderAppointments);
for (LineSegment r : results) {
String orderId = r.id;
Timestamp planStartTime = scheduler.linePoint2Timestamp(r.start, date);
Timestamp planEndTime = scheduler.linePoint2Timestamp(r.end, date);
// 更新order request表状态
LambdaUpdateWrapper<OrderInfo> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.set(OrderInfo::getPlanStartTime, planStartTime);
updateWrapper.set(OrderInfo::getPlanEndTime, planEndTime);
updateWrapper.set(OrderInfo::getAppointmentStatus, "CONFIRM");
updateWrapper.set(OrderInfo::getAppointmentMethod, "MANUAL");
updateWrapper.eq(OrderInfo::getOrderId, orderId);
updateWrapper.eq(OrderInfo::getDt, localDate);
orderInfoMPDao.update(null, updateWrapper);
LocalDateTime planStartTime = scheduler.linePoint2DateTime(r.start, date);
LocalDateTime planEndTime = scheduler.linePoint2DateTime(r.end, date);
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaUpdate<OrderInfoEntity> update = criteriaBuilder.createCriteriaUpdate(OrderInfoEntity.class);
Root<OrderInfoEntity> root = update.from(OrderInfoEntity.class);
update.set(root.get("planStartTime"), planStartTime);
update.set(root.get("planEndTime"), planEndTime);
update.set(root.get("appointmentStatus"), "CONFIRM");
update.set(root.get("appointmentMethod"), "MANUAL");
update.where(
criteriaBuilder.equal(root.get("orderId"), orderId),
criteriaBuilder.equal(root.get("dt"), localDate)
);
entityManager.createQuery(update).executeUpdate();
}
return Result.success(null);
}
private List<OrderInfo> queryOrders(DispatchOrderListReq reqDTO) {
private List<OrderInfoEntity> queryOrders(DispatchOrderListReq reqDTO) {
// 获取服务单列表
LambdaQueryWrapper<OrderInfo> lqw = new LambdaQueryWrapper<>();
lqw.eq(OrderInfo::getDt, TimeUtils.IsoDate2LocalDate(reqDTO.getDate()));
lqw.eq(OrderInfo::getAppointmentStatus, "INIT"); // 明确未派工订单
lqw.eq(reqDTO.getLevelType().equals("cluster"), OrderInfo::getOrgClusterId, reqDTO.getLevelValue());
lqw.eq(reqDTO.getLevelType().equals("branch"), OrderInfo::getOrgBranchId, reqDTO.getLevelValue());
lqw.eq(reqDTO.getLevelType().equals("group"), OrderInfo::getOrgGroupId, reqDTO.getLevelValue());
//筛选项
lqw.eq(StringUtils.isNotEmpty(reqDTO.getPhone()), OrderInfo::getPhone, reqDTO.getPhone());
lqw.eq(StringUtils.isNotEmpty(reqDTO.getOrderId()), OrderInfo::getOrderId, reqDTO.getOrderId());
lqw.in(ListUtils.isNotEmpty(reqDTO.getBranchIds()), OrderInfo::getOrgBranchId, reqDTO.getBranchIds());
lqw.in(ListUtils.isNotEmpty(reqDTO.getGroupIds()), OrderInfo::getOrgGroupId, reqDTO.getGroupIds());
lqw.in(ListUtils.isNotEmpty(reqDTO.getTeamIds()), OrderInfo::getOrgTeamId, reqDTO.getTeamIds());
lqw.in(ListUtils.isNotEmpty(reqDTO.getAppointmentType()), OrderInfo::getAppointmentMethod, reqDTO.getAppointmentType());
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<OrderInfoEntity> criteriaQuery = criteriaBuilder.createQuery(OrderInfoEntity.class);
Root<OrderInfoEntity> root = criteriaQuery.from(OrderInfoEntity.class);
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("dt"), TimeUtils.IsoDate2LocalDate(reqDTO.getDate())));
predicates.add(criteriaBuilder.equal(root.get("appointmentStatus"), "INIT"));
String levelType = reqDTO.getLevelType();
String levelValue = reqDTO.getLevelValue();
if ("cluster".equals(levelType)) {
predicates.add(criteriaBuilder.equal(root.get("orgClusterId"), levelValue));
} else if ("branch".equals(levelType)) {
predicates.add(criteriaBuilder.equal(root.get("orgBranchId"), levelValue));
} else if ("group".equals(levelType)) {
predicates.add(criteriaBuilder.equal(root.get("orgGroupId"), levelValue));
}
// 筛选项
if (StringUtils.isNotEmpty(reqDTO.getPhone())) {
predicates.add(criteriaBuilder.equal(root.get("phone"), reqDTO.getPhone()));
}
if (StringUtils.isNotEmpty(reqDTO.getOrderId())) {
predicates.add(criteriaBuilder.equal(root.get("orderId"), reqDTO.getOrderId()));
}
if (ListUtils.isNotEmpty(reqDTO.getBranchIds())) {
predicates.add(root.get("orgBranchId").in(reqDTO.getBranchIds()));
}
if (ListUtils.isNotEmpty(reqDTO.getGroupIds())) {
predicates.add(root.get("orgGroupId").in(reqDTO.getGroupIds()));
}
if (ListUtils.isNotEmpty(reqDTO.getTeamIds())) {
predicates.add(root.get("orgTeamId").in(reqDTO.getTeamIds()));
}
if (ListUtils.isNotEmpty(reqDTO.getAppointmentType())) {
predicates.add(root.get("appointmentMethod").in(reqDTO.getAppointmentType()));
}
if (ListUtils.isNotEmpty(reqDTO.getPriorities())) {
List<Integer> p = reqDTO.getPriorities();
if (p.contains(0) && p.contains(1)) {
lqw.ge(OrderInfo::getPriority, 1);
predicates.add(criteriaBuilder.ge(root.get("priority"), 1));
} else if (p.contains(0) && !p.contains(1)) {
lqw.le(OrderInfo::getPriority, 1);
predicates.add(criteriaBuilder.le(root.get("priority"), 1));
} else if (p.contains(1) && !p.contains(0)) {
lqw.ge(OrderInfo::getPriority, 5);
predicates.add(criteriaBuilder.ge(root.get("priority"), 5));
}
}
if (ListUtils.isNotEmpty(reqDTO.getEngineerCodes())) {
lqw.and(w ->
w.in(OrderInfo::getEngineerCode, reqDTO.getEngineerCodes())
.or()
.in(OrderInfo::getEngineerCodeSub, reqDTO.getEngineerCodes())
);
Predicate engineerCodePredicate = root.get("engineerCode").in(reqDTO.getEngineerCodes());
Predicate engineerCodeSubPredicate = root.get("engineerCodeSub").in(reqDTO.getEngineerCodes());
predicates.add(criteriaBuilder.or(engineerCodePredicate, engineerCodeSubPredicate));
}
if (ListUtils.isNotEmpty(reqDTO.getTypeCategory())) {
String types = "'" + String.join("','", reqDTO.getTypeCategory()) + "'";
String sql = String.format("select 1 from skill_info sk where sk.brand = order_info.brand and sk.type = order_info.type and sk.skill = order_info.skill and type_category in (%s)", types);
lqw.exists(sql);
Subquery<OrderInfoEntity> typeCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
Root<SkillInfoEntity> skillInfoRoot = typeCategorySubquery.from(SkillInfoEntity.class);
typeCategorySubquery.select(root)
.where(
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
skillInfoRoot.get("typeCategory").in(reqDTO.getTypeCategory())
);
predicates.add(criteriaBuilder.exists(typeCategorySubquery));
}
if (ListUtils.isNotEmpty(reqDTO.getSkillCategory())) {
String skills = "'" + String.join("','", reqDTO.getSkillCategory()) + "'";
String sql = String.format("select 1 from skill_info sk where sk.brand = order_info.brand and sk.type = order_info.type and sk.skill = order_info.skill and skill_category in (%s)", skills);
lqw.exists(sql);
Subquery<OrderInfoEntity> skillCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
Root<SkillInfoEntity> skillInfoRoot = skillCategorySubquery.from(SkillInfoEntity.class);
skillCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root
.where(
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
skillInfoRoot.get("skillCategory").in(reqDTO.getSkillCategory())
);
predicates.add(criteriaBuilder.exists(skillCategorySubquery));
}
if (ListUtils.isNotEmpty(reqDTO.getGroupCategory())) {
String groupCategory = reqDTO.getGroupCategory().stream().map(Object::toString).collect(Collectors.joining(","));
String sql = String.format("select 1 from org_group g where g.group_id = order_info.org_group_id and g.category in (%s)", groupCategory);
lqw.exists(sql);
Subquery<OrderInfoEntity> skillGroupCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
Root<SkillInfoEntity> skillInfoRoot = skillGroupCategorySubquery.from(SkillInfoEntity.class);
skillGroupCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root
.where(
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
skillInfoRoot.get("groupCategory").in(reqDTO.getGroupCategory())
);
predicates.add(criteriaBuilder.exists(skillGroupCategorySubquery));
}
return orderInfoMPDao.selectList(lqw);
criteriaQuery.where(predicates.toArray(new Predicate[0]));
return entityManager.createQuery(criteriaQuery).getResultList();
}
private Map<String, List<OrderInfoEntity>> queryEngineerOrders(List<String> engineerCodes, LocalDate date) {
......@@ -368,27 +409,37 @@ public class DispatchServiceImpl implements DispatchService {
}
private List<EngineerInfo> queryEngineers(List<String> teamIds, List<String> engineerCodes, String key) {
// 通过groupIds获取技术员列表
LambdaQueryWrapper<EngineerInfo> lqw = new LambdaQueryWrapper<>();
lqw.eq(EngineerInfo::getBeanStatus, 1);
lqw.in(ListUtils.isNotEmpty(engineerCodes), EngineerInfo::getEngineerCode, engineerCodes);
public List<EngineerInfoEntity> queryEngineers(List<String> teamIds, List<String> engineerCodes, String key) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<EngineerInfoEntity> criteriaQuery = criteriaBuilder.createQuery(EngineerInfoEntity.class);
Root<EngineerInfoEntity> root = criteriaQuery.from(EngineerInfoEntity.class);
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal(root.get("beanStatus"), 1));
if (ListUtils.isNotEmpty(engineerCodes)) {
predicates.add(root.get("engineerCode").in(engineerCodes));
}
String inTeamIds = "'" + teamIds.stream().map(Object::toString).collect(Collectors.joining("','")) + "'";
String sql = String.format("select 1 from org_team_engineer ot where ot.engineer_code = engineer_info.engineer_code and ot.team_id in (%s)", inTeamIds);
lqw.exists(sql);
Subquery<Integer> teamSubquery = criteriaQuery.subquery(Integer.class);
Root<OrgTeamEngineerEntity> teamRoot = teamSubquery.from(OrgTeamEngineerEntity.class);
teamSubquery.select(criteriaBuilder.literal(1))
.where(
criteriaBuilder.equal(teamRoot.get("engineerCode"), root.get("engineerCode")),
teamRoot.get("teamId").in(teamIds)
);
predicates.add(criteriaBuilder.exists(teamSubquery));
if (StringUtils.isNotEmpty(key)) {
lqw.and(w ->
w.like(EngineerInfo::getPhone, key)
.or()
.like(EngineerInfo::getName, key)
.or()
.like(EngineerInfo::getEngineerCode, key)
);
predicates.add(criteriaBuilder.or(
criteriaBuilder.like(root.get("phone"), "%" + key + "%"),
criteriaBuilder.like(root.get("name"), "%" + key + "%"),
criteriaBuilder.like(root.get("engineerCode"), "%" + key + "%")
));
}
lqw.orderByAsc(EngineerInfo::getName);
return engineerInfoMPDao.selectList(lqw);
criteriaQuery.where(predicates.toArray(new Predicate[0]));
criteriaQuery.orderBy(criteriaBuilder.asc(root.get("name")));
return entityManager.createQuery(criteriaQuery).getResultList();
}
private List<String> queryOrgTeamIds(String levelType, String levelIds, List<String> branchIds, List<String> groupIds, List<String> teamIds) {
......@@ -474,7 +525,7 @@ class GroupTagFactory {
class GroupTagUrgency implements GroupTag {
// 根据紧急程度来分组
public String getGroupTag(OrderInfo order) {
public String getGroupTag(OrderInfoEntity order) {
String s = order.getTags();
if (s == null) {
return "正常#1";
......@@ -493,7 +544,7 @@ class GroupTagUrgency implements GroupTag {
class GroupTagOmit implements GroupTag {
public String getGroupTag(OrderInfo order) {
public String getGroupTag(OrderInfoEntity order) {
return "默认分类#5";
}
}
......@@ -604,11 +655,11 @@ class OrderRequestScheduler {
return datetime.getHour() * 60 + datetime.getMinute();
}
public Timestamp linePoint2Timestamp(int x, String date) {
public LocalDateTime linePoint2DateTime(int x, String date) {
int base = 60;
int hour = x / base;
int minute = x % base;
String datetime = String.format("%s %d:%d:00", date, hour, minute);
return Timestamp.valueOf(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!