Commit 9b5f5bda by 刘鑫

Merge remote-tracking branch 'origin/develop' into develop

# Conflicts:
#	project-order/src/main/java/com/dituhui/pea/order/entity/OrderInfoEntity.java
2 parents 38b0ddab 33cb9c35
Showing with 1255 additions and 706 deletions
...@@ -33,6 +33,19 @@ public class DispatchController { ...@@ -33,6 +33,19 @@ public class DispatchController {
return res; return res;
} }
@GetMapping("/dispatch/order/group")
public Result<?> getDispatchOrderGroup(@Valid DispatchOrderListReq reqDTO) {
// 获取派工台待派订单列表
Result<?> res = null;
try {
res = dispatchService.getDispatchOrderGroup(reqDTO);
}catch (BusinessException e) {
return Result.failed(e.getMessage());
}
return res;
}
@GetMapping("/dispatch/engineer/order/list") @GetMapping("/dispatch/engineer/order/list")
public Result<?> getDispatchEngineerOrderList(@Valid DispatchEngineerOrderListReq reqDTO) { public Result<?> getDispatchEngineerOrderList(@Valid DispatchEngineerOrderListReq reqDTO) {
// 获取派工台工程师已派订单列表 // 获取派工台工程师已派订单列表
......
...@@ -40,8 +40,10 @@ public class MsgController { ...@@ -40,8 +40,10 @@ public class MsgController {
MsgQuery request) { MsgQuery request) {
CommonUtil.setNullValue(request); CommonUtil.setNullValue(request);
request.setUserId(userId); request.setUserId(userId);
if (!"is_read".equalsIgnoreCase(request.getSort())) { if (!"isRead".equalsIgnoreCase(request.getSort())) {
request.setSort("create_time"); request.setSort("create_time");
} else {
request.setSort("is_read");
} }
if (!"asc".equalsIgnoreCase(request.getSortType())) { if (!"asc".equalsIgnoreCase(request.getSortType())) {
request.setSortType("desc"); request.setSortType("desc");
...@@ -63,7 +65,7 @@ public class MsgController { ...@@ -63,7 +65,7 @@ public class MsgController {
* @date 2023/10/24 * @date 2023/10/24
*/ */
@PostMapping("/msg/delete") @PostMapping("/msg/delete")
public Result<Boolean> delete(@RequestHeader(name = "userId", required = true) String userId, @RequestBody @Valid IdDTO dto) { public Result<Boolean> delete(@RequestHeader(name = "userId", required = true) String userId, @RequestBody @Valid MsgDTO.IdDTO dto) {
AssertUtil.isNotEmpty(userId, "用户ID不能为空"); AssertUtil.isNotEmpty(userId, "用户ID不能为空");
AssertUtil.isNotNull(dto.getId(), "消息ID不能为空"); AssertUtil.isNotNull(dto.getId(), "消息ID不能为空");
msgService.delete(dto.getId(), userId); msgService.delete(dto.getId(), userId);
......
...@@ -21,7 +21,9 @@ public interface MsgDao extends JpaRepository<MsgEntity, Integer> { ...@@ -21,7 +21,9 @@ public interface MsgDao extends JpaRepository<MsgEntity, Integer> {
" where IF(:#{#req.startDate} is not null, tt.create_time>=:#{#req.startDate}, 1=1)" + " where IF(:#{#req.startDate} is not null, tt.create_time>=:#{#req.startDate}, 1=1)" +
" and IF(:#{#req.endDate} is not null, tt.create_time<:#{#req.endDate}, 1=1)" + " and IF(:#{#req.endDate} is not null, tt.create_time<:#{#req.endDate}, 1=1)" +
" and IF(:#{#req.keyWord} is not null, tt.content like concat('%',:#{#req.keyWord},'%'), 1=1)" + " and IF(:#{#req.keyWord} is not null, tt.content like concat('%',:#{#req.keyWord},'%'), 1=1)" +
" and IF(:#{#req.orgTreeValue} is not null, (tt.cluster_id=:#{#req.orgTreeValue} or tt.branch_id=:#{#req.orgTreeValue} or tt.group_id=:#{#req.orgTreeValue}), 1=1)" + " and IF(:#{#req.clusterId} is not null, tt.cluster_id=:#{#req.clusterId}, 1=1)" +
" and IF(:#{#req.branchId} is not null, tt.branch_id=:#{#req.branchId}, 1=1)" +
" and IF(:#{#req.groupId} is not null, tt.group_id=:#{#req.groupId}, 1=1)" +
"group by tt.cluster_id,tt.branch_id,tt.group_id" + "group by tt.cluster_id,tt.branch_id,tt.group_id" +
") t", ") t",
countQuery = "select count(t.cluster_id)" + countQuery = "select count(t.cluster_id)" +
...@@ -31,7 +33,9 @@ public interface MsgDao extends JpaRepository<MsgEntity, Integer> { ...@@ -31,7 +33,9 @@ public interface MsgDao extends JpaRepository<MsgEntity, Integer> {
" where IF(:#{#req.startDate} is not null, tt.create_time>=:#{#req.startDate}, 1=1)" + " where IF(:#{#req.startDate} is not null, tt.create_time>=:#{#req.startDate}, 1=1)" +
" and IF(:#{#req.endDate} is not null, tt.create_time<:#{#req.endDate}, 1=1)" + " and IF(:#{#req.endDate} is not null, tt.create_time<:#{#req.endDate}, 1=1)" +
" and IF(:#{#req.keyWord} is not null, tt.content like concat('%',:#{#req.keyWord},'%'), 1=1)" + " and IF(:#{#req.keyWord} is not null, tt.content like concat('%',:#{#req.keyWord},'%'), 1=1)" +
" and IF(:#{#req.orgTreeValue} is not null, (tt.cluster_id=:#{#req.orgTreeValue} or tt.branch_id=:#{#req.orgTreeValue} or tt.group_id=:#{#req.orgTreeValue}), 1=1)" + " and IF(:#{#req.clusterId} is not null, tt.cluster_id=:#{#req.clusterId}, 1=1)" +
" and IF(:#{#req.branchId} is not null, tt.branch_id=:#{#req.branchId}, 1=1)" +
" and IF(:#{#req.groupId} is not null, tt.group_id=:#{#req.groupId}, 1=1)" +
"group by tt.cluster_id,tt.branch_id,tt.group_id" + "group by tt.cluster_id,tt.branch_id,tt.group_id" +
") t" ") t"
, nativeQuery = true // 开启原生sql , nativeQuery = true // 开启原生sql
...@@ -69,8 +73,8 @@ public interface MsgDao extends JpaRepository<MsgEntity, Integer> { ...@@ -69,8 +73,8 @@ public interface MsgDao extends JpaRepository<MsgEntity, Integer> {
" join sys_user_org uo on u.id=uo.user_id" + " join sys_user_org uo on u.id=uo.user_id" +
" join sys_user_role ur on ur.user_id=u.id" + " join sys_user_role ur on ur.user_id=u.id" +
" join sys_role r on r.id=ur.role_id and r.name='分站派工'" + " join sys_role r on r.id=ur.role_id and r.name='分站派工'" +
" and IF(:groupId is not null, uo.org_id=:groupId and uo.org_level=2, 1=1)" + " and IF(:groupId is not null, ((uo.org_id=:groupId and uo.org_level=2) or (uo.org_id=:branchId and uo.org_level=1) or (uo.org_id=:clusterId and uo.org_level=0)), 1=1)" +
" and IF(:groupId is null and :branchId is not null, uo.org_id=:branchId and uo.org_level=1, 1=1)" + " and IF(:groupId is null and :branchId is not null, ((uo.org_id=:branchId and uo.org_level=1) or (uo.org_id=:clusterId and uo.org_level=0)), 1=1)" +
" and IF(:groupId is null and :branchId is null and :clusterId is not null, uo.org_id=:clusterId and uo.org_level=0, 1=1)" " and IF(:groupId is null and :branchId is null and :clusterId is not null, uo.org_id=:clusterId and uo.org_level=0, 1=1)"
, nativeQuery = true // 开启原生sql , nativeQuery = true // 开启原生sql
) )
......
...@@ -10,18 +10,31 @@ import java.util.List; ...@@ -10,18 +10,31 @@ import java.util.List;
public interface OrderInfoDao extends JpaRepository<OrderInfoEntity, Long>, JpaSpecificationExecutor<OrderInfoEntity> { public interface OrderInfoDao extends JpaRepository<OrderInfoEntity, Long>, JpaSpecificationExecutor<OrderInfoEntity> {
OrderInfoEntity getByOrderId(String orderId); OrderInfoEntity getByOrderId(String orderId);
OrderInfoEntity getByOrderIdAndDt(String orderId, LocalDate dt); OrderInfoEntity getByOrderIdAndDt(String orderId, LocalDate dt);
List<OrderInfoEntity> findByOrderId(String orderId); List<OrderInfoEntity> findByOrderId(String orderId);
List<OrderInfoEntity> findByDtAndEngineerCodeIn(LocalDate date, List<String> engineerCodes); List<OrderInfoEntity> findByDtAndEngineerCodeIn(LocalDate date, List<String> engineerCodes);
List<OrderInfoEntity> findByDtAndEngineerCode(LocalDate date, String engineerCode); List<OrderInfoEntity> findByDtAndEngineerCode(LocalDate date, String engineerCode);
@Query("SELECT o.orderId, s.skillCategory as skillCaption FROM OrderInfoEntity o JOIN SkillInfoEntity s on o.brand=s.brand and o.type=s.type and o.skill=s.skill WHERE o.orderId = :orderId and o.dt = :dt") @Query("SELECT o.orderId, s.skillCategory as skillCaption FROM OrderInfoEntity o JOIN SkillInfoEntity s on o.brand=s.brand and o.type=s.type and o.skill=s.skill WHERE o.orderId = :orderId and o.dt = :dt")
OrderSkillProjection getOrderSkillCaptionByOrderIdAndDt(String orderId, LocalDate dt); OrderSkillProjection getOrderSkillCaptionByOrderIdAndDt(String orderId, LocalDate dt);
List<OrderInfoEntity> findAllByOrderIdIn(List<String> orderIds); List<OrderInfoEntity> findAllByOrderIdIn(List<String> orderIds);
List<OrderInfoEntity> findAllByDtAndOrderIdIn(LocalDate dt, List<String> orderIds); List<OrderInfoEntity> findAllByDtAndOrderIdIn(LocalDate dt, List<String> orderIds);
List<OrderInfoEntity> findByEngineerCodeAndDtAndAppointmentStatusIn(String engineerCode, LocalDate dt, List<String> appointmentStatus); List<OrderInfoEntity> findByEngineerCodeAndDtAndAppointmentStatusIn(String engineerCode, LocalDate dt, List<String> appointmentStatus);
List<OrderInfoEntity> findByDtAndOrgTeamIdAndAppointmentStatusIn(LocalDate dt, String orgTeamId, List<String> appointmentStatus); List<OrderInfoEntity> findByDtAndOrgTeamIdAndAppointmentStatusIn(LocalDate dt, String orgTeamId, List<String> appointmentStatus);
OrderInfoEntity findTopBySkillAndAppointmentStatus(String skill, String status); OrderInfoEntity findTopBySkillAndAppointmentStatus(String skill, String status);
List<OrderInfoEntity> findByServiceStatusAndEngineerCode(String serviceStatus, String engineerCode); List<OrderInfoEntity> findByServiceStatusAndEngineerCode(String serviceStatus, String engineerCode);
List<OrderInfoEntity> findByDtAndAddressId(String dt, String addressId);
List<OrderInfoEntity> findByMultipleOrders(String multipleOrders);
} }
...@@ -3,53 +3,95 @@ package com.dituhui.pea.order.dto; ...@@ -3,53 +3,95 @@ package com.dituhui.pea.order.dto;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data; import lombok.Data;
import javax.persistence.Column;
import java.util.List; import java.util.List;
@Data @Data
public class DispatchEngineerOrderListResp { public class DispatchEngineerOrderListResp {
private List<EngineerInfo> engineers; private List<EngineerInfo> engineers;
@Data @Data
public static class EngineerInfo{ public static class EngineerInfo {
private String engineerCode; private String engineerCode;
private String engineerName; private String engineerName;
private String capacity; private String capacity;
private String capacityStatus; private String capacityStatus;
private String grade; private String grade;
private List<OrderInfo> orders; private List<OrderInfo> orders;
} }
@JsonInclude(JsonInclude.Include.ALWAYS) @JsonInclude(JsonInclude.Include.ALWAYS)
@Data @Data
public static class OrderInfo{ public static class OrderInfo {
private boolean weight; private boolean weight;
private String orderId; private String orderId;
private String description; private String description;
private String brand; private String brand;
private String type; private String type;
private String skill; private String skill;
private String typeCategory; private String typeCategory;
private String skillCategory; private String skillCategory;
private String faultDescribe; private String faultDescribe;
private String applyNote; private String applyNote;
private Integer duration; private Integer duration;
private String province; private String province;
private String city; private String city;
private String county; private String county;
private String address; private String address;
private String name; private String name;
private String phone; private String phone;
private String expectTimeDesc; private String expectTimeDesc;
private String source; private String source;
private String dispatcher; private String dispatcher;
private String appointmentType; private String appointmentType;
private String appointmentStatus; private String appointmentStatus;
private String serviceStatus; private String serviceStatus;
private String orderStatus; private String orderStatus;
private String orderStatusDesc; private String orderStatusDesc;
private String createTime; private String createTime;
private String groupTag; private String groupTag;
private Integer groupWeight; private Integer groupWeight;
}
/**
* 一家多单id,有则多条订单关联,没有则不是一家多单
*/
private String multipleOrders;
/**
* 一家多单订单集合
*/
private List<OrderInfo> multipleOrderList;
/**
* 是否重物搬运(双人上门) 0:否 1:是 默认0
*/
private Integer isMultiple = 0;
/**
* 是否指定某个工程师/是否排除某个工程师 0:否 1:指定 2:排除 默认0
*/
private Integer isAppointEngineer = 0;
/**
* 指定某个工程师/排除某个工程师 codes 多个,分割
*/
private String appointEngineerCodes;
/**
* 是否超派,0否 1是,默认0
*/
private Integer transcend;
/**
* 工单优先级
*/
private String beanPriority;
/**
* 是否是特殊时间段,0否 1是 默认0
*/
private Integer isSpecialTime;
}
} }
...@@ -13,6 +13,10 @@ public class DispatchOrderListReq { ...@@ -13,6 +13,10 @@ public class DispatchOrderListReq {
private String levelValue; private String levelValue;
@NotNull @NotNull
private String Date; private String Date;
/**
* 0:工单优先级,1:耗时,2:意向时间,3:分站/网点,4:技能,5:一家多单
*/
@NotNull @NotNull
private String groupTagId; private String groupTagId;
private List<String> branchIds; private List<String> branchIds;
......
...@@ -3,41 +3,93 @@ package com.dituhui.pea.order.dto; ...@@ -3,41 +3,93 @@ package com.dituhui.pea.order.dto;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data; import lombok.Data;
import javax.persistence.Column;
import java.util.List; import java.util.List;
@Data @Data
public class DispatchOrderListResp { public class DispatchOrderListResp {
private List<Order> orders; private List<Order> orders;
@JsonInclude(JsonInclude.Include.ALWAYS) @JsonInclude(JsonInclude.Include.ALWAYS)
@Data @Data
public static class Order{ public static class Order {
private boolean weight; private boolean weight;
private String orderId; private String orderId;
private String description; private String description;
private String brand; private String brand;
private String type; private String type;
private String skill; private String skill;
private String typeCategory; private String typeCategory;
private String skillCategory; private String skillCategory;
private String faultDescribe; private String faultDescribe;
private String applyNote; private String applyNote;
private Integer duration; private Integer duration;
private String province; private String province;
private String city; private String city;
private String county; private String county;
private String address; private String address;
private String name; private String name;
private String phone; private String phone;
private String expectTimeDesc; private String expectTimeDesc;
private String source; private String source;
private String appointmentType; private String appointmentType;
private String dispatcher; private String dispatcher;
private String appointmentStatus; private String appointmentStatus;
private String orderStatus; private String orderStatus;
private String serviceStatus; private String serviceStatus;
private String createTime; private String createTime;
private String groupTag; private String groupTag;
private Integer groupWeight; private Integer groupWeight;
}
/**
* 一家多单id,有则多条订单关联,没有则不是一家多单
*/
private String multipleOrders;
/**
* 分站/网点id
*/
private String orgGroupId;
/**
* 分站/网点name
*/
private String orgGroupName;
/**
* 一家多单订单集合
*/
private List<DispatchOrderListResp.Order> multipleOrderList;
/**
* 是否重物搬运(双人上门) 0:否 1:是 默认0
*/
private Integer isMultiple;
/**
* 是否指定某个工程师/是否排除某个工程师 0:否 1:指定 2:排除 默认0
*/
private Integer isAppointEngineer;
/**
* 指定某个工程师/排除某个工程师 codes 多个,分割
*/
private String appointEngineerCodes;
/**
* 是否超派,0否 1是,默认0
*/
private Integer transcend;
/**
* 工单优先级
*/
private String beanPriority;
/**
* 是否是特殊时间段,0否 1是 默认0
*/
private Integer isSpecialTime;
}
} }
package com.dituhui.pea.order.dto;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 公共 id类
*
* @author RenPing
* @date 2023/10/26
*/
@Data
public class IdDTO {
@NotNull(message = "ID不能为空")
private Integer id;
}
...@@ -49,4 +49,12 @@ public class MsgDTO { ...@@ -49,4 +49,12 @@ public class MsgDTO {
@Min(value = 0, message = "标签类型格式不对") @Min(value = 0, message = "标签类型格式不对")
@Max(value = 1, message = "标签类型格式不对") @Max(value = 1, message = "标签类型格式不对")
private Integer tag; private Integer tag;
@Data
public static class IdDTO {
@NotNull(message = "ID不能为空")
private Integer id;
}
} }
\ No newline at end of file
...@@ -56,7 +56,17 @@ public class MsgQuery { ...@@ -56,7 +56,17 @@ public class MsgQuery {
private String keyWord; private String keyWord;
/** /**
* 大区ID、部门ID、小组ID * 大区ID(大区Id、分部Id、分组Id只需传一个)
*/ */
private String orgTreeValue; private String clusterId;
/**
* 分部ID
*/
private String branchId;
/**
* 小组ID
*/
private String groupId;
} }
\ No newline at end of file
...@@ -2,6 +2,8 @@ package com.dituhui.pea.order.dto; ...@@ -2,6 +2,8 @@ package com.dituhui.pea.order.dto;
import lombok.Data; import lombok.Data;
import java.util.List;
@Data @Data
public class OrderServiceList { public class OrderServiceList {
private String orderId; private String orderId;
...@@ -54,4 +56,24 @@ public class OrderServiceList { ...@@ -54,4 +56,24 @@ public class OrderServiceList {
private String appointEngineerCodes; private String appointEngineerCodes;
/**
* 一家多单订单集合
*/
private List<OrderServiceList> multipleOrderList;
/**
* 一家多单id,有则多条订单关联,没有则不是一家多单
*/
private String multipleOrders;
/**
* 是否超派,0否 1是,默认0
*/
private Integer transcend;
/**
* 是否是特殊时间段,0否 1是 默认0
*/
private Integer isSpecialTime;
} }
...@@ -75,4 +75,27 @@ public class OrderInfo { ...@@ -75,4 +75,27 @@ public class OrderInfo {
* 指定某个工程师/排除某个工程师 codes 多个,分割 * 指定某个工程师/排除某个工程师 codes 多个,分割
*/ */
private String appointEngineerCodes; private String appointEngineerCodes;
/**
* 一家多单id,有则多条订单关联,没有则不是一家多单
*/
private String multipleOrders;
/**
* bean同步地址id
*/
private String addressId;
/**
* 是否超派,0否 1是,默认0
*/
private Integer transcend;
/**
* 是否是特殊时间段,0否 1是 默认0
*/
private Integer isSpecialTime;
} }
\ No newline at end of file
...@@ -198,6 +198,34 @@ public class OrderInfoEntity { ...@@ -198,6 +198,34 @@ public class OrderInfoEntity {
@Column(name = "appoint_engineer_codes") @Column(name = "appoint_engineer_codes")
private String appointEngineerCodes; private String appointEngineerCodes;
/**
* 一家多单id,有则多条订单关联,没有则不是一家多单
*/
@Column(name = "multiple_orders")
private String multipleOrders;
/**
* bean同步地址id
*/
@Column(name = "address_id")
private String addressId;
/**
* 是否超派,0否 1是,默认0
*/
@Column(name = "transcend")
private Integer transcend;
/**
* 是否是特殊时间段,0否 1是 默认0
*/
@Column(name = "is_special_time")
private Integer isSpecialTime = 0;
/** /**
* 申请加单状态,CONFIRMED 预约成功 * 申请加单状态,CONFIRMED 预约成功
* REFUSED 客户拒绝 * REFUSED 客户拒绝
......
package com.dituhui.pea.order.enums;
public enum OrderGroupEnum {
zero("0"),
one("1"),
two("2"),
three("3"),
four("4"),
five("5");
private String code;
OrderGroupEnum(String code) {
this.code = code;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}
...@@ -8,9 +8,17 @@ import java.util.List; ...@@ -8,9 +8,17 @@ import java.util.List;
public interface DispatchService { public interface DispatchService {
Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO); Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO);
Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO); Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO);
Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds); Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds);
/**
* 待派工工单池分组
*
* @param reqDTO
* @return
*/
Result<?> getDispatchOrderGroup(DispatchOrderListReq reqDTO);
} }
package com.dituhui.pea.order.service;
import com.dituhui.pea.common.Result;
/**
* 订单相关
*/
public interface OrderInfoService {
/**
* 新增订单处理一家多单逻辑
*
* @param dt 订单日期 列:2023-07-21
* @param addressId 地址id
* @return 有则返回多条订单关联id,没有则不是一家多单
*/
Result<String> addMultipleOrders(String dt, String addressId);
/**
* 取消指定订单一家多台
*
* @param multipleOrders 订单关联id
* @param orderId 订单id
* @return 有则返回多条订单关联id,没有则不是一家多单
*/
Result deleteMultipleOrders(String multipleOrders, String orderId);
}
package com.dituhui.pea.order.service.impl; package com.dituhui.pea.order.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.dituhui.pea.common.BusinessException; import com.dituhui.pea.common.BusinessException;
import com.dituhui.pea.common.Result; import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.common.ListUtils; import com.dituhui.pea.order.common.ListUtils;
...@@ -11,9 +10,11 @@ import com.dituhui.pea.order.dto.DispatchEngineerOrderListResp; ...@@ -11,9 +10,11 @@ import com.dituhui.pea.order.dto.DispatchEngineerOrderListResp;
import com.dituhui.pea.order.dto.DispatchOrderListReq; import com.dituhui.pea.order.dto.DispatchOrderListReq;
import com.dituhui.pea.order.dto.DispatchOrderListResp; import com.dituhui.pea.order.dto.DispatchOrderListResp;
import com.dituhui.pea.order.entity.*; import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.enums.OrderGroupEnum;
import com.dituhui.pea.order.enums.OrderStatus; import com.dituhui.pea.order.enums.OrderStatus;
import com.dituhui.pea.order.service.DispatchService; import com.dituhui.pea.order.service.DispatchService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.domain.Specification;
...@@ -28,9 +29,9 @@ import java.util.*; ...@@ -28,9 +29,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 +39,767 @@ interface GroupTag { ...@@ -38,625 +39,767 @@ 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 @Autowired
@Override private OrgGroupDao orgGroupDao;
public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) {
// 获取派工台订单列表 @Transactional
@Override
// 获取技能信息 public Result<?> getDispatchOrderList(DispatchOrderListReq reqDTO) {
HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo(); // 获取派工台订单列表
// 获取工单列表 // 获取技能信息
List<OrderInfoEntity> orders = this.queryOrders(reqDTO); HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo();
// 获取分组标签 // 获取工单列表
GroupTag gt = new GroupTagFactory().getGroupTag(reqDTO.getGroupTagId()); List<OrderInfoEntity> orders = this.queryOrders(reqDTO);
List<DispatchOrderListResp.Order> items = new ArrayList<>(); // 获取分组标签
for (OrderInfoEntity o : orders) { GroupTag gt = new GroupTagFactory().getGroupTag(reqDTO.getGroupTagId());
DispatchOrderListResp.Order item = new DispatchOrderListResp.Order();
List<DispatchOrderListResp.Order> items = new ArrayList<>();
item.setOrderId(o.getOrderId()); for (OrderInfoEntity o : orders) {
item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(), DispatchOrderListResp.Order item = new DispatchOrderListResp.Order();
o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress()));
item.setBrand(o.getBrand()); item.setOrderId(o.getOrderId());
item.setType(o.getType()); item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(),
item.setSkill(o.getSkill()); o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress()));
item.setFaultDescribe(o.getFaultDescribe()); item.setBrand(o.getBrand());
item.setApplyNote(o.getApplyNote()); item.setType(o.getType());
item.setSkill(o.getSkill());
String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill()); item.setFaultDescribe(o.getFaultDescribe());
SkillInfoEntity skill = skillInfo.get(key); item.setApplyNote(o.getApplyNote());
if (skill != null) {
item.setDuration(skill.getTakeTime()); String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill());
item.setSkillCategory(skill.getSkillCategory()); SkillInfoEntity skill = skillInfo.get(key);
item.setTypeCategory(skill.getTypeCategory()); if (skill != null) {
} item.setDuration(skill.getTakeTime());
item.setName(o.getName()); item.setSkillCategory(skill.getSkillCategory());
item.setPhone(o.getPhone()); item.setTypeCategory(skill.getTypeCategory());
item.setCity(o.getCity()); }
item.setAddress(o.getAddress()); item.setName(o.getName());
item.setProvince(o.getProvince()); item.setPhone(o.getPhone());
item.setCity(o.getCity()); item.setCity(o.getCity());
item.setCounty(o.getCounty()); item.setAddress(o.getAddress());
item.setAddress(o.getAddress()); item.setProvince(o.getProvince());
item.setName(o.getName()); item.setCity(o.getCity());
item.setPhone(o.getPhone()); item.setCounty(o.getCounty());
item.setExpectTimeDesc(o.getExpectTimeDesc()); item.setAddress(o.getAddress());
item.setSource(o.getSource()); item.setName(o.getName());
item.setDispatcher(o.getDispatcher()); item.setPhone(o.getPhone());
item.setAppointmentType(o.getAppointmentMethod()); item.setExpectTimeDesc(o.getExpectTimeDesc());
item.setAppointmentStatus(o.getAppointmentStatus()); item.setSource(o.getSource());
item.setOrderStatus(o.getOrderStatus()); item.setDispatcher(o.getDispatcher());
item.setServiceStatus(o.getServiceStatus()); item.setAppointmentType(o.getAppointmentMethod());
item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime())); item.setAppointmentStatus(o.getAppointmentStatus());
item.setOrderStatus(o.getOrderStatus());
String[] tags = gt.getGroupTag(o).split("#"); item.setServiceStatus(o.getServiceStatus());
item.setGroupTag(tags[0]); // 设置tag名称 item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
item.setGroupWeight(Integer.parseInt(tags[1])); // 设置tag权重
String[] tags = gt.getGroupTag(o).split("#");
items.add(item); item.setGroupTag(tags[0]); // 设置tag名称
} item.setGroupWeight(Integer.parseInt(tags[1])); // 设置tag权重
DispatchOrderListResp res = new DispatchOrderListResp(); items.add(item);
res.setOrders(items); }
return Result.success(res);
} DispatchOrderListResp res = new DispatchOrderListResp();
res.setOrders(items);
@Transactional return Result.success(res);
@Override }
public Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO) throws BusinessException {
// 派工台技术员预约单列表 @Transactional
@Override
LocalDate date = TimeUtils.IsoDate2LocalDate(reqDTO.getDate()); public Result<?> getDispatchEngineerOrderList(DispatchEngineerOrderListReq reqDTO) throws BusinessException {
// 派工台技术员预约单列表
// 获取技能信息
HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo(); LocalDate date = TimeUtils.IsoDate2LocalDate(reqDTO.getDate());
// 获取teamIds // 获取技能信息
List<String> teamIds = this.queryOrgTeamIds(reqDTO.getLevelType(), reqDTO.getLevelValue(), reqDTO.getBranchIds(), HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo();
reqDTO.getGroupIds(), reqDTO.getTeamIds());
if (teamIds.isEmpty()) { // 获取teamIds
throw new BusinessException("大区/分部/小组组织结构配置可能错误或缺失,请联系管理员/研发"); List<String> teamIds = this.queryOrgTeamIds(reqDTO.getLevelType(), reqDTO.getLevelValue(), reqDTO.getBranchIds(),
} reqDTO.getGroupIds(), reqDTO.getTeamIds());
if (teamIds.isEmpty()) {
// 获取engineer列表 throw new BusinessException("大区/分部/小组组织结构配置可能错误或缺失,请联系管理员/研发");
List<EngineerInfoEntity> engineers = this.queryEngineers(teamIds, reqDTO.getEngineerCodes(), reqDTO.getKey()); }
if (engineers.isEmpty()) {
// 该group下没有技术员,返回空 // 获取engineer列表
log.warn("没有找到技术员"); List<EngineerInfoEntity> engineers = this.queryEngineers(teamIds, reqDTO.getEngineerCodes(), reqDTO.getKey());
DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp(); if (engineers.isEmpty()) {
List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>(); // 该group下没有技术员,返回空
res.setEngineers(egs); log.warn("没有找到技术员");
return Result.success(res); DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp();
} List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>();
res.setEngineers(egs);
// 获取engineerCodes return Result.success(res);
List<String> engineerCodes = engineers.stream().map(EngineerInfoEntity::getEngineerCode).collect(Collectors.toList()); }
// 获取技术员已指派单列表 // 获取engineerCodes
Map<String, List<OrderInfoEntity>> engineerOrders = this.queryEngineerOrders(engineerCodes, date); List<String> engineerCodes = engineers.stream().map(EngineerInfoEntity::getEngineerCode).collect(Collectors.toList());
// 获取技术员的容量 // 获取技术员已指派单列表
HashMap<String, CapacityEngineerStatEntity> engineerCap = this.queryCapacityEngineerStat(engineerCodes, reqDTO.getDate()); Map<String, List<OrderInfoEntity>> engineerOrders = this.queryEngineerOrders(engineerCodes, date);
// 获取技术员已指派单列表 // 获取技术员的容量
List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>(); HashMap<String, CapacityEngineerStatEntity> engineerCap = this.queryCapacityEngineerStat(engineerCodes, reqDTO.getDate());
for (EngineerInfoEntity e : engineers) {
// 获取技术员已指派单列表
List<DispatchEngineerOrderListResp.OrderInfo> items = new ArrayList<>(); List<DispatchEngineerOrderListResp.EngineerInfo> egs = new ArrayList<>();
for (EngineerInfoEntity e : engineers) {
// 技术员已指派的订单列表 List<DispatchEngineerOrderListResp.OrderInfo> items = new ArrayList<>();
List<OrderInfoEntity> records = engineerOrders.getOrDefault(e.getEngineerCode(), new ArrayList<>());
for (OrderInfoEntity o : records) { // 技术员已指派的订单列表
DispatchEngineerOrderListResp.OrderInfo item = new DispatchEngineerOrderListResp.OrderInfo(); List<OrderInfoEntity> records = engineerOrders.getOrDefault(e.getEngineerCode(), new ArrayList<>());
for (OrderInfoEntity o : records) {
item.setOrderId(o.getOrderId()); addOrderToItems(o, items, skillInfo, true);
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()));
item.setBrand(o.getBrand()); // 获取容量
item.setType(o.getType()); int capUsed = 0;
item.setSkill(o.getSkill()); int capTotal = 0;
item.setFaultDescribe(o.getFaultDescribe()); String capacityStatus = "less";
item.setApplyNote(o.getApplyNote()); CapacityEngineerStatEntity cap = engineerCap.get(e.getEngineerCode());
if (cap != null) {
String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill()); capUsed = cap.getCapUsed();
SkillInfoEntity skill = skillInfo.get(key); capTotal = cap.getCapTotal();
if (skill != null) { if (capTotal > 0 && (float) capUsed / capTotal < 0.8) {
item.setDuration(skill.getTakeTime()); capacityStatus = "normal";
item.setSkillCategory(skill.getSkillCategory()); }
item.setTypeCategory(skill.getTypeCategory()); }
}
DispatchEngineerOrderListResp.EngineerInfo eg = new DispatchEngineerOrderListResp.EngineerInfo();
item.setName(o.getName()); eg.setOrders(items);
item.setPhone(o.getPhone()); eg.setEngineerCode(e.getEngineerCode());
item.setCity(o.getCity()); eg.setEngineerName(e.getName());
item.setAddress(o.getAddress()); eg.setGrade(e.getGrade());
item.setProvince(o.getProvince()); eg.setCapacity(String.format("%d/%d", capUsed, capTotal));
item.setCity(o.getCity()); eg.setCapacityStatus(capacityStatus);
item.setCounty(o.getCounty());
item.setAddress(o.getAddress()); egs.add(eg);
item.setName(o.getName()); }
item.setPhone(o.getPhone()); DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp();
res.setEngineers(egs);
String time = TimeUtils.localDateTime2String(o.getPlanStartTime(), "HH:mm"); return Result.success(res);
String timeSlot = this.parseTimeSlot(o.getPlanStartTime()); }
item.setExpectTimeDesc(String.format("%s/%s", time, timeSlot));
private void addOrderToItems(OrderInfoEntity o, List<DispatchEngineerOrderListResp.OrderInfo> items, HashMap<String, SkillInfoEntity> skillInfo, boolean isContinue) {
item.setSource(o.getSource()); DispatchEngineerOrderListResp.OrderInfo item = new DispatchEngineerOrderListResp.OrderInfo();
item.setDispatcher(o.getDispatcher()); item.setOrderId(o.getOrderId());
item.setAppointmentType(o.getAppointmentMethod()); item.setDescription(String.format("%s:%s-%s-%s\n%s:%s-%s-%s", o.getOrderId(), o.getBrand(), o.getType(),
item.setAppointmentStatus(o.getAppointmentStatus()); o.getSkill(), o.getName(), o.getCity(), o.getCounty(), o.getAddress()));
item.setOrderStatus(o.getOrderStatus()); // 订单状态 item.setBrand(o.getBrand());
item.setServiceStatus(o.getServiceStatus()); item.setType(o.getType());
item.setOrderStatusDesc(OrderStatus.valueOf(o.getOrderStatus()).getDescription()); item.setSkill(o.getSkill());
item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime())); item.setFaultDescribe(o.getFaultDescribe());
item.setApplyNote(o.getApplyNote());
items.add(item);
} String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill());
SkillInfoEntity skill = skillInfo.get(key);
// 获取容量 if (skill != null) {
int capUsed = 0; item.setDuration(skill.getTakeTime());
int capTotal = 0; item.setSkillCategory(skill.getSkillCategory());
String capacityStatus = "less"; item.setTypeCategory(skill.getTypeCategory());
CapacityEngineerStatEntity cap = engineerCap.get(e.getEngineerCode()); }
if (cap != null) {
capUsed = cap.getCapUsed(); item.setName(o.getName());
capTotal = cap.getCapTotal(); item.setPhone(o.getPhone());
if (capTotal > 0 && (float) capUsed / capTotal < 0.8) { item.setCity(o.getCity());
capacityStatus = "normal"; item.setAddress(o.getAddress());
} item.setProvince(o.getProvince());
} item.setCity(o.getCity());
item.setCounty(o.getCounty());
DispatchEngineerOrderListResp.EngineerInfo eg = new DispatchEngineerOrderListResp.EngineerInfo(); item.setAddress(o.getAddress());
eg.setOrders(items); item.setName(o.getName());
eg.setEngineerCode(e.getEngineerCode()); item.setPhone(o.getPhone());
eg.setEngineerName(e.getName());
eg.setGrade(e.getGrade()); String time = TimeUtils.localDateTime2String(o.getPlanStartTime(), "HH:mm");
eg.setCapacity(String.format("%d/%d", capUsed, capTotal)); String timeSlot = this.parseTimeSlot(o.getPlanStartTime());
eg.setCapacityStatus(capacityStatus); item.setExpectTimeDesc(String.format("%s/%s", time, timeSlot));
egs.add(eg); item.setSource(o.getSource());
} item.setDispatcher(o.getDispatcher());
DispatchEngineerOrderListResp res = new DispatchEngineerOrderListResp(); item.setAppointmentType(o.getAppointmentMethod());
res.setEngineers(egs); item.setAppointmentStatus(o.getAppointmentStatus());
return Result.success(res); item.setOrderStatus(o.getOrderStatus()); // 订单状态
} item.setServiceStatus(o.getServiceStatus());
item.setOrderStatusDesc(OrderStatus.valueOf(o.getOrderStatus()).getDescription());
@Transactional item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
@Override
public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException { item.setMultipleOrders(o.getMultipleOrders());
// 派工台确认派单 item.setIsMultiple(o.getIsMultiple());
item.setIsAppointEngineer(o.getIsAppointEngineer());
LocalDate localDate = TimeUtils.IsoDate2LocalDate(date); item.setAppointEngineerCodes(o.getAppointEngineerCodes());
item.setTranscend(o.getTranscend());
EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode); item.setBeanPriority(o.getBeanPriority());
if (engineer == null) { item.setIsSpecialTime(o.getIsSpecialTime());
throw new BusinessException("技术员不存在"); if (isContinue && StringUtils.isNotEmpty(o.getMultipleOrders())) {
} List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrders(o.getMultipleOrders());
List<OrderInfoEntity> orders = orderInfoDao.findAllByDtAndOrderIdIn(localDate, orderIds); List<DispatchEngineerOrderListResp.OrderInfo> multipleItems = new ArrayList<>();
if (ListUtils.isEmpty(orders)) { for (OrderInfoEntity info : byMultipleOrders) {
throw new BusinessException("订单不存在"); addOrderToItems(info, multipleItems, skillInfo, false);
} }
item.setMultipleOrderList(multipleItems);
// 已经指派的订单 }
List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(localDate, engineerCode); items.add(item);
engineerOrders.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime)); // 按照planStartTime排序 }
List<OrderInfoEntity> orderAppointments = engineerOrders.stream()
.filter(o -> o.getOrderStatus().equals("NORMAL")) @Transactional
.collect(Collectors.toList()); // 过滤,只有NORMAL订单才需要处理,取消订单不需要处理 @Override
public Result<?> dispatchOrderConfirm(String engineerCode, String date, List<String> orderIds) throws BusinessException {
// TODO,临时处理方案,后续调用派单引擎处理 // 派工台确认派单
OrderRequestScheduler scheduler = new OrderRequestScheduler();
List<LineSegment> results = scheduler.scheduler(orders, orderAppointments); LocalDate localDate = TimeUtils.IsoDate2LocalDate(date);
for (LineSegment r : results) {
String orderId = r.id; EngineerInfoEntity engineer = engineerInfoDao.getByEngineerCode(engineerCode);
LocalDateTime planStartTime = scheduler.linePoint2DateTime(r.start, date); if (engineer == null) {
LocalDateTime planEndTime = scheduler.linePoint2DateTime(r.end, date); throw new BusinessException("技术员不存在");
}
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); List<OrderInfoEntity> orders = orderInfoDao.findAllByDtAndOrderIdIn(localDate, orderIds);
CriteriaUpdate<OrderInfoEntity> update = criteriaBuilder.createCriteriaUpdate(OrderInfoEntity.class); if (ListUtils.isEmpty(orders)) {
Root<OrderInfoEntity> root = update.from(OrderInfoEntity.class); throw new BusinessException("订单不存在");
update.set(root.get("planStartTime"), planStartTime); }
update.set(root.get("planEndTime"), planEndTime);
update.set(root.get("appointmentStatus"), "CONFIRM"); // 已经指派的订单
update.set(root.get("appointmentMethod"), "MANUAL"); List<OrderInfoEntity> engineerOrders = orderInfoDao.findByDtAndEngineerCode(localDate, engineerCode);
update.set(root.get("engineerCode"), engineerCode); engineerOrders.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime)); // 按照planStartTime排序
update.where( List<OrderInfoEntity> orderAppointments = engineerOrders.stream()
criteriaBuilder.equal(root.get("orderId"), orderId), .filter(o -> o.getOrderStatus().equals("NORMAL"))
criteriaBuilder.equal(root.get("dt"), localDate) .collect(Collectors.toList()); // 过滤,只有NORMAL订单才需要处理,取消订单不需要处理
);
entityManager.createQuery(update).executeUpdate(); // TODO,临时处理方案,后续调用派单引擎处理
} OrderRequestScheduler scheduler = new OrderRequestScheduler();
return Result.success(null); List<LineSegment> results = scheduler.scheduler(orders, orderAppointments);
} for (LineSegment r : results) {
String orderId = r.id;
private List<OrderInfoEntity> queryOrders(DispatchOrderListReq reqDTO) { LocalDateTime planStartTime = scheduler.linePoint2DateTime(r.start, date);
// 获取服务单列表 LocalDateTime planEndTime = scheduler.linePoint2DateTime(r.end, date);
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<OrderInfoEntity> criteriaQuery = criteriaBuilder.createQuery(OrderInfoEntity.class); CriteriaUpdate<OrderInfoEntity> update = criteriaBuilder.createCriteriaUpdate(OrderInfoEntity.class);
Root<OrderInfoEntity> root = criteriaQuery.from(OrderInfoEntity.class); Root<OrderInfoEntity> root = update.from(OrderInfoEntity.class);
List<Predicate> predicates = new ArrayList<>(); update.set(root.get("planStartTime"), planStartTime);
update.set(root.get("planEndTime"), planEndTime);
predicates.add(criteriaBuilder.equal(root.get("dt"), TimeUtils.IsoDate2LocalDate(reqDTO.getDate()))); update.set(root.get("appointmentStatus"), "CONFIRM");
predicates.add(criteriaBuilder.equal(root.get("appointmentStatus"), "INIT")); update.set(root.get("appointmentMethod"), "MANUAL");
update.set(root.get("engineerCode"), engineerCode);
String levelType = reqDTO.getLevelType(); update.where(
String levelValue = reqDTO.getLevelValue(); criteriaBuilder.equal(root.get("orderId"), orderId),
if ("cluster".equals(levelType)) { criteriaBuilder.equal(root.get("dt"), localDate)
predicates.add(criteriaBuilder.equal(root.get("orgClusterId"), levelValue)); );
} else if ("branch".equals(levelType)) { entityManager.createQuery(update).executeUpdate();
predicates.add(criteriaBuilder.equal(root.get("orgBranchId"), levelValue)); }
} else if ("group".equals(levelType)) { return Result.success(null);
predicates.add(criteriaBuilder.equal(root.get("orgGroupId"), levelValue)); }
}
// 筛选项 @Override
if (StringUtils.isNotEmpty(reqDTO.getPhone())) { public Result<?> getDispatchOrderGroup(DispatchOrderListReq reqDTO) {
predicates.add(criteriaBuilder.equal(root.get("phone"), reqDTO.getPhone())); // 获取技能信息
} HashMap<String, SkillInfoEntity> skillInfo = this.querySkillInfo();
if (StringUtils.isNotEmpty(reqDTO.getOrderId())) { // 获取工单列表
predicates.add(criteriaBuilder.equal(root.get("orderId"), reqDTO.getOrderId())); List<OrderInfoEntity> orders = this.queryOrders(reqDTO);
} if (CollectionUtils.isEmpty(orders)) {
if (ListUtils.isNotEmpty(reqDTO.getBranchIds())) { return Result.success();
predicates.add(root.get("orgBranchId").in(reqDTO.getBranchIds())); }
} List<String> groupIds = orders.stream().map(OrderInfoEntity::getOrgGroupId).distinct().collect(Collectors.toList());
if (ListUtils.isNotEmpty(reqDTO.getGroupIds())) { List<OrgGroupEntity> byGroupIdIn = orgGroupDao.findByGroupIdIn(groupIds);
predicates.add(root.get("orgGroupId").in(reqDTO.getGroupIds())); Map<String, String> groupMap = byGroupIdIn.stream().collect(Collectors.toMap(OrgGroupEntity::getGroupId, OrgGroupEntity::getGroupName));
} List<DispatchOrderListResp.Order> items = new ArrayList<>();
if (ListUtils.isNotEmpty(reqDTO.getTeamIds())) { Map<Object, List<DispatchOrderListResp.Order>> groupByMap = new HashMap<>();
predicates.add(root.get("orgTeamId").in(reqDTO.getTeamIds())); for (OrderInfoEntity o : orders) {
} items.add(orderItemByOrderInfo(o, skillInfo, true, groupMap, groupByMap, reqDTO.getGroupTagId()));
if (ListUtils.isNotEmpty(reqDTO.getAppointmentType())) { }
predicates.add(root.get("appointmentMethod").in(reqDTO.getAppointmentType())); return Result.success(groupByMap);
} }
if (ListUtils.isNotEmpty(reqDTO.getPriorities())) { /**
List<Integer> p = reqDTO.getPriorities(); * 组装订单数据,并封装进map
if (p.contains(0) && p.contains(1)) { *
predicates.add(criteriaBuilder.ge(root.get("priority"), 1)); * @param o
} else if (p.contains(0) && !p.contains(1)) { * @param skillInfo
predicates.add(criteriaBuilder.le(root.get("priority"), 1)); * @param isContinue
} else if (p.contains(1) && !p.contains(0)) { * @param groupMap
predicates.add(criteriaBuilder.ge(root.get("priority"), 5)); * @param groupByMap
} * @param groupTagId
} * @return
*/
if (ListUtils.isNotEmpty(reqDTO.getEngineerCodes())) { private DispatchOrderListResp.Order orderItemByOrderInfo(OrderInfoEntity o, HashMap<String, SkillInfoEntity> skillInfo,
Predicate engineerCodePredicate = root.get("engineerCode").in(reqDTO.getEngineerCodes()); boolean isContinue, Map<String, String> groupMap, Map<Object, List<DispatchOrderListResp.Order>> groupByMap, String groupTagId) {
Predicate engineerCodeSubPredicate = root.get("engineerCodeSub").in(reqDTO.getEngineerCodes()); DispatchOrderListResp.Order item = new DispatchOrderListResp.Order();
predicates.add(criteriaBuilder.or(engineerCodePredicate, engineerCodeSubPredicate)); item.setOrderId(o.getOrderId());
} 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()));
if (ListUtils.isNotEmpty(reqDTO.getTypeCategory())) { item.setBrand(o.getBrand());
Subquery<OrderInfoEntity> typeCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class); item.setType(o.getType());
Root<SkillInfoEntity> skillInfoRoot = typeCategorySubquery.from(SkillInfoEntity.class); item.setSkill(o.getSkill());
typeCategorySubquery.select(root) item.setFaultDescribe(o.getFaultDescribe());
.where( item.setApplyNote(o.getApplyNote());
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")), String key = String.format("%s%s%s", o.getBrand(), o.getType(), o.getSkill());
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")), SkillInfoEntity skill = skillInfo.get(key);
skillInfoRoot.get("typeCategory").in(reqDTO.getTypeCategory()) if (skill != null) {
); item.setDuration(skill.getTakeTime());
predicates.add(criteriaBuilder.exists(typeCategorySubquery)); item.setSkillCategory(skill.getSkillCategory());
} item.setTypeCategory(skill.getTypeCategory());
}
if (ListUtils.isNotEmpty(reqDTO.getSkillCategory())) { item.setName(o.getName());
Subquery<OrderInfoEntity> skillCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class); item.setPhone(o.getPhone());
Root<SkillInfoEntity> skillInfoRoot = skillCategorySubquery.from(SkillInfoEntity.class); item.setCity(o.getCity());
skillCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root item.setAddress(o.getAddress());
.where( item.setProvince(o.getProvince());
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")), item.setCity(o.getCity());
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")), item.setCounty(o.getCounty());
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")), item.setAddress(o.getAddress());
skillInfoRoot.get("skillCategory").in(reqDTO.getSkillCategory()) item.setName(o.getName());
); item.setPhone(o.getPhone());
predicates.add(criteriaBuilder.exists(skillCategorySubquery)); item.setExpectTimeDesc(o.getExpectTimeDesc());
} item.setSource(o.getSource());
item.setDispatcher(o.getDispatcher());
if (ListUtils.isNotEmpty(reqDTO.getGroupCategory())) { item.setAppointmentType(o.getAppointmentMethod());
Subquery<OrderInfoEntity> skillGroupCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class); item.setAppointmentStatus(o.getAppointmentStatus());
Root<SkillInfoEntity> skillInfoRoot = skillGroupCategorySubquery.from(SkillInfoEntity.class); item.setOrderStatus(o.getOrderStatus());
skillGroupCategorySubquery.select(root) // 注意这里的 select 使用主查询的 root item.setServiceStatus(o.getServiceStatus());
.where( item.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")), item.setMultipleOrders(o.getMultipleOrders());
criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")), item.setIsMultiple(o.getIsMultiple());
skillInfoRoot.get("groupCategory").in(reqDTO.getGroupCategory()) item.setIsAppointEngineer(o.getIsAppointEngineer());
); item.setAppointEngineerCodes(o.getAppointEngineerCodes());
predicates.add(criteriaBuilder.exists(skillGroupCategorySubquery)); item.setTranscend(o.getTranscend());
} item.setBeanPriority(o.getBeanPriority());
item.setOrgGroupId(o.getOrgGroupId());
criteriaQuery.where(predicates.toArray(new Predicate[0])); item.setIsSpecialTime(o.getIsSpecialTime());
return entityManager.createQuery(criteriaQuery).getResultList(); item.setOrgGroupName(groupMap.get(o.getOrgGroupId()));
} if (isContinue && StringUtils.isNotEmpty(o.getMultipleOrders())) {
List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrders(o.getMultipleOrders());
private Map<String, List<OrderInfoEntity>> queryEngineerOrders(List<String> engineerCodes, LocalDate date) { List<DispatchOrderListResp.Order> multipleItems = new ArrayList<>();
// 获取工程师服务单列表 for (OrderInfoEntity info : byMultipleOrders) {
List<OrderInfoEntity> records = orderInfoDao.findByDtAndEngineerCodeIn(date, engineerCodes); multipleItems.add(orderItemByOrderInfo(info, skillInfo, false, groupMap, groupByMap, groupTagId));
}
// 排序 item.setMultipleOrderList(multipleItems);
records.sort(Comparator.comparing(OrderInfoEntity::getEngineerCode)); }
records.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime)); if (groupTagId.equals(OrderGroupEnum.zero.getCode()) && StringUtils.isNotEmpty(item.getBeanPriority())) {
makeOrderMap(groupByMap, item, item.getBeanPriority());
//过滤 } else if (groupTagId.equals(OrderGroupEnum.one.getCode()) && null != item.getDuration()) {
List<OrderInfoEntity> orders = records.stream() makeOrderMap(groupByMap, item, item.getDuration());
.filter(r -> r.getOrderStatus().equals("NORMAL")) } else if (groupTagId.equals(OrderGroupEnum.two.getCode()) && StringUtils.isNotEmpty(item.getExpectTimeDesc())) {
.collect(Collectors.toList()); makeOrderMap(groupByMap, item, item.getExpectTimeDesc());
} else if (groupTagId.equals(OrderGroupEnum.three.getCode()) && StringUtils.isNotEmpty(item.getOrgGroupName())) {
return orders.stream().collect(Collectors.groupingBy(OrderInfoEntity::getEngineerCode)); makeOrderMap(groupByMap, item, item.getOrgGroupName());
} else if (groupTagId.equals(OrderGroupEnum.four.getCode()) && StringUtils.isNotEmpty(item.getSkill())) {
} makeOrderMap(groupByMap, item, item.getSkill());
} else if (groupTagId.equals(OrderGroupEnum.five.getCode()) && StringUtils.isNotEmpty(item.getMultipleOrders())) {
public List<EngineerInfoEntity> queryEngineers(List<String> teamIds, List<String> engineerCodes, String key) { makeOrderMap(groupByMap, item, item.getMultipleOrders());
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); } else {
CriteriaQuery<EngineerInfoEntity> criteriaQuery = criteriaBuilder.createQuery(EngineerInfoEntity.class); makeOrderMap(groupByMap, item, "默认分类");
Root<EngineerInfoEntity> root = criteriaQuery.from(EngineerInfoEntity.class); }
List<Predicate> predicates = new ArrayList<>(); return item;
}
predicates.add(criteriaBuilder.equal(root.get("beanStatus"), 1));
if (ListUtils.isNotEmpty(engineerCodes)) { /**
predicates.add(root.get("engineerCode").in(engineerCodes)); * 组装data数据到map
} *
* @param groupByMap
Subquery<Integer> teamSubquery = criteriaQuery.subquery(Integer.class); * @param item
Root<OrgTeamEngineerEntity> teamRoot = teamSubquery.from(OrgTeamEngineerEntity.class); * @param groupkey
teamSubquery.select(criteriaBuilder.literal(1)) */
.where( private void makeOrderMap(Map<Object, List<DispatchOrderListResp.Order>> groupByMap, DispatchOrderListResp.Order item, Object groupkey) {
criteriaBuilder.equal(teamRoot.get("engineerCode"), root.get("engineerCode")), List<DispatchOrderListResp.Order> groupByList;
teamRoot.get("teamId").in(teamIds) if (groupByMap.containsKey(groupkey)) {
); groupByList = groupByMap.get(groupkey);
predicates.add(criteriaBuilder.exists(teamSubquery)); } else {
groupByList = new ArrayList<>();
if (StringUtils.isNotEmpty(key)) { }
predicates.add(criteriaBuilder.or( groupByList.add(item);
criteriaBuilder.like(root.get("phone"), "%" + key + "%"), groupByMap.put(groupkey, groupByList);
criteriaBuilder.like(root.get("name"), "%" + key + "%"), }
criteriaBuilder.like(root.get("engineerCode"), "%" + key + "%")
)); private List<OrderInfoEntity> queryOrders(DispatchOrderListReq reqDTO) {
} // 获取服务单列表
criteriaQuery.where(predicates.toArray(new Predicate[0])); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
criteriaQuery.orderBy(criteriaBuilder.asc(root.get("name"))); CriteriaQuery<OrderInfoEntity> criteriaQuery = criteriaBuilder.createQuery(OrderInfoEntity.class);
return entityManager.createQuery(criteriaQuery).getResultList(); Root<OrderInfoEntity> root = criteriaQuery.from(OrderInfoEntity.class);
} List<Predicate> predicates = new ArrayList<>();
private List<String> queryOrgTeamIds(String levelType, String levelIds, List<String> branchIds, List<String> groupIds, List<String> teamIds) { predicates.add(criteriaBuilder.equal(root.get("dt"), TimeUtils.IsoDate2LocalDate(reqDTO.getDate())));
predicates.add(criteriaBuilder.equal(root.get("appointmentStatus"), "INIT"));
Specification<OrgTeamEntity> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>(); String levelType = reqDTO.getLevelType();
if ("cluster".equals(levelType)) { String levelValue = reqDTO.getLevelValue();
predicates.add(criteriaBuilder.in(root.get("clusterId")).value(levelIds)); if ("cluster".equals(levelType)) {
} else if ("branch".equals(levelType)) { predicates.add(criteriaBuilder.equal(root.get("orgClusterId"), levelValue));
predicates.add(criteriaBuilder.in(root.get("branchId")).value(levelIds)); } else if ("branch".equals(levelType)) {
} else if ("group".equals(levelType)) { predicates.add(criteriaBuilder.equal(root.get("orgBranchId"), levelValue));
predicates.add(criteriaBuilder.in(root.get("groupId")).value(levelIds)); } else if ("group".equals(levelType)) {
} predicates.add(criteriaBuilder.equal(root.get("orgGroupId"), levelValue));
if (ListUtils.isNotEmpty(branchIds)) { }
predicates.add(root.get("branchId").in(branchIds)); // 筛选项
} if (StringUtils.isNotEmpty(reqDTO.getPhone())) {
if (ListUtils.isNotEmpty(groupIds)) { predicates.add(criteriaBuilder.equal(root.get("phone"), reqDTO.getPhone()));
predicates.add(root.get("groupId").in(groupIds)); }
} if (StringUtils.isNotEmpty(reqDTO.getOrderId())) {
if (ListUtils.isNotEmpty(teamIds)) { predicates.add(criteriaBuilder.equal(root.get("orderId"), reqDTO.getOrderId()));
predicates.add(root.get("teamId").in(teamIds)); }
} if (ListUtils.isNotEmpty(reqDTO.getBranchIds())) {
return criteriaBuilder.and(predicates.toArray(new Predicate[0])); predicates.add(root.get("orgBranchId").in(reqDTO.getBranchIds()));
}; }
List<OrgTeamEntity> teams = orgTeamDao.findAll(specification); if (ListUtils.isNotEmpty(reqDTO.getGroupIds())) {
return teams.stream().map(OrgTeamEntity::getTeamId).collect(Collectors.toList()); predicates.add(root.get("orgGroupId").in(reqDTO.getGroupIds()));
} }
if (ListUtils.isNotEmpty(reqDTO.getTeamIds())) {
private HashMap<String, Integer> querySkillTakeTime() { predicates.add(root.get("orgTeamId").in(reqDTO.getTeamIds()));
HashMap<String, Integer> map = new HashMap<>(); }
List<SkillInfoEntity> records = skillInfoDao.findAll(); if (ListUtils.isNotEmpty(reqDTO.getAppointmentType())) {
for (SkillInfoEntity r : records) { predicates.add(root.get("appointmentMethod").in(reqDTO.getAppointmentType()));
String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill()); }
map.put(key, r.getTakeTime());
} if (ListUtils.isNotEmpty(reqDTO.getPriorities())) {
return map; List<Integer> p = reqDTO.getPriorities();
} if (p.contains(0) && p.contains(1)) {
predicates.add(criteriaBuilder.ge(root.get("priority"), 1));
private HashMap<String, SkillInfoEntity> querySkillInfo() { } else if (p.contains(0) && !p.contains(1)) {
HashMap<String, SkillInfoEntity> map = new HashMap<>(); predicates.add(criteriaBuilder.le(root.get("priority"), 1));
List<SkillInfoEntity> records = skillInfoDao.findAll(); } else if (p.contains(1) && !p.contains(0)) {
for (SkillInfoEntity r : records) { predicates.add(criteriaBuilder.ge(root.get("priority"), 5));
String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill()); }
map.put(key, r); }
}
return map; if (ListUtils.isNotEmpty(reqDTO.getEngineerCodes())) {
} Predicate engineerCodePredicate = root.get("engineerCode").in(reqDTO.getEngineerCodes());
Predicate engineerCodeSubPredicate = root.get("engineerCodeSub").in(reqDTO.getEngineerCodes());
private HashMap<String, CapacityEngineerStatEntity> queryCapacityEngineerStat(List<String> engineerCodes, String date) { predicates.add(criteriaBuilder.or(engineerCodePredicate, engineerCodeSubPredicate));
List<CapacityEngineerStatEntity> records = capacityEngineerStatDao.getByWorkdayAndEngineerCodeIn(date, engineerCodes); }
HashMap<String, CapacityEngineerStatEntity> map = new HashMap<>(); if (ListUtils.isNotEmpty(reqDTO.getTypeCategory())) {
for (CapacityEngineerStatEntity r : records) { Subquery<OrderInfoEntity> typeCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
map.put(r.getEngineerCode(), r); Root<SkillInfoEntity> skillInfoRoot = typeCategorySubquery.from(SkillInfoEntity.class);
} typeCategorySubquery.select(root)
return map; .where(
} criteriaBuilder.equal(skillInfoRoot.get("brand"), root.get("brand")),
criteriaBuilder.equal(skillInfoRoot.get("type"), root.get("type")),
private String parseTimeSlot(LocalDateTime t) { criteriaBuilder.equal(skillInfoRoot.get("skill"), root.get("skill")),
String h = TimeUtils.localDateTime2String(t, "HH"); skillInfoRoot.get("typeCategory").in(reqDTO.getTypeCategory())
Integer hour = Integer.parseInt(h); );
if (hour <= 12) { predicates.add(criteriaBuilder.exists(typeCategorySubquery));
return "上午"; }
} else if (hour <= 18) {
return "下午"; if (ListUtils.isNotEmpty(reqDTO.getSkillCategory())) {
} else { Subquery<OrderInfoEntity> skillCategorySubquery = criteriaQuery.subquery(OrderInfoEntity.class);
return "晚上"; 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())) {
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));
}
criteriaQuery.where(predicates.toArray(new Predicate[0]));
return entityManager.createQuery(criteriaQuery).getResultList();
}
private Map<String, List<OrderInfoEntity>> queryEngineerOrders(List<String> engineerCodes, LocalDate date) {
// 获取工程师服务单列表
List<OrderInfoEntity> records = orderInfoDao.findByDtAndEngineerCodeIn(date, engineerCodes);
// 排序
records.sort(Comparator.comparing(OrderInfoEntity::getEngineerCode));
records.sort(Comparator.comparing(OrderInfoEntity::getPlanStartTime));
//过滤
List<OrderInfoEntity> orders = records.stream()
.filter(r -> r.getOrderStatus().equals("NORMAL"))
.collect(Collectors.toList());
return orders.stream().collect(Collectors.groupingBy(OrderInfoEntity::getEngineerCode));
}
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));
}
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)) {
predicates.add(criteriaBuilder.or(
criteriaBuilder.like(root.get("phone"), "%" + key + "%"),
criteriaBuilder.like(root.get("name"), "%" + key + "%"),
criteriaBuilder.like(root.get("engineerCode"), "%" + key + "%")
));
}
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) {
Specification<OrgTeamEntity> specification = (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if ("cluster".equals(levelType)) {
predicates.add(criteriaBuilder.in(root.get("clusterId")).value(levelIds));
} else if ("branch".equals(levelType)) {
predicates.add(criteriaBuilder.in(root.get("branchId")).value(levelIds));
} else if ("group".equals(levelType)) {
predicates.add(criteriaBuilder.in(root.get("groupId")).value(levelIds));
}
if (ListUtils.isNotEmpty(branchIds)) {
predicates.add(root.get("branchId").in(branchIds));
}
if (ListUtils.isNotEmpty(groupIds)) {
predicates.add(root.get("groupId").in(groupIds));
}
if (ListUtils.isNotEmpty(teamIds)) {
predicates.add(root.get("teamId").in(teamIds));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
List<OrgTeamEntity> teams = orgTeamDao.findAll(specification);
return teams.stream().map(OrgTeamEntity::getTeamId).collect(Collectors.toList());
}
private HashMap<String, Integer> querySkillTakeTime() {
HashMap<String, Integer> map = new HashMap<>();
List<SkillInfoEntity> records = skillInfoDao.findAll();
for (SkillInfoEntity r : records) {
String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill());
map.put(key, r.getTakeTime());
}
return map;
}
private HashMap<String, SkillInfoEntity> querySkillInfo() {
HashMap<String, SkillInfoEntity> map = new HashMap<>();
List<SkillInfoEntity> records = skillInfoDao.findAll();
for (SkillInfoEntity r : records) {
String key = String.format("%s%s%s", r.getBrand(), r.getType(), r.getSkill());
map.put(key, r);
}
return map;
}
private HashMap<String, CapacityEngineerStatEntity> queryCapacityEngineerStat(List<String> engineerCodes, String date) {
List<CapacityEngineerStatEntity> records = capacityEngineerStatDao.getByWorkdayAndEngineerCodeIn(date, engineerCodes);
HashMap<String, CapacityEngineerStatEntity> map = new HashMap<>();
for (CapacityEngineerStatEntity r : records) {
map.put(r.getEngineerCode(), r);
}
return map;
}
private String parseTimeSlot(LocalDateTime t) {
String h = TimeUtils.localDateTime2String(t, "HH");
Integer hour = Integer.parseInt(h);
if (hour <= 12) {
return "上午";
} else if (hour <= 18) {
return "下午";
} else {
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);
} }
} }
package com.dituhui.pea.order.service.impl;
import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dao.OrderInfoDao;
import com.dituhui.pea.order.entity.OrderInfoEntity;
import com.dituhui.pea.order.service.OrderInfoService;
import com.dituhui.pea.util.UUIDUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
@Service
@Slf4j
public class OrderInfoServiceImpl implements OrderInfoService {
@Autowired
private OrderInfoDao orderInfoDao;
/**
* 新增订单处理一家多单逻辑
*
* @param dt 订单日期 列:2023-07-21
* @param addressId 地址id
* @return 有则返回多条订单关联id,没有则不是一家多单
*/
@Override
@Transactional
public Result<String> addMultipleOrders(String dt, String addressId) {
List<OrderInfoEntity> infoList = orderInfoDao.findByDtAndAddressId(dt, addressId);
if (CollectionUtils.isEmpty(infoList)) {
return Result.success(null);
}
List<String> multipleOrdersList = infoList.stream().filter(e -> StringUtils.isNotEmpty(e.getMultipleOrders())).map(OrderInfoEntity::getMultipleOrders).distinct().collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(multipleOrdersList)) {
return Result.success(multipleOrdersList.get(0));
}
String uuid = UUIDUtil.getUuid();
for (OrderInfoEntity orderInfoEntity : infoList) {
orderInfoEntity.setMultipleOrders(uuid);
orderInfoDao.save(orderInfoEntity);
}
return Result.success(uuid);
}
/**
* 取消指定订单一家多台
*
* @param multipleOrders 订单关联id
* @param orderId 订单id
* @return 有则返回多条订单关联id,没有则不是一家多单
*/
@Override
@Transactional
public Result deleteMultipleOrders(String multipleOrders, String orderId) {
List<OrderInfoEntity> infoList = orderInfoDao.findByMultipleOrders(multipleOrders);
for (OrderInfoEntity infoEntity : infoList) {
if (infoEntity.getOrderId().equals(orderId)) {
infoEntity.setMultipleOrders(null);
orderInfoDao.save(infoEntity);
}
if (infoList.size() == 2) {
infoEntity.setMultipleOrders(null);
orderInfoDao.save(infoEntity);
}
}
return Result.success();
}
}
...@@ -33,6 +33,9 @@ public class OrderServiceListServiceImpl implements OrderServiceListService { ...@@ -33,6 +33,9 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
@Autowired @Autowired
private OrgBranchDao orgBranchDao; private OrgBranchDao orgBranchDao;
@Autowired
private OrderInfoDao orderInfoDao;
@Transactional @Transactional
@Override @Override
public Result<OrderServiceListResp> getOrderServiceList(OrderServiceListReq reqDTO) throws BusinessException { public Result<OrderServiceListResp> getOrderServiceList(OrderServiceListReq reqDTO) throws BusinessException {
...@@ -124,12 +127,12 @@ public class OrderServiceListServiceImpl implements OrderServiceListService { ...@@ -124,12 +127,12 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
record.setDescription(o.getDescription()); record.setDescription(o.getDescription());
record.setPriority(o.getPriority()); record.setPriority(o.getPriority());
record.setOrgBranchName(branchNames.getOrDefault(o.getOrgBranchId(), "")); record.setOrgBranchName(branchNames.getOrDefault(o.getOrgBranchId(), ""));
// 获取工程师信息,为派工为空 // 获取工程师信息,为派工为空
if(StringUtils.isNotBlank(o.getEngineerCode())) { if (StringUtils.isNotBlank(o.getEngineerCode())) {
List<String> names = this.getOrderEngineerNames(o.getEngineerCode(), o.getEngineerCodeSub(), engineerNames); List<String> names = this.getOrderEngineerNames(o.getEngineerCode(), o.getEngineerCodeSub(), engineerNames);
record.setEngineerNum(names.size()); //工程师数量 record.setEngineerNum(names.size()); //工程师数量
record.setEngineerNames(String.join("、", names)); //工程师姓名列表 record.setEngineerNames(String.join("、", names)); //工程师姓名列表
} }
record.setExpectTimeBegin(TimeUtils.IsoTimestamp2DateTime(o.getExpectTimeBegin())); record.setExpectTimeBegin(TimeUtils.IsoTimestamp2DateTime(o.getExpectTimeBegin()));
...@@ -146,7 +149,17 @@ public class OrderServiceListServiceImpl implements OrderServiceListService { ...@@ -146,7 +149,17 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
record.setIsMultiple(o.getIsMultiple()); record.setIsMultiple(o.getIsMultiple());
record.setIsAppointEngineer(o.getIsAppointEngineer()); record.setIsAppointEngineer(o.getIsAppointEngineer());
record.setAppointEngineerCodes(o.getAppointEngineerCodes()); record.setAppointEngineerCodes(o.getAppointEngineerCodes());
record.setMultipleOrders(o.getMultipleOrders());
record.setTranscend(o.getTranscend());
record.setIsSpecialTime(o.getIsSpecialTime());
if (StringUtils.isNotEmpty(o.getMultipleOrders())) {
List<OrderInfoEntity> byMultipleOrders = orderInfoDao.findByMultipleOrders(o.getMultipleOrders());
List<OrderServiceList> multipleItems = new ArrayList<>();
for (OrderInfoEntity info : byMultipleOrders) {
multipleItems.add(toMultipleOrders(info, branchNames, engineerNames));
}
record.setMultipleOrderList(multipleItems);
}
content.add(record); content.add(record);
} }
...@@ -161,6 +174,50 @@ public class OrderServiceListServiceImpl implements OrderServiceListService { ...@@ -161,6 +174,50 @@ public class OrderServiceListServiceImpl implements OrderServiceListService {
return Result.success(res); return Result.success(res);
} }
private OrderServiceList toMultipleOrders(OrderInfoEntity o, Map<String, String> branchNames, Map<String, String> engineerNames) {
OrderServiceList record = new OrderServiceList();
record.setOrderId(o.getOrderId());
record.setType(o.getType());
record.setBrand(o.getBrand());
record.setSkill(o.getSkill());
record.setTakeTime(o.getTakeTime());
record.setFaultDescribe(o.getFaultDescribe());
record.setName(o.getName());
record.setPhone(o.getPhone());
record.setAddress(String.format("%s-%s-%s", o.getCity(), o.getCounty(), o.getAddress()));
record.setX(o.getX());
record.setY(o.getY());
record.setSource(o.getSource());
record.setDescription(o.getDescription());
record.setPriority(o.getPriority());
record.setOrgBranchName(branchNames.getOrDefault(o.getOrgBranchId(), ""));
// 获取工程师信息,为派工为空
if (StringUtils.isNotBlank(o.getEngineerCode())) {
List<String> names = this.getOrderEngineerNames(o.getEngineerCode(), o.getEngineerCodeSub(), engineerNames);
record.setEngineerNum(names.size()); //工程师数量
record.setEngineerNames(String.join("、", names)); //工程师姓名列表
}
record.setExpectTimeBegin(TimeUtils.IsoLocalDateTime2String(o.getExpectTimeBegin()));
record.setExpectTimeEnd(TimeUtils.IsoLocalDateTime2String(o.getExpectTimeEnd()));
record.setExpectTimeDesc(o.getExpectTimeDesc());
record.setAppointmentType(o.getAppointmentMethod());
record.setAppointmentStatus(o.getAppointmentStatus());
record.setOrderStatus(o.getOrderStatus());
record.setServiceStatus(o.getServiceStatus());
record.setDispatcher(o.getDispatcher());
record.setCreateTime(TimeUtils.IsoLocalDateTime2String(o.getCreateTime()));
record.setBeanPriority(o.getBeanPriority());
record.setIsMultiple(o.getIsMultiple());
record.setIsAppointEngineer(o.getIsAppointEngineer());
record.setAppointEngineerCodes(o.getAppointEngineerCodes());
record.setMultipleOrders(o.getMultipleOrders());
record.setTranscend(o.getTranscend());
return record;
}
private Map<String, String> getEngineerNames(List<OrderInfo> orders) { private Map<String, String> getEngineerNames(List<OrderInfo> orders) {
// 获取技术员姓名 // 获取技术员姓名
Set<String> engineerCodes = new HashSet<>(); Set<String> engineerCodes = new HashSet<>();
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!