Commit 97ab5bc7 by huangjinxin

feat:创单全流程打通

fix:分单针对多个面优化
1 parent db9afa68
package com.dituhui.pea.util; package com.dituhui.pea.util;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import java.text.MessageFormat; import java.text.MessageFormat;
...@@ -493,6 +494,16 @@ public class DateUtil { ...@@ -493,6 +494,16 @@ public class DateUtil {
return MessageFormat.format("{}小时{}分{}秒", hours, minutes, second); return MessageFormat.format("{}小时{}分{}秒", hours, minutes, second);
} }
} }
/**
* 获取小时
*
* @param date
* @return
*/
public static Integer getHour(Date date) {
return DateUtils.toCalendar(date).get(Calendar.HOUR_OF_DAY);
}
//CHECKSTYLE:ON //CHECKSTYLE:ON
} }
...@@ -109,7 +109,7 @@ public class SaasUtils { ...@@ -109,7 +109,7 @@ public class SaasUtils {
/** /**
* 根据提供的地址信息,获取对应的片区图层 * 根据提供的地址信息,获取对应的片区图层
*/ */
public List<AdministrativeDistrictResp> getAdminDistrict(AdministrativeDistrictReq districtReq) { public AdministrativeDistrictResp getAdminDistrict(AdministrativeDistrictReq districtReq) {
String webResultStr = saasRemoteService.getAdminDistrict(ak, districtReq); String webResultStr = saasRemoteService.getAdminDistrict(ak, districtReq);
log.info("queryBlocksByXySingle返回结果: ===> {}", webResultStr); log.info("queryBlocksByXySingle返回结果: ===> {}", webResultStr);
SaasWebResult webResult = JSONObject.parseObject(webResultStr, SaasWebResult.class); SaasWebResult webResult = JSONObject.parseObject(webResultStr, SaasWebResult.class);
...@@ -117,8 +117,11 @@ public class SaasUtils { ...@@ -117,8 +117,11 @@ public class SaasUtils {
if (!webResult.getCode().equals("S001")) { if (!webResult.getCode().equals("S001")) {
return null; return null;
} }
List<AdministrativeDistrictResp> administrativeDistrictResp = JSONObject.parseObject(JSONObject.toJSONString(webResult.getResult()), List.class); List<AdministrativeDistrictResp> administrativeDistrictResp = JSONObject.parseArray(JSONObject.toJSONString(webResult.getResult()), AdministrativeDistrictResp.class);
return administrativeDistrictResp; if (CollectionUtils.isNotEmpty(administrativeDistrictResp)) {
return administrativeDistrictResp.get(0);
}
return null;
} }
......
...@@ -33,7 +33,7 @@ public class FendanController { ...@@ -33,7 +33,7 @@ public class FendanController {
} }
@RequestMapping(value = "getAdminDistrict", method = RequestMethod.POST) @RequestMapping(value = "getAdminDistrict", method = RequestMethod.POST)
public Result<List<AdministrativeDistrictResp>> getAdminDistrict(@RequestBody AdministrativeDistrictReq req) { public Result<AdministrativeDistrictResp> getAdminDistrict(@RequestBody AdministrativeDistrictReq req) {
return fendanService.getAdminDistrict(req); return fendanService.getAdminDistrict(req);
} }
} }
...@@ -4,6 +4,7 @@ import com.dituhui.pea.common.BusinessException; ...@@ -4,6 +4,7 @@ import com.dituhui.pea.common.BusinessException;
import com.dituhui.pea.common.Result; import com.dituhui.pea.common.Result;
import com.dituhui.pea.order.dto.OrderCreateReqDTO; import com.dituhui.pea.order.dto.OrderCreateReqDTO;
import com.dituhui.pea.order.dto.CapacityOrderQueryDTO; import com.dituhui.pea.order.dto.CapacityOrderQueryDTO;
import com.dituhui.pea.order.dto.param.OrderDTO;
import com.dituhui.pea.order.service.OrderCreateService; import com.dituhui.pea.order.service.OrderCreateService;
import com.dituhui.pea.order.service.CapacityQueryService; import com.dituhui.pea.order.service.CapacityQueryService;
...@@ -22,7 +23,7 @@ public class OrderCreateController { ...@@ -22,7 +23,7 @@ public class OrderCreateController {
private CapacityQueryService capacityQueryService; private CapacityQueryService capacityQueryService;
@PostMapping("/order/service/create") @PostMapping("/order/service/create")
public Result<?> createOrder(@Validated @RequestBody OrderCreateReqDTO orderCreateReqDTO) { public Result<?> createOrder(@Validated @RequestBody OrderDTO.OrderCreateRequest orderCreateReqDTO) {
Result<?> res = null; Result<?> res = null;
try { try {
res = orderCreateService.createOrder(orderCreateReqDTO); res = orderCreateService.createOrder(orderCreateReqDTO);
......
...@@ -24,8 +24,11 @@ public interface MapBlockInfoDao extends JpaRepository<MapBlockInfoEntity, Integ ...@@ -24,8 +24,11 @@ public interface MapBlockInfoDao extends JpaRepository<MapBlockInfoEntity, Integ
List<MapBlockInfoEntity> findByAreaIdsIn(List<String> blockIds); List<MapBlockInfoEntity> findByAreaIdsIn(List<String> blockIds);
@Query(value = "select mbi.* from map_block_info mbi left join skill_info si on mbi.layer_id = si.layer_id left join map_layer_customize mlc on mlc.layer_id = mbi.layer_id " + List<MapBlockInfoEntity> findByAreaIdsLike(String blockId);
"where si.brand = :brand and si.`type` = :productType and si.skill = :skill and mbi.area_ids in ( :blockIds ) order by mlc.priority ", nativeQuery = true)
List<MapBlockInfoEntity> listTeamIdByBrandAndSkillAndBlockIds(@Param("brand") String brand, @Param("productType") String productType, @Query(value = "select mbi.* from map_block_info mbi left join map_layer_customize_skill mlcs on mlcs.layer_id = mbi.layer_id " +
@Param("skill") String skill, @Param("blockIds") List<String> blockIds); "left join map_layer_customize mlc on mlc.layer_id = mbi.layer_id left join skill_info si on si.skill_code = mlcs.skill_code " +
"where si.brand = :brand and si.`type` = :productType and si.skill = :skill order by mlc.priority ", nativeQuery = true)
List<MapBlockInfoEntity> listTeamIdByBrandAndSkill(@Param("brand") String brand, @Param("productType") String productType,
@Param("skill") String skill);
} }
...@@ -41,4 +41,6 @@ public interface OrgGroupDao extends JpaRepository<OrgGroupEntity, Integer> { ...@@ -41,4 +41,6 @@ public interface OrgGroupDao extends JpaRepository<OrgGroupEntity, Integer> {
@Query(value = "SELECT og.* FROM org_group og left join org_team ot ON ot.group_id = og.group_id " @Query(value = "SELECT og.* FROM org_group og left join org_team ot ON ot.group_id = og.group_id "
+ "WHERE ot.team_id = :teamId",nativeQuery = true) + "WHERE ot.team_id = :teamId",nativeQuery = true)
OrgGroupEntity queryGroupByTeam(String teamId); OrgGroupEntity queryGroupByTeam(String teamId);
OrgGroupEntity getByCitycodeListLike(String citycodeList);
} }
package com.dituhui.pea.order.dto.param; package com.dituhui.pea.order.dto.param;
import com.dituhui.pea.util.DateUtil;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -101,6 +104,11 @@ public class OrderDTO { ...@@ -101,6 +104,11 @@ public class OrderDTO {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date expectEnd; private Date expectEnd;
public static void main(String[] args) {
Date date = new Date();
int hour = DateUtils.toCalendar(date).get(Calendar.HOUR_OF_DAY);
System.out.println("当前小时为:" + hour);
}
/** /**
* 预约描述时间(全天/上午/下午) * 预约描述时间(全天/上午/下午)
*/ */
......
...@@ -218,7 +218,7 @@ public class OrderInfoEntity { ...@@ -218,7 +218,7 @@ public class OrderInfoEntity {
* 是否超派,0否 1是,默认0 * 是否超派,0否 1是,默认0
*/ */
@Column(name = "transcend") @Column(name = "transcend")
private Integer transcend; private Integer transcend = 0;
/** /**
......
package com.dituhui.pea.order.enums; package com.dituhui.pea.order.enums;
public enum OrderStatus { public enum OrderStatus {
CREATE("创建订单"),
NORMAL("正常"), NORMAL("正常"),
CANCELED("已取消"), CANCELED("已取消"),
RESCHEDULED("已改约"), RESCHEDULED("已改约"),
......
...@@ -27,5 +27,5 @@ public interface FendanService { ...@@ -27,5 +27,5 @@ public interface FendanService {
*/ */
Result<List<OrgGroupInfo>> fendanToGroup(OrderDTO.OrderCreateRequest request); Result<List<OrgGroupInfo>> fendanToGroup(OrderDTO.OrderCreateRequest request);
Result<List<AdministrativeDistrictResp>> getAdminDistrict(AdministrativeDistrictReq req); Result<AdministrativeDistrictResp> getAdminDistrict(AdministrativeDistrictReq req);
} }
...@@ -19,12 +19,13 @@ package com.dituhui.pea.order.service; ...@@ -19,12 +19,13 @@ package com.dituhui.pea.order.service;
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.dto.OrderCreateReqDTO; import com.dituhui.pea.order.dto.OrderCreateReqDTO;
import com.dituhui.pea.order.dto.param.OrderDTO;
public interface OrderCreateService { public interface OrderCreateService {
Result<?> initParameter(); Result<?> initParameter();
Result<?> createOrder(OrderCreateReqDTO orderCreateReqDTO) Result<?> createOrder(OrderDTO.OrderCreateRequest orderCreateReqDTO)
throws BusinessException; throws BusinessException;
} }
...@@ -153,18 +153,23 @@ public class FendanServiceImpl implements FendanService { ...@@ -153,18 +153,23 @@ public class FendanServiceImpl implements FendanService {
//2:根据服务范围匹配工作队 //2:根据服务范围匹配工作队
String peaBrand = fixBrand(request.getBrand()); String peaBrand = fixBrand(request.getBrand());
List<String> blockIds = blockInfos.stream().map(SaasUtils.BlockInfo::getBlockId).distinct().collect(Collectors.toList()); List<String> blockIds = blockInfos.stream().map(SaasUtils.BlockInfo::getBlockId).distinct().collect(Collectors.toList());
//区划所在范围并分配到具体技能的工作队 List<MapBlockInfoEntity> mapBlockInBlockIdsList = new ArrayList<>();
List<MapBlockInfoEntity> mapBlockInfoList = mapBlockInfoDao.listTeamIdByBrandAndSkillAndBlockIds(peaBrand, request.getProductType(), request.getServiceType(), blockIds);
//区划所在范围所有工作队 //区划所在范围所有工作队
List<MapBlockInfoEntity> mapBlockInBlockIdsList = mapBlockInfoDao.findByAreaIdsIn(blockIds); for (String blockId : blockIds) {
if (CollectionUtils.isEmpty(mapBlockInfoList) && CollectionUtils.isEmpty(mapBlockInBlockIdsList)) { List<MapBlockInfoEntity> mapBlockInfoEntities = mapBlockInfoDao.findByAreaIdsLike(blockId);
mapBlockInBlockIdsList.addAll(mapBlockInfoEntities);
}
//区划所在范围并分配到具体技能的工作队
List<MapBlockInfoEntity> mapBlockSkillList = mapBlockInfoDao.listTeamIdByBrandAndSkill(peaBrand, request.getProductType(), request.getServiceType());
if (CollectionUtils.isEmpty(mapBlockSkillList) && CollectionUtils.isEmpty(mapBlockInBlockIdsList)) {
return Result.failed(StatusCodeEnum.FENDAN_TEAM_UNMATCHED); return Result.failed(StatusCodeEnum.FENDAN_TEAM_UNMATCHED);
} }
List<Integer> mapBlockIdList = mapBlockInfoList.stream().map(MapBlockInfoEntity::getId).distinct().collect(Collectors.toList()); List<Integer> mapBlockAllList = mapBlockSkillList.stream().map(MapBlockInfoEntity::getId).distinct().collect(Collectors.toList());
//筛选漏选工作队(处理全技能图层) //筛选漏选工作队(处理全技能图层)和查出多余图层
List<MapBlockInfoEntity> mapBlockInfoList = new ArrayList<>();
for (MapBlockInfoEntity mapBlockInfoEntity : mapBlockInBlockIdsList) { for (MapBlockInfoEntity mapBlockInfoEntity : mapBlockInBlockIdsList) {
if (mapBlockIdList.contains(mapBlockInfoEntity.getId())) { if (mapBlockAllList.contains(mapBlockInfoEntity.getId())) {
continue; mapBlockInfoList.add(mapBlockInfoEntity);
} }
if (mapBlockInfoEntity.getLayerId().equals(allLayerId)) { if (mapBlockInfoEntity.getLayerId().equals(allLayerId)) {
mapBlockInfoList.add(mapBlockInfoEntity); mapBlockInfoList.add(mapBlockInfoEntity);
...@@ -203,8 +208,9 @@ public class FendanServiceImpl implements FendanService { ...@@ -203,8 +208,9 @@ public class FendanServiceImpl implements FendanService {
} }
@Override @Override
public Result<List<AdministrativeDistrictResp>> getAdminDistrict(AdministrativeDistrictReq req) { public Result<AdministrativeDistrictResp> getAdminDistrict(AdministrativeDistrictReq req) {
return Result.success(saasUtils.getAdminDistrict(req)); AdministrativeDistrictResp adminDistrict = saasUtils.getAdminDistrict(req);
return Result.success(adminDistrict);
} }
......
...@@ -18,20 +18,28 @@ package com.dituhui.pea.order.service.impl; ...@@ -18,20 +18,28 @@ package com.dituhui.pea.order.service.impl;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dituhui.pea.common.Result; import com.dituhui.pea.common.Result;
import com.dituhui.pea.common.ResultEnum;
import com.dituhui.pea.order.common.*; import com.dituhui.pea.order.common.*;
import com.dituhui.pea.order.dao.*; import com.dituhui.pea.order.dao.*;
import com.dituhui.pea.order.dto.LabelValueDTO; import com.dituhui.pea.order.dto.*;
import com.dituhui.pea.order.dto.LocationDTO; import com.dituhui.pea.order.dto.param.Location;
import com.dituhui.pea.order.dto.OrderCreateReqDTO; import com.dituhui.pea.order.dto.param.OrderDTO;
import com.dituhui.pea.order.dto.ParameterRespDTO; import com.dituhui.pea.order.dto.param.OrgGroupInfo;
import com.dituhui.pea.order.dto.param.OrgTeamInfo;
import com.dituhui.pea.order.entity.*; import com.dituhui.pea.order.entity.*;
import com.dituhui.pea.order.enums.OrderFlowEnum; import com.dituhui.pea.order.enums.OrderFlowEnum;
import com.dituhui.pea.order.service.CommonService; import com.dituhui.pea.order.enums.OrderStatus;
import com.dituhui.pea.order.service.OrderCreateService; import com.dituhui.pea.order.service.*;
import com.dituhui.pea.pojo.saas.req.AdministrativeDistrictReq;
import com.dituhui.pea.pojo.saas.resp.AdministrativeDistrictResp;
import com.dituhui.pea.util.DateUtil;
import io.seata.core.context.RootContext; import io.seata.core.context.RootContext;
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.aspectj.weaver.ast.Var;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -39,6 +47,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -39,6 +47,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -80,6 +89,18 @@ public class OrderCreateServiceImpl implements OrderCreateService { ...@@ -80,6 +89,18 @@ public class OrderCreateServiceImpl implements OrderCreateService {
@Autowired @Autowired
private SkillInfoDao skillInfoDao; private SkillInfoDao skillInfoDao;
@Autowired
private FendanService fendanService;
@Autowired
private OrgGroupDao orgGroupDao;
@Autowired
private MsgService msgService;
@Autowired
private OrderInfoService orderInfoService;
private List<LabelValueDTO> getPriorities() { private List<LabelValueDTO> getPriorities() {
String[] priorities = {"紧急", "正常"}; String[] priorities = {"紧急", "正常"};
List<LabelValueDTO> listPriorities = new ArrayList<>(); List<LabelValueDTO> listPriorities = new ArrayList<>();
...@@ -108,7 +129,7 @@ public class OrderCreateServiceImpl implements OrderCreateService { ...@@ -108,7 +129,7 @@ public class OrderCreateServiceImpl implements OrderCreateService {
@Override @Override
@Transactional @Transactional
public Result<?> createOrder(OrderCreateReqDTO req) { public Result<?> createOrder(OrderDTO.OrderCreateRequest req) {
log.info("[createOrder] current XID: {}", RootContext.getXID()); log.info("[createOrder] current XID: {}", RootContext.getXID());
OrderInfoEntity entity = new OrderInfoEntity(); OrderInfoEntity entity = new OrderInfoEntity();
String orderId = req.getOrderId(); String orderId = req.getOrderId();
...@@ -116,35 +137,72 @@ public class OrderCreateServiceImpl implements OrderCreateService { ...@@ -116,35 +137,72 @@ public class OrderCreateServiceImpl implements OrderCreateService {
String s = UUID.randomUUID().toString().replace("-", ""); String s = UUID.randomUUID().toString().replace("-", "");
orderId = s.substring(s.length() - 9); orderId = s.substring(s.length() - 9);
} }
entity.setSource("PEA");
// 分单处理
String peaBrand = fixBrand(req.getBrand());
// location
Location location = req.getLocation();
//获取省市区
AdministrativeDistrictReq administrativeDistrictReq = new AdministrativeDistrictReq();
administrativeDistrictReq.setPoints(location.getLongitude() + "," + location.getLatitude());
Result<AdministrativeDistrictResp> adminDistrict = fendanService.getAdminDistrict(administrativeDistrictReq);
if (ObjectUtil.isNotEmpty(adminDistrict) && ObjectUtil.isNotEmpty(adminDistrict.getResult())) {
entity.setProvince(adminDistrict.getResult().getSubNames().getProvince());
entity.setCity(adminDistrict.getResult().getSubNames().getCity());
entity.setCounty(adminDistrict.getResult().getSubNames().getCounty());
}
Result<List<OrgGroupInfo>> fendanResult = fendanService.fendanToGroup(req);
//todo 根据容量筛选出一个工作队,分单失败则存数据库然后发送消息
if (!fendanResult.getCode().equals(ResultEnum.SUCCESS.getCode()) || CollectionUtils.isEmpty(fendanResult.getResult())) {
OrgGroupEntity groupDaoByCitycodeListLike = orgGroupDao.getByCitycodeListLike(adminDistrict.getResult().getSubNames().getCounty());
entity.setOrgClusterId(groupDaoByCitycodeListLike.getClusterId());
entity.setOrgBranchId(groupDaoByCitycodeListLike.getBranchId());
entity.setOrgGroupId(groupDaoByCitycodeListLike.getGroupId());
//发送通知分部消息
MsgDTO msgDTO = new MsgDTO();
msgDTO.setGroupId(groupDaoByCitycodeListLike.getGroupId());
msgDTO.setType(0);
msgDTO.setOrderIds(orderId);
msgDTO.setContent("有1条预约日期在" + entity.getExpectTimeBegin().toLocalDate() + "的工单需人工外理");
msgService.add(msgDTO);
} else {
OrgTeamInfo teamInfo = fendanResult.getResult().get(0).getTeamInfos().get(0);
// 根据分单,填写clusterId/branchId/groupId/teamId等
entity.setOrgClusterId(teamInfo.getClusterId());
entity.setOrgBranchId(teamInfo.getBranchId());
entity.setOrgGroupId(teamInfo.getGroupId());
entity.setOrgTeamId(teamInfo.getTeamId());
//处理超派,特殊时间段
Integer startHourOrder = DateUtil.getHour(req.getExpectBegin());
Integer endHourOrder = DateUtil.getHour(req.getExpectEnd());
Integer startHourTeam = Integer.valueOf(teamInfo.getWorkOn().split(":")[0]);
Integer endHourTeam = Integer.valueOf(teamInfo.getWorkOff().split(":")[0]);
if (startHourOrder < startHourTeam || endHourOrder > endHourTeam) {
entity.setIsSpecialTime(1);
}
}
entity.setSource(req.getSource());
entity.setOrderId(orderId); entity.setOrderId(orderId);
entity.setName(req.getName()); entity.setName(req.getName());
entity.setPhone(req.getPhone()); entity.setPhone(req.getPhone());
entity.setBeanBrand(req.getBrand()); entity.setBeanBrand(req.getBrand());
String peaBrand = fixBrand(req.getBrand());
entity.setBrand(peaBrand); entity.setBrand(peaBrand);
entity.setType(req.getType()); entity.setType(req.getProductType());
entity.setSkill(req.getSkill()); entity.setSkill(req.getServiceType());
entity.setFaultDescribe(req.getFaultDescribe()); entity.setFaultDescribe(req.getFaultDescribe());
entity.setExpectTimeBegin(LocalDateTimeUtil.parse(req.getExpectBegin(), PATTERN_DATETIME)); entity.setExpectTimeBegin(DateUtil.fromDate(req.getExpectBegin()));
entity.setExpectTimeEnd(LocalDateTimeUtil.parse(req.getExpectEnd(), PATTERN_DATETIME)); entity.setExpectTimeEnd(DateUtil.fromDate(req.getExpectEnd()));
entity.setExpectTimeDesc(req.getExpectDesc()); entity.setExpectTimeDesc(req.getExpectDesc());
// 使用期望时间来初始化计划时间,后面在指派环节更新为真正的有效的计划时间 // 使用期望时间来初始化计划时间,后面在指派环节更新为真正的有效的计划时间
entity.setPlanStartTime(entity.getExpectTimeBegin()); entity.setPlanStartTime(entity.getExpectTimeBegin());
entity.setPlanEndTime(entity.getExpectTimeEnd()); entity.setPlanEndTime(entity.getExpectTimeEnd());
entity.setApplyNote(req.getDescription()); // order_request的description字段,仅仅用于内部备注,不对外 entity.setApplyNote(req.getDescription()); // order_request的description字段,仅仅用于内部备注,不对外
entity.setDt(LocalDateTimeUtil.parseDate(req.getExpectBegin().substring(0, 10), PATTERN_DATE)); entity.setDt(entity.getExpectTimeBegin().toLocalDate());
entity.setSubId(newSubId(entity.getOrderId(), entity.getDt())); entity.setSubId(newSubId(entity.getOrderId(), entity.getDt()));
// location entity.setX(req.getLocation().getLongitude().toString());
LocationDTO location = req.getLocation(); entity.setY(req.getLocation().getLatitude().toString());
entity.setProvince(location.getProvince()); entity.setAddress(location.getAddress());
entity.setCity(location.getCity()); entity.setAddressId(location.getAddressId());
entity.setCounty(location.getDistrict());
if (req.getAddress() != null) {
entity.setAddress(req.getAddress());
} else {
entity.setAddress(location.getFormattedAddress());
}
// 默认值 // 默认值
entity.setAppointmentStatus(OrderFlowEnum.INIT.name()); entity.setAppointmentStatus(OrderFlowEnum.INIT.name());
entity.setBeanStatus("OPEN"); entity.setBeanStatus("OPEN");
...@@ -153,49 +211,28 @@ public class OrderCreateServiceImpl implements OrderCreateService { ...@@ -153,49 +211,28 @@ public class OrderCreateServiceImpl implements OrderCreateService {
entity.setAppointmentMethod("AUTO_NOW"); entity.setAppointmentMethod("AUTO_NOW");
entity.setWorkshop(false); entity.setWorkshop(false);
SkillInfoEntity skillInfoEntity = skillInfoDao.getByBrandAndTypeAndSkill(peaBrand, req.getType(), req.getSkill()); entity.setIsAppointEngineer(req.getIsAppointEngineer());
String appointEngineerCodes = CollectionUtils.isEmpty(req.getAppointEngineerCodes()) ? "" : String.join(",", req.getAppointEngineerCodes());
entity.setAppointEngineerCodes(appointEngineerCodes);
SkillInfoEntity skillInfoEntity = skillInfoDao.getByBrandAndTypeAndSkill(peaBrand, req.getProductType(), req.getServiceType());
assert skillInfoEntity != null; assert skillInfoEntity != null;
entity.setTakeTime(skillInfoEntity.getTakeTime()); entity.setTakeTime(skillInfoEntity.getTakeTime());
// 基础保存 // 基础保存
orderInfoDao.save(entity); String joinTags = CollectionUtils.isEmpty(req.getOrderTags()) ? "" : String.join(",", req.getOrderTags());
entity.setBeanTags(joinTags);
// 分单处理
List<String> blockIds = null;
List<String> layerIds = capacityUtils.getLayers(peaBrand, req.getType(), req.getSkill());
if (req.getLocation() != null) {
String loc = String.format("%f,%f", req.getLocation().getLng(), req.getLocation().getLat());
blockIds = saasUtils.queryBlocksByLocation(loc).stream().map(SaasUtils.BlockInfo::getBlockId).collect(Collectors.toList());
} else {
blockIds = saasUtils.queryBlocksByAddress(req.getAddress()).stream().map(SaasUtils.BlockInfo::getBlockId).collect(Collectors.toList());
}
if (blockIds.isEmpty()) {
log.error("分单接口没有查到对应的结果");
return Result.failed(String.format("分单接口(address:%s)(location:%s) 没有查到配置区块", req.getAddress(), req.getLocation()));
}
List<String> teamIds = capacityUtils.getTeamIdsByBlockIdsAndLayerIds(blockIds, layerIds);
if (teamIds == null || teamIds.isEmpty()) {
return Result.failed("没有找到匹配的工作队");
}
// 选择一个工作队(理论上,只有1个合适的工作队),然后遍历下面的符合技能的技术员
// 遍历工作队,每个工作队
String teamId = teamIds.get(0);
OrgTeamEntity teamEntity = orgTeamDao.getByTeamId(teamId);
// 根据分单,填写clusterId/branchId/groupId/teamId等
entity.setOrgClusterId(teamEntity.getClusterId());
entity.setOrgBranchId(teamEntity.getBranchId());
entity.setOrgGroupId(teamEntity.getGroupId());
entity.setOrgTeamId(teamId);
entity.setX(req.getLocation().getLng().toString());
entity.setY(req.getLocation().getLat().toString());
entity.setBeanTags(String.join(",", req.getOrderTags()));
entity.setBeanPriority(req.getPriority()); entity.setBeanPriority(req.getPriority());
entity.setIsMultiple(joinTags.contains("重物搬运") ? 1 : 0);
//一家多单
Result<String> addMultipleOrders = orderInfoService.addMultipleOrders(entity.getDt(), location.getAddressId(), orderId);
entity.setMultipleOrders(addMultipleOrders.getResult());
// todo 服务单状态、预约状态等 // todo 服务单状态、预约状态等
orderInfoDao.save(entity); orderInfoDao.save(entity);
// 登记 // 登记
commonService.addOrderEvent(orderId, "", req.getSource(), "API", "创建订单", "创建订单", ""); commonService.addOrderEvent(orderId, "", req.getSource(), "API", OrderStatus.CREATE.getDescription(), OrderStatus.CREATE.getDescription(), "");
// 指派检查,简单处理,遇到第一个可以指派的就停止检查 // 指派检查,简单处理,遇到第一个可以指派的就停止检查
tryVirtualAppointment(entity, req.getSource(), teamId); // tryVirtualAppointment(entity, req.getSource(), teamId);
return Result.success(null); return Result.success(null);
} }
......
...@@ -38,13 +38,17 @@ public class OrderInfoServiceImpl implements OrderInfoService { ...@@ -38,13 +38,17 @@ public class OrderInfoServiceImpl implements OrderInfoService {
if (CollectionUtils.isEmpty(infoList)) { if (CollectionUtils.isEmpty(infoList)) {
return Result.success(null); return Result.success(null);
} }
List<String> multipleOrdersList = infoList.stream().filter(e -> StringUtils.isNotEmpty(e.getMultipleOrders()) && !e.getOrderId().equals(orderId)) //排除自己
List<String> multipleOrdersList = infoList.stream().filter(e -> !e.getOrderId().equals(orderId))
.map(OrderInfoEntity::getMultipleOrders).distinct().collect(Collectors.toList()); .map(OrderInfoEntity::getMultipleOrders).distinct().collect(Collectors.toList());
if (CollectionUtils.isEmpty(multipleOrdersList)) { if (CollectionUtils.isEmpty(multipleOrdersList)) {
return Result.success(null); return Result.success(null);
} }
if (CollectionUtils.isNotEmpty(multipleOrdersList)) { //查看是否已存在一家多单id存在则返回
return Result.success(multipleOrdersList.get(0)); List<String> multipleOrdersFilterList = infoList.stream().filter(e -> StringUtils.isNotEmpty(e.getMultipleOrders()))
.map(OrderInfoEntity::getMultipleOrders).distinct().collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(multipleOrdersFilterList)) {
return Result.success(multipleOrdersFilterList.get(0));
} }
String uuid = UUIDUtil.getUuid(); String uuid = UUIDUtil.getUuid();
for (OrderInfoEntity orderInfoEntity : infoList) { for (OrderInfoEntity orderInfoEntity : infoList) {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!