diff --git a/admin/src/main/java/com/hcy/admin/controller/largeDataScreen/LargeDataScreenController.java b/admin/src/main/java/com/hcy/admin/controller/largeDataScreen/LargeDataScreenController.java index f8ee82d..2657b6b 100644 --- a/admin/src/main/java/com/hcy/admin/controller/largeDataScreen/LargeDataScreenController.java +++ b/admin/src/main/java/com/hcy/admin/controller/largeDataScreen/LargeDataScreenController.java @@ -4,21 +4,25 @@ import com.hcy.admin.service.client.IClientService; import com.hcy.admin.service.client.IEquipmentService; import com.hcy.admin.service.largeDataScreen.ILargeDataScreenService; import com.hcy.admin.service.order.IMaintenanceOrderService; +import com.hcy.admin.service.order.IRepairOrderService; import com.hcy.admin.service.order.IRoutingInspectionOrderService; import com.hcy.admin.validate.client.EquipmentParam; import com.hcy.admin.validate.common.PageParam; import com.hcy.admin.validate.order.MaintenanceOrderParam; +import com.hcy.admin.validate.order.RepairOrderParam; import com.hcy.admin.vo.client.ClientListVo; import com.hcy.admin.vo.client.EquipmentListVo; import com.hcy.admin.vo.largeData.EquipmentLargeDataVo; import com.hcy.admin.vo.largeData.LargeDataVo; import com.hcy.admin.vo.largeData.UserLargeDataVo; import com.hcy.admin.vo.order.MaintenanceOrderListVo; +import com.hcy.admin.vo.order.RepairOrderListVo; import com.hcy.admin.vo.order.RoutingInspectionOrderListVo; import com.hcy.common.core.AjaxResult; import com.hcy.common.core.PageResult; import com.hcy.common.dto.largeDataDto.AdminLargeDataDto; import com.hcy.common.dto.largeDataDto.ClientLargeDataDto; +import com.hcy.common.mapper.order.RepairOrderMapper; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -50,6 +54,9 @@ public class LargeDataScreenController { @Resource IMaintenanceOrderService iMaintenanceOrderService; + @Resource + IRepairOrderService iRepairOrderService; + /** * 获取所有设备对应状态的数量 * @@ -175,6 +182,18 @@ public class LargeDataScreenController { return AjaxResult.success(list); } + /** + * 维修订单列表 + * @param pageParam + * @param repairOrderParam + * @return + */ + @GetMapping("/repairOrderList") + public Object repairOrderList(@Validated PageParam pageParam, RepairOrderParam repairOrderParam) { + PageResult list = iRepairOrderService.list(pageParam, repairOrderParam); + return AjaxResult.success(list); + } + /** * 巡检订单统计 * @@ -198,4 +217,16 @@ public class LargeDataScreenController { LargeDataVo largeDataVo = iLargeDataScreenService.maintenanceOrderStats(orderStastic); return AjaxResult.success(largeDataVo); } + + /** + * 维修订单统计 + * + * @author hcy + * @return Object + */ + @GetMapping("/repairOrderStats") + public Object repairOrderStatsr(Integer orderStastic) { + LargeDataVo largeDataVo = iLargeDataScreenService.repairOrderStats(orderStastic); + return AjaxResult.success(largeDataVo); + } } diff --git a/admin/src/main/java/com/hcy/admin/service/largeDataScreen/ILargeDataScreenService.java b/admin/src/main/java/com/hcy/admin/service/largeDataScreen/ILargeDataScreenService.java index 6806caa..3c455d2 100644 --- a/admin/src/main/java/com/hcy/admin/service/largeDataScreen/ILargeDataScreenService.java +++ b/admin/src/main/java/com/hcy/admin/service/largeDataScreen/ILargeDataScreenService.java @@ -63,4 +63,11 @@ public interface ILargeDataScreenService { * @return */ LargeDataVo maintenanceOrderStats(Integer orderStastic); + + /** + * 维修单统计 + * @param orderStastic + * @return + */ + LargeDataVo repairOrderStats(Integer orderStastic); } diff --git a/admin/src/main/java/com/hcy/admin/service/largeDataScreen/impl/LargeDataScreenServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/largeDataScreen/impl/LargeDataScreenServiceImpl.java index 66c7c6f..687c50a 100644 --- a/admin/src/main/java/com/hcy/admin/service/largeDataScreen/impl/LargeDataScreenServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/largeDataScreen/impl/LargeDataScreenServiceImpl.java @@ -13,6 +13,7 @@ import com.hcy.common.dto.result.UserLargeDataDto; import com.hcy.common.entity.client.Client; import com.hcy.common.entity.client.Equipment; import com.hcy.common.entity.order.MaintenanceOrder; +import com.hcy.common.entity.order.RepairOrder; import com.hcy.common.entity.order.RoutingInspectionOrder; import com.hcy.common.enums.order.MaintenanceOrderStatusEnum; import com.hcy.common.enums.order.OrderStateEnum; @@ -21,6 +22,7 @@ import com.hcy.common.enums.equipment.EquipmentStateEnum; import com.hcy.common.mapper.client.ClientMapper; import com.hcy.common.mapper.client.EquipmentMapper; import com.hcy.common.mapper.order.MaintenanceOrderMapper; +import com.hcy.common.mapper.order.RepairOrderMapper; import com.hcy.common.mapper.order.RoutingInspectionOrderMapper; import com.hcy.common.mapper.system.SystemAuthAdminMapper; import com.hcy.common.mapper.user.UserMapper; @@ -65,6 +67,8 @@ public class LargeDataScreenServiceImpl implements ILargeDataScreenService { @Resource IDevRegionService regionService; + @Resource + RepairOrderMapper repairOrderMapper; /** * 获取所有设备对应状态的数量 @@ -342,5 +346,71 @@ public class LargeDataScreenServiceImpl implements ILargeDataScreenService { return vo; } + /** + * 维修单统计 + * + * @param orderStastic + * @return + */ + @Override + public LargeDataVo repairOrderStats(Integer orderStastic) { + //orderStastic 工单统计 0=日 1=月 2=年 + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startTime = null; + LocalDateTime endTime = null; + + Assert.notNull(orderStastic, "orderStastic数据不能为空"); + + if(orderStastic == 0){ + //今日 + startTime = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MIN); + endTime = LocalDateTime.of(LocalDateTime.now().toLocalDate(), LocalTime.MAX); + }else if(orderStastic == 1){ + //当月 + startTime = now.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0); + endTime = now.withHour(23).withMinute(59).withSecond(59); + }else if(orderStastic == 2){ + //当前年份 + startTime = now.withDayOfYear(1).withHour(0).withMinute(0).withSecond(0); + endTime = now.withHour(23).withMinute(59).withSecond(59); + } + + //获取巡检订单总数 + Integer routingInspectionOrderCount = repairOrderMapper.selectCount( + new QueryWrapper() + .eq("is_delete", 0) + .ge("create_time", Timestamp.valueOf(startTime)) // 开始时间 + .le("create_time", Timestamp.valueOf(endTime))); // 结束时间 + //orderStatus; // 订单状态 0-待抢单;1-待接单;2-接单超时;3-检测中;4-待客户确认;5-维修中;6-已完成;7-已退单;8-已关闭 + //获取已完成订单总数 + Integer doneOrderCount = repairOrderMapper.selectCount( + new QueryWrapper() + .eq("is_delete", 0) + .eq("order_status", MaintenanceOrderStatusEnum.FINISHED.getStatus()) + .ge("create_time", Timestamp.valueOf(startTime)) // 开始时间 + .le("create_time", Timestamp.valueOf(endTime))); // 结束时间 + //获取检修中订单总数 + Integer underOverhaulOrderCount = repairOrderMapper.selectCount( + new QueryWrapper() + .eq("is_delete", 0) + .eq("order_status", MaintenanceOrderStatusEnum.MAINTENANCE_ING.getStatus()) + .ge("create_time", Timestamp.valueOf(startTime)) // 开始时间 + .le("create_time", Timestamp.valueOf(endTime))); // 结束时间 + //获取报修中订单总数 + Integer underWarrantyOrderCount = repairOrderMapper.selectCount( + new QueryWrapper() + .eq("is_delete", 0) + .ne("order_status", MaintenanceOrderStatusEnum.FINISHED.getStatus()) + .ne("order_status", MaintenanceOrderStatusEnum.MAINTENANCE_ING.getStatus()) + .ge("create_time", Timestamp.valueOf(startTime)) // 开始时间 + .le("create_time", Timestamp.valueOf(endTime))); // 结束时间 + LargeDataVo vo = new LargeDataVo(); + vo.setOrderSum(routingInspectionOrderCount); //工单总数 + vo.setDoneOrderSum(doneOrderCount); //已完成订单数 + vo.setUnderOverhaulOrderSum(underOverhaulOrderCount); //检修中订单数 + vo.setUnderWarrantyOrderSum(underWarrantyOrderCount); //报修中订单数 + return vo; + } + } diff --git a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java index 0c4310e..83b33bd 100644 --- a/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java +++ b/admin/src/main/java/com/hcy/admin/service/order/impl/RepairOrderServiceImpl.java @@ -7,15 +7,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.query.MPJQueryWrapper; import com.hcy.admin.AdminThreadLocal; import com.hcy.admin.service.order.IRepairOrderService; +import com.hcy.admin.service.region.IDevRegionService; import com.hcy.admin.validate.common.PageParam; import com.hcy.admin.validate.order.RepairOrderParam; import com.hcy.admin.validate.order.RoutingInspectionOrderParam; +import com.hcy.admin.vo.address.UserAddressListVo; +import com.hcy.admin.vo.client.EquipmentListVo; import com.hcy.admin.vo.order.RepairOrderListVo; import com.hcy.admin.vo.order.RepairOrderDetailVo; import com.hcy.common.constant.GlobalConstant; import com.hcy.common.core.PageResult; import com.hcy.common.dto.order.RepairOrderDto; +import com.hcy.common.entity.address.UserAddress; import com.hcy.common.entity.client.Client; +import com.hcy.common.entity.client.Equipment; import com.hcy.common.entity.order.MaintenanceOrder; import com.hcy.common.entity.order.RepairOrder; import com.hcy.common.entity.order.RoutingInspectionOrder; @@ -24,7 +29,9 @@ import com.hcy.common.entity.system.SystemAuthAdmin; import com.hcy.common.entity.user.User; import com.hcy.common.enums.order.OrderStateEnum; import com.hcy.common.enums.order.RepairOrderStatusEnum; +import com.hcy.common.mapper.address.UserAddressMapper; import com.hcy.common.mapper.client.ClientMapper; +import com.hcy.common.mapper.client.EquipmentMapper; import com.hcy.common.mapper.order.RepairOrderMapper; import com.hcy.common.mapper.plant.PlantMapper; import com.hcy.common.mapper.system.SystemAuthAdminMapper; @@ -38,6 +45,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.Assert; import javax.annotation.Resource; +import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; @@ -62,6 +70,15 @@ public class RepairOrderServiceImpl implements IRepairOrderService { @Resource ClientMapper clientMapper; + @Resource + UserAddressMapper userAddressMapper; + + @Resource + EquipmentMapper equipmentMapper; + + @Resource + private IDevRegionService regionService; + /** * 维修订单列表 * @@ -127,7 +144,12 @@ public class RepairOrderServiceImpl implements IRepairOrderService { BeanUtils.copyProperties(model, vo); vo.setUpdateTime(model.getUpdateTime()); //客户名称 - + Client clientName = clientMapper.selectOne( + new QueryWrapper() + .eq("id", model.getClientId())); + if(clientName != null){ + vo.setClientName(clientName.getClientName()); + } //创建人名称 User creatorName = userMapper.selectOne( new QueryWrapper() @@ -155,6 +177,31 @@ public class RepairOrderServiceImpl implements IRepairOrderService { vo.setPlantName(plant.getName()); } } + //回寄地址 + UserAddress userAddress = userAddressMapper.selectOne( + new QueryWrapper() + .eq("id", model.getAddressId())); + UserAddressListVo userAddressListVo = new UserAddressListVo(); + BeanUtils.copyProperties(userAddress, userAddressListVo); + Map regionMap = regionService.getRegionMap(); + userAddressListVo.setProvince(regionMap.get(userAddressListVo.getProvinceId())); + userAddressListVo.setCity(regionMap.get(userAddressListVo.getCityId())); + userAddressListVo.setDistrict(regionMap.get(userAddressListVo.getDistrictId())); + if(userAddress != null){ + vo.setAddress(userAddressListVo); + } + //设备信息 + Equipment equipment = equipmentMapper.selectOne( + new QueryWrapper() + .eq("id", model.getEquipmentId())); + EquipmentListVo equipmentListVo = new EquipmentListVo(); + equipmentListVo.setProvince(regionMap.get(equipment.getProvinceId())); + equipmentListVo.setCity(regionMap.get(equipment.getCityId())); + equipmentListVo.setDistrict(regionMap.get(equipment.getDistrictId())); + BeanUtils.copyProperties(equipment, equipmentListVo); + if(equipment != null){ + vo.setEquipment(equipmentListVo); + } return vo; } @@ -172,13 +219,13 @@ public class RepairOrderServiceImpl implements IRepairOrderService { model.setOrderStatus(RepairOrderStatusEnum.WAITING_LIST.getStatus()); // 订单状态 0-待抢单;1-待接单;2-接单超时;3-检测中;4-待客户确认;5-维修中;6-已完成;7-已退单;8-已关闭 model.setOrderSource(OrderStateEnum.MAINTENANCE_SUPERVISOR_CREATION.getStatus()); //订单来源 5-维修主管创建 model.setRepairWorkOrderFlow(OrderStateEnum.WORK_ORDER_TANK.getStatus()); // 工单去向 0=工单池 1=检修员 + model.setReceiverType(OrderStateEnum.REGIONAL_DISPATCH.getStatus()); // 接单类型 0-区域派单;1-距离派单 model.setClientId(repairOrderParam.getClientId()); // 客户id model.setEquipmentId(repairOrderParam.getEquipmentId()); // 设备id model.setFaultDescription(repairOrderParam.getFaultDescription()); // 故障描述 model.setModuleNumber(repairOrderParam.getModuleNumber()); // 模块号 model.setBrand(repairOrderParam.getBrand()); // 品牌 - model.setModuleImg(repairOrderParam.getModuleImg()); // 模块图片 model.setRemark(repairOrderParam.getRemark()); // 备注 model.setMaintenanceOrderId(repairOrderParam.getMaintenanceOrderId()); // 检修单id @@ -214,20 +261,21 @@ public class RepairOrderServiceImpl implements IRepairOrderService { Assert.notNull(model, "数据不存在!"); model.setClientId(repairOrderParam.getClientId()); // 客户id - model.setEquipmentId(repairOrderParam.getEquipmentId()); //设备id - model.setFaultDescription(repairOrderParam.getFaultDescription()); - model.setModuleNumber(repairOrderParam.getModuleNumber()); - model.setBrand(repairOrderParam.getBrand()); - model.setRemark(repairOrderParam.getRemark()); - model.setCreatorId(repairOrderParam.getCreatorId()); - model.setUpdateTime(repairOrderParam.getUpdateTime()); - model.setMaintenanceOrderId(repairOrderParam.getMaintenanceOrderId()); - model.setPriorityId(repairOrderParam.getPriorityId()); - model.setLogisticsMode(repairOrderParam.getLogisticsMode()); - model.setExpressName(repairOrderParam.getExpressName()); - model.setReturnOrNot(repairOrderParam.getReturnOrNot()); - model.setAddressId(repairOrderParam.getAddressId()); - model.setSiteImg(repairOrderParam.getSiteImg()); + model.setEquipmentId(repairOrderParam.getEquipmentId()); // 设备id + + model.setModuleNumber(repairOrderParam.getModuleNumber()); // 模块号 + model.setBrand(repairOrderParam.getBrand()); // 品牌 + + model.setPriorityId(repairOrderParam.getPriorityId()); // 优先级 0-普通 1-加急 + model.setLogisticsMode(repairOrderParam.getLogisticsMode()); // 物流方式 0-物流快递 1=自领带回 + model.setExpressName(repairOrderParam.getExpressName()); // 快递名称 + model.setReturnOrNot(repairOrderParam.getReturnOrNot()); // 是否回寄(0=是 1=否) + model.setRepairWorkOrderFlow(repairOrderParam.getRepairWorkOrderFlow()); // 工单去向 0=工单池 1=检修员 + model.setReceiverType(repairOrderParam.getReceiverType()); // 接单类型 0-区域派单;1-距离派单 + model.setOrderDistance(repairOrderParam.getOrderDistance()); // 自动抢单最大距离 + model.setFaultDescription(repairOrderParam.getFaultDescription()); // 故障描述 + model.setRemark(repairOrderParam.getRemark()); // 备注 + model.setAddressId(repairOrderParam.getAddressId()); // 回寄地址 repairOrderMapper.updateById(model); } diff --git a/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderParam.java b/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderParam.java index 83df67f..837a737 100644 --- a/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderParam.java +++ b/admin/src/main/java/com/hcy/admin/validate/order/RepairOrderParam.java @@ -95,6 +95,6 @@ public class RepairOrderParam implements Serializable { private BigDecimal orderDistance; // 订单距离 private Long receiverId; // 接单人id private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 - + private Long faultId; // 故障id } diff --git a/admin/src/main/java/com/hcy/admin/vo/address/UserAddressListVo.java b/admin/src/main/java/com/hcy/admin/vo/address/UserAddressListVo.java new file mode 100644 index 0000000..42478d3 --- /dev/null +++ b/admin/src/main/java/com/hcy/admin/vo/address/UserAddressListVo.java @@ -0,0 +1,50 @@ +package com.hcy.admin.vo.address; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +/** + * UserAddressVo + */ +@Data +@ApiModel(value = "用户地址分页返回对象", description = "用户地址分页返回对象") +public class UserAddressListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "id") + private Long id; + @ApiModelProperty(value = "用户id") + private Long userId; + @ApiModelProperty(value = "收货人") + private String contact; + @ApiModelProperty(value = "联系方式") + private String mobile; + @ApiModelProperty(value = "省id") + private Long provinceId; + @ApiModelProperty(value = "省") + private String province; + @ApiModelProperty(value = "市id") + private Long cityId; + @ApiModelProperty(value = "市") + private String city; + @ApiModelProperty(value = "区id") + private Long districtId; + @ApiModelProperty(value = "区") + private String district; + @ApiModelProperty(value = "详细地址") + private String address; + @ApiModelProperty(value = "经度") + private String longitude; + @ApiModelProperty(value = "纬度") + private String latitude; + @ApiModelProperty(value = " 是否默认:1-是;0-否;") + private Integer isDefault; + @ApiModelProperty(value = "创建时间") + private String createTime; + @ApiModelProperty(value = "修改时间") + private String updateTime; +} diff --git a/admin/src/main/java/com/hcy/admin/vo/order/MaintenanceOrderListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/MaintenanceOrderListVo.java index ee4c8ca..9b5dc91 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/MaintenanceOrderListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/MaintenanceOrderListVo.java @@ -57,4 +57,5 @@ public class MaintenanceOrderListVo implements Serializable { private String receiverName; // 接单人姓名 private String shortName; //客户简称 private EquipmentModelDetailVo equipmentModel; //设备模块信息 + } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java index 378f0ad..bbe3cfd 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderDetailVo.java @@ -1,5 +1,9 @@ package com.hcy.admin.vo.order; +import com.hcy.admin.vo.address.UserAddressListVo; +import com.hcy.admin.vo.client.EquipmentListVo; +import com.hcy.common.entity.address.UserAddress; +import com.hcy.common.entity.client.Equipment; import lombok.Data; import java.io.Serializable; @@ -23,6 +27,7 @@ public class RepairOrderDetailVo implements Serializable { private String clientName; // 客户名称 private String clientContacts; // 客户联系人 private String clientPhone; // 客户联系电话 + private Long faultId; // 故障id private String faultDescription; // 故障描述 private String moduleNumber; // 模块号 private String brand; // 品牌 @@ -35,16 +40,18 @@ public class RepairOrderDetailVo implements Serializable { private Date createTime; // 创建时间 private Date updateTime; // 更新时间 private Long maintenanceOrderId; // 检修单id - private Long priorityId; // 优先级 0-普通 1-加急 + private Integer priorityId; // 优先级 0-普通 1-加急 private Integer logisticsMode; // 物流方式 0-物流快递 1=自领带回 private String expressName; // 快递名称 private Integer returnOrNot; // 是否回寄(0=是 1=否) private Long addressId; // 回寄地址 private String siteImg; // 现场照片 - private Long plantId; // 管辖工厂 + private Long plantId; // 管辖工厂 private String plantName; //管辖工厂名 private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 private BigDecimal orderDistance; // 订单距离 private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 + private UserAddressListVo address; //地址信息 + private EquipmentListVo equipment; //设备信息 } diff --git a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java index 1c56947..13442e1 100644 --- a/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java +++ b/admin/src/main/java/com/hcy/admin/vo/order/RepairOrderListVo.java @@ -22,6 +22,7 @@ public class RepairOrderListVo implements Serializable { private String clientName; // 客户名称 private String clientContacts; // 客户联系人 private String clientPhone; // 客户联系电话 + private Long faultId; // 故障id private String faultDescription; // 故障描述 private String moduleNumber; // 模块号 private String brand; // 品牌 @@ -34,7 +35,7 @@ public class RepairOrderListVo implements Serializable { private Date createTime; // 创建时间 private Date updateTime; // 更新时间 private Long maintenanceOrderId; // 检修单id - private Long priorityId; // 优先级 0-普通 1-加急 + private Integer priorityId; // 优先级 0-普通 1-加急 private Integer logisticsMode; // 物流方式 0-物流快递 1=自领带回 private String expressName; // 快递名称 private Integer returnOrNot; // 是否回寄(0=是 1=否) @@ -42,4 +43,7 @@ public class RepairOrderListVo implements Serializable { private String siteImg; // 现场照片 private Long plantId; // 管辖工厂 private String plantName; //管辖工厂名 + private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 + private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 + } diff --git a/common/src/main/java/com/hcy/common/dto/order/OrderSparePart.java b/common/src/main/java/com/hcy/common/dto/order/OrderSparePart.java index a41c7b2..892e2ee 100644 --- a/common/src/main/java/com/hcy/common/dto/order/OrderSparePart.java +++ b/common/src/main/java/com/hcy/common/dto/order/OrderSparePart.java @@ -18,6 +18,7 @@ public class OrderSparePart implements Serializable { @TableId(value="id", type= IdType.AUTO) private Long id; // id private Long maintenanceOrderId; //检修单id + private Long repairOrderId; //维修单id private Long sparePartsId; // 备件id private String sparePartsCode; // 备件编码 private String sparePartsName; // 备件名称 diff --git a/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java b/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java index 1a34e31..1d38f3c 100644 --- a/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java +++ b/common/src/main/java/com/hcy/common/dto/order/RepairOrderDto.java @@ -5,6 +5,7 @@ import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; +import java.util.List; /** * RepairOrderDto @@ -21,6 +22,7 @@ public class RepairOrderDto implements Serializable { private Long clientId; // 客户id private Long equipmentId; // 设备id private String clientName; // 客户名称 + private Long faultId; // 故障id private String faultDescription; // 故障描述 private String moduleNumber; // 模块号 private String brand; // 品牌 @@ -42,4 +44,18 @@ public class RepairOrderDto implements Serializable { private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 private BigDecimal orderDistance; // 订单距离 + + private String likeWork; //关键字 + private String orderStatusIds; //订单状态ids + private Long equipmentProvinceId; //设备省id + private Long equipmentDistrictId; //设备区id + private Long equipmentCityId; //设备市id + private Double longitude; // 经度 + private Double latitude; // 纬度 + private Integer queryType; // 查询类型 0-离我最近 1-时间优先 + + private Integer isClient; //是否客户 0-客户端 1-检修员端 + private Integer isMaintain; //是否维修 0-维修 1-不维修 + private Integer warehouseType; //仓库类型 0-我的仓库 1-公共仓库 + private Integer deliveryMethod; //配送方式 0-物流 1-上门取件 2-送货上门 } diff --git a/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java b/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java index 71aa459..2d7c288 100644 --- a/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java +++ b/common/src/main/java/com/hcy/common/entity/order/RepairOrder.java @@ -1,6 +1,8 @@ package com.hcy.common.entity.order; +import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; @@ -23,10 +25,10 @@ public class RepairOrder implements Serializable { private Integer orderStatus; // 订单状态 0-待抢单;1-待接单;2-接单超时;3-检测中;4-待客户确认;5-维修中;6-已完成;7-已退单;8-已关闭 private Long clientId; // 客户id private Long equipmentId; // 设备id + private Long faultId; // 故障id private String faultDescription; // 故障描述 private String moduleNumber; // 模块号 private String brand; // 品牌 - private String moduleImg; // 模块图片 private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 private BigDecimal orderDistance; // 订单距离 private Long provinceId; // 省id @@ -34,8 +36,10 @@ public class RepairOrder implements Serializable { private Long districtId; // 区id private BigDecimal totalAmount; // 总金额 private BigDecimal actualAmount; // 实际金额 + @TableField(value = "receiver_id",updateStrategy = FieldStrategy.IGNORED) private Long receiverId; // 接单人id private Long repairId; // 返修id + @TableField(value = "receiver_time",updateStrategy = FieldStrategy.IGNORED) private Date receiverTime; // 接单时间 private Date quotationTime; // 报价时间 private Date cancelOrderTime; // 取消订单时间 diff --git a/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java b/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java index 4902195..9cbad03 100644 --- a/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/order/OrderSparePartMapper.java @@ -21,4 +21,12 @@ public interface OrderSparePartMapper extends IBaseMapper { */ @Select("SELECT * FROM la_order_spare_part WHERE maintenance_order_id = #{maintenanceOrderId}") List findOrderSparePartByMaintenanceOrderId(@Param("maintenanceOrderId") Long maintenanceOrderId); + + /** + * 根据维修工单id查询工单 + * @param repairOrderId 检修工单id + * @return 数量 + */ + @Select("SELECT * FROM la_order_spare_part WHERE repair_order_id = #{repairOrderId}") + List findOrderSparePartByRepairOrderId(@Param("repairOrderId") Long repairOrderId); } diff --git a/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java b/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java index 493b56b..80c0ddc 100644 --- a/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java +++ b/common/src/main/java/com/hcy/common/mapper/order/RepairOrderMapper.java @@ -4,10 +4,15 @@ package com.hcy.common.mapper.order; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hcy.common.core.basics.IBaseMapper; import com.hcy.common.dto.RoutingInspectionOrderDto; +import com.hcy.common.dto.order.MaintenanceOrderDto; import com.hcy.common.dto.order.RepairOrderDto; +import com.hcy.common.entity.order.MaintenanceOrder; import com.hcy.common.entity.order.RepairOrder; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * 维修订单Mapper @@ -15,6 +20,13 @@ import org.apache.ibatis.annotations.Param; @Mapper public interface RepairOrderMapper extends IBaseMapper { + /** + * 工单池 + * @param form + * @return + */ + List list(@Param("form") RepairOrderDto form); + /** * 维修单列表 * @param page @@ -22,4 +34,11 @@ public interface RepairOrderMapper extends IBaseMapper { * @return */ Page pageList(@Param("page") Page page, @Param("form") RepairOrderDto form); + + /** + * 通过订单id查询维修订单 + * @return MaintenanceOrder + */ + @Select("select * from la_repair_order where is_delete = 0 and id = #{id}") + RepairOrder findMaintenanceOrderById(@Param("id") Long id); } diff --git a/common/src/main/resources/mapper/RepairOrderMapper.xml b/common/src/main/resources/mapper/RepairOrderMapper.xml index 286be0c..500a578 100644 --- a/common/src/main/resources/mapper/RepairOrderMapper.xml +++ b/common/src/main/resources/mapper/RepairOrderMapper.xml @@ -2,6 +2,39 @@ + + diff --git a/common/src/main/resources/mapper/SystemAuthAdminMapper.xml b/common/src/main/resources/mapper/SystemAuthAdminMapper.xml index 778426c..83b7d7a 100644 --- a/common/src/main/resources/mapper/SystemAuthAdminMapper.xml +++ b/common/src/main/resources/mapper/SystemAuthAdminMapper.xml @@ -41,9 +41,7 @@ join la_user as u on aa.user_id = u.id WHERE aa.is_delete = 0 - AND u.is_delete = 0 and aa.role = 6 - GROUP BY - aa.role + AND u.is_delete = 0 and aa.role like concat('%','6','%') ORDER BY maintenanceCount DESC diff --git a/front/src/main/java/com/hcy/front/controller/EquipmentController.java b/front/src/main/java/com/hcy/front/controller/EquipmentController.java deleted file mode 100644 index 2bf0e4a..0000000 --- a/front/src/main/java/com/hcy/front/controller/EquipmentController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.hcy.front.controller; - - -import com.hcy.common.core.AjaxResult; - -import com.hcy.common.validator.annotation.IDMust; -import com.hcy.front.service.client.IEquipmentService; -import com.hcy.front.vo.client.EquipmentDetailVo; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - - -/** - * 设备管理管理 - */ -@RestController -@RequestMapping("api/equipment") -public class EquipmentController { - - @Resource - IEquipmentService iEquipmentService; - - /** - * 设备管理详情 - * - * @author hcy - * @param number 主键ID - * @return Object - */ - @GetMapping("/detail") - public Object detail(@Validated @IDMust() @RequestParam("number") String number) { - EquipmentDetailVo detail = iEquipmentService.detail(number); - return AjaxResult.success(detail); - } -} diff --git a/front/src/main/java/com/hcy/front/controller/client/ClientController.java b/front/src/main/java/com/hcy/front/controller/client/ClientController.java new file mode 100644 index 0000000..f71f1bb --- /dev/null +++ b/front/src/main/java/com/hcy/front/controller/client/ClientController.java @@ -0,0 +1,52 @@ +package com.hcy.front.controller.client; + + +import com.hcy.common.core.AjaxResult; +import com.hcy.common.core.PageResult; +import com.hcy.common.validator.annotation.IDMust; +import com.hcy.front.service.client.IClientService; +import com.hcy.front.validate.PageParam; +import com.hcy.front.vo.client.ClientDetailVo; +import com.hcy.front.vo.client.ClientListVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Map; + +/** + * 客户管理 + */ +@RestController +@RequestMapping("api/client") +public class ClientController { + + @Resource + IClientService iClientService; + + /** + * 客户列表 + * + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return Object + */ + @GetMapping("/list") + public Object list(@Validated PageParam pageParam, + @RequestParam Map params) { + PageResult list = iClientService.list(pageParam, params); + return AjaxResult.success(list); + } + /** + * 客户详情 + * + * @param id 主键ID + * @return Object + */ + @GetMapping("/detail") + public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) { + ClientDetailVo detail = iClientService.detail(id); + return AjaxResult.success(detail); + } + +} diff --git a/front/src/main/java/com/hcy/front/controller/client/EquipmentController.java b/front/src/main/java/com/hcy/front/controller/client/EquipmentController.java new file mode 100644 index 0000000..9cc4d89 --- /dev/null +++ b/front/src/main/java/com/hcy/front/controller/client/EquipmentController.java @@ -0,0 +1,68 @@ +package com.hcy.front.controller.client; + + +import com.hcy.common.core.AjaxResult; +import com.hcy.common.core.PageResult; +import com.hcy.common.utils.QRCodeUtil; +import com.hcy.common.validator.annotation.IDMust; +import com.hcy.front.service.client.IEquipmentService; +import com.hcy.front.validate.PageParam; +import com.hcy.front.vo.client.EquipmentDetailVo; +import com.hcy.front.vo.client.EquipmentListVo; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.Map; + +/** + * 设备管理管理 + */ +@RestController +@RequestMapping("api/equipment") +public class EquipmentController { + + @Resource + IEquipmentService iEquipmentService; + + /** + * 设备管理列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return Object + */ + @GetMapping("/list") + public Object list(@Validated PageParam pageParam, + @RequestParam Map params) { + PageResult list = iEquipmentService.list(pageParam, params); + return AjaxResult.success(list); + } + /** + * 设备管理详情 + * + * @author hcy + * @param id 主键ID + * @return Object + */ + @GetMapping("/detailById") + public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) { + EquipmentDetailVo detail = iEquipmentService.detailById(id); + return AjaxResult.success(detail); + } + + /** + * 设备管理详情 根据设备编码进行查询 + * + * @author hcy + * @param number 主键ID + * @return Object + */ + @GetMapping("/detail") + public Object detail(@Validated @IDMust() @RequestParam("number") String number) { + EquipmentDetailVo detail = iEquipmentService.detail(number); + return AjaxResult.success(detail); + } +} diff --git a/front/src/main/java/com/hcy/front/controller/order/MaintenanceOrderController.java b/front/src/main/java/com/hcy/front/controller/order/MaintenanceOrderController.java index f3167ba..e0fba29 100644 --- a/front/src/main/java/com/hcy/front/controller/order/MaintenanceOrderController.java +++ b/front/src/main/java/com/hcy/front/controller/order/MaintenanceOrderController.java @@ -169,4 +169,5 @@ public class MaintenanceOrderController { iMaintenanceOrderService.oldModuleRepair(maintenanceOrderParam); return AjaxResult.success(); } + } diff --git a/front/src/main/java/com/hcy/front/controller/order/RepairOrderController.java b/front/src/main/java/com/hcy/front/controller/order/RepairOrderController.java new file mode 100644 index 0000000..f9a101b --- /dev/null +++ b/front/src/main/java/com/hcy/front/controller/order/RepairOrderController.java @@ -0,0 +1,125 @@ +package com.hcy.front.controller.order; + + +import com.hcy.common.core.AjaxResult; + +import com.hcy.common.core.PageResult; +import com.hcy.common.validator.annotation.IDMust; +import com.hcy.front.service.order.IRepairOrderService; +import com.hcy.front.validate.PageParam; +import com.hcy.front.validate.order.MaintenanceOrderParam; +import com.hcy.front.validate.order.RepairOrderParam; +import com.hcy.front.vo.order.RepairOrderDetailVo; +import com.hcy.front.vo.order.RepairOrderListVo; +import lombok.extern.java.Log; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 维修订单管理 + */ +@RestController +@RequestMapping("api/order/repairOrder") +public class RepairOrderController { + + @Resource + IRepairOrderService iRepairOrderService; + + /** + * 维修订单列表 + * + * @param repairOrderParam 搜索参数 + * @return Object + */ + @GetMapping("/list") + public Object list(RepairOrderParam repairOrderParam) { + return AjaxResult.success(iRepairOrderService.list(repairOrderParam)); + } + + /** + * 维修订单列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param repairOrderParam 搜索参数 + * @return Object + */ + @GetMapping("/pageList") + public Object pageList(@Validated PageParam pageParam, + RepairOrderParam repairOrderParam) { + PageResult list = iRepairOrderService.pageList(pageParam, repairOrderParam); + return AjaxResult.success(list); + } + + /** + * 维修订单详情 + * + * @author hcy + * @param id 主键ID + * @return Object + */ + @GetMapping("/detail") + public Object detail(@Validated @IDMust() @RequestParam("id") Integer id) { + RepairOrderDetailVo detail = iRepairOrderService.detail(id); + return AjaxResult.success(detail); + } + + /** + * 维修订单新增 + * + * @author hcy + * @param repairOrderParam 参数 + * @return Object + */ + @PostMapping("/add") + public Object add(@Validated(value = RepairOrderParam.create.class) @RequestBody RepairOrderParam repairOrderParam) { + iRepairOrderService.add(repairOrderParam); + return AjaxResult.success(); + } + + /** + * 抢单 + * @param repairOrderParam 参数 + * @return Object + */ + @PostMapping("/grabTheOrder") + public Object grabTheOrder(@RequestBody RepairOrderParam repairOrderParam) { + iRepairOrderService.grabTheOrder(repairOrderParam); + return AjaxResult.success(); + } + + /** + * 接单 + * @param repairOrderParam 参数 + * @return Object + */ + @PostMapping("/receivingOrder") + public Object receivingOrder(@RequestBody RepairOrderParam repairOrderParam) { + iRepairOrderService.receivingOrder(repairOrderParam); + return AjaxResult.success(); + } + + /** + * 退单 + * @param repairOrderParam 参数 + * @return Object + */ + @PostMapping("/refundOrder") + public Object refundOrder(@RequestBody RepairOrderParam repairOrderParam) { + iRepairOrderService.refundOrder(repairOrderParam); + return AjaxResult.success(); + } + + /** + * 故障检测 + * @param repairOrderParam 参数 + * @return Object + */ + @PostMapping("/faultDetect") + public Object faultDetect(@RequestBody RepairOrderParam repairOrderParam) { + iRepairOrderService.faultDetect(repairOrderParam); + return AjaxResult.success(); + } +} diff --git a/front/src/main/java/com/hcy/front/service/client/IClientService.java b/front/src/main/java/com/hcy/front/service/client/IClientService.java new file mode 100644 index 0000000..e0a334d --- /dev/null +++ b/front/src/main/java/com/hcy/front/service/client/IClientService.java @@ -0,0 +1,36 @@ +package com.hcy.front.service.client; + + + +import com.hcy.common.core.PageResult; +import com.hcy.front.validate.PageParam; +import com.hcy.front.vo.client.ClientDetailVo; +import com.hcy.front.vo.client.ClientListVo; + +import java.util.Map; + +/** + * 客户服务接口类 + */ +public interface IClientService { + + /** + * 客户列表 + * + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + PageResult list(PageParam pageParam, Map params); + + /** + * 客户详情 + * + * @param id 主键ID + * @return Client + */ + ClientDetailVo detail(Integer id); + + + +} diff --git a/front/src/main/java/com/hcy/front/service/client/IEquipmentService.java b/front/src/main/java/com/hcy/front/service/client/IEquipmentService.java index 0ba4d82..026b42d 100644 --- a/front/src/main/java/com/hcy/front/service/client/IEquipmentService.java +++ b/front/src/main/java/com/hcy/front/service/client/IEquipmentService.java @@ -1,7 +1,12 @@ package com.hcy.front.service.client; +import com.hcy.common.core.PageResult; +import com.hcy.front.validate.PageParam; import com.hcy.front.vo.client.EquipmentDetailVo; +import com.hcy.front.vo.client.EquipmentListVo; + +import java.util.Map; /** * 设备管理服务接口类 @@ -16,5 +21,8 @@ public interface IEquipmentService { * @return Equipment */ EquipmentDetailVo detail(String number); + + PageResult list(PageParam pageParam, Map params); + EquipmentDetailVo detailById(Integer id); } diff --git a/front/src/main/java/com/hcy/front/service/client/impl/ClientServiceImpl.java b/front/src/main/java/com/hcy/front/service/client/impl/ClientServiceImpl.java new file mode 100644 index 0000000..2dc535a --- /dev/null +++ b/front/src/main/java/com/hcy/front/service/client/impl/ClientServiceImpl.java @@ -0,0 +1,147 @@ +package com.hcy.front.service.client.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; + +import com.hcy.common.constant.GlobalConstant; +import com.hcy.common.core.PageResult; +import com.hcy.common.entity.client.Client; +import com.hcy.common.entity.client.ClientContacts; +import com.hcy.common.entity.client.Equipment; +import com.hcy.common.exception.OperateException; +import com.hcy.common.mapper.client.ClientContactsMapper; +import com.hcy.common.mapper.client.ClientMapper; +import com.hcy.common.mapper.client.EquipmentMapper; +import com.hcy.front.service.client.IClientService; +import com.hcy.front.service.region.IDevRegionService; +import com.hcy.front.validate.PageParam; +import com.hcy.front.vo.client.ClientDetailVo; +import com.hcy.front.vo.client.ClientListVo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * 客户实现类 + */ +@Service +public class ClientServiceImpl implements IClientService { + + @Resource + ClientMapper clientMapper; + + @Resource + private IDevRegionService regionService; + + @Resource + EquipmentMapper equipmentMapper; + + @Resource + ClientContactsMapper clientContactsMapper; + + /** + * 客户列表 + * + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageParam pageParam, Map params) { + Integer page = pageParam.getPageNo(); + Integer limit = pageParam.getPageSize(); + + String clientId = params.get("id"); + String clientNo = params.get("clientNo"); + String clientName = params.get("clientName"); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq(StringUtils.isNotEmpty(clientId),"id", clientId); + queryWrapper.eq("is_delete", 0); + queryWrapper.like(StringUtils.isNotEmpty(clientNo),"client_no",clientNo); + queryWrapper.like(StringUtils.isNotEmpty(clientName),"client_name",clientName); + queryWrapper.orderByDesc("id"); + + clientMapper.setSearch(queryWrapper, params, new String[]{ + "=:userId@user_id:long", + "like:clientNo@client_no:str", + "like:clientName@client_name:str", + "=:director:str", + "=:phone:str", + "=:provinceId@province_id:long", + "=:cityId@city_id:long", + "=:districtId@district_id:long", + "=:address:str", + "=:clientType@client_type:int", + "=:maintainType@maintain_type:int", + "=:purchaseDivisor@purchase_divisor:str", + "=:remark:str", + "=:creatorId@creator_id:long", + }); + + IPage iPage = clientMapper.selectPage(new Page<>(page, limit), queryWrapper); + + List list = new LinkedList<>(); + Map regionMap = regionService.getRegionMap(); + for(Client item : iPage.getRecords()) { + ClientListVo vo = new ClientListVo(); + BeanUtils.copyProperties(item, vo); + vo.setProvince(regionMap.get(vo.getProvinceId())); + vo.setCity(regionMap.get(vo.getCityId())); + vo.setDistrict(regionMap.get(vo.getDistrictId())); + //获取客户所有设备 + List equipment = equipmentMapper.selectList( + new QueryWrapper() + .eq("client_id", item.getId()) + .eq("is_delete", GlobalConstant.NOT_DELETE)); + vo.setEquipmentList(equipment); + //获取联系人列表 + List clientContacts = clientContactsMapper.selectList( + new QueryWrapper() + .eq("client_id", item.getId()) + .eq("is_delete", GlobalConstant.NOT_DELETE)); + if(clientContacts != null){ + vo.setClientContactsList(clientContacts); + } + + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 客户详情 + * + * @param id 主键参数 + * @return Client + */ + @Override + public ClientDetailVo detail(Integer id) { + Client model = clientMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("is_delete", GlobalConstant.NOT_DELETE) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + ClientDetailVo vo = new ClientDetailVo(); + BeanUtils.copyProperties(model, vo); + + Map regionMap = regionService.getRegionMap(); + vo.setProvince(regionMap.get(vo.getProvinceId())); + vo.setCity(regionMap.get(vo.getCityId())); + vo.setDistrict(regionMap.get(vo.getDistrictId())); + + return vo; + } +} diff --git a/front/src/main/java/com/hcy/front/service/client/impl/EquipmentServiceImpl.java b/front/src/main/java/com/hcy/front/service/client/impl/EquipmentServiceImpl.java index 34c1913..f88d1c1 100644 --- a/front/src/main/java/com/hcy/front/service/client/impl/EquipmentServiceImpl.java +++ b/front/src/main/java/com/hcy/front/service/client/impl/EquipmentServiceImpl.java @@ -7,14 +7,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.hcy.common.core.PageResult; import com.hcy.common.entity.client.Client; import com.hcy.common.entity.client.Equipment; +import com.hcy.common.entity.client.EquipmentModel; +import com.hcy.common.entity.user.User; import com.hcy.common.enums.equipment.EquipmentStateEnum; import com.hcy.common.mapper.client.ClientMapper; import com.hcy.common.mapper.client.EquipmentMapper; +import com.hcy.common.mapper.client.EquipmentModelMapper; +import com.hcy.common.mapper.user.UserMapper; import com.hcy.common.utils.StringUtil; import com.hcy.common.utils.TimeUtil; import com.hcy.front.service.client.IEquipmentService; import com.hcy.front.service.region.IDevRegionService; +import com.hcy.front.validate.PageParam; import com.hcy.front.vo.client.EquipmentDetailVo; +import com.hcy.front.vo.client.EquipmentListVo; +import com.hcy.front.vo.client.EquipmentModelDetailVo; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.util.Assert; @@ -34,28 +41,98 @@ public class EquipmentServiceImpl implements IEquipmentService { EquipmentMapper equipmentMapper; @Resource - private IDevRegionService regionService; + ClientMapper clientMapper; @Resource - ClientMapper clientMapper; + IDevRegionService regionService; + + @Resource + EquipmentModelMapper equipmentModelMapper; + + @Resource + UserMapper userMapper; + + /** + * 设备管理列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param params 搜索参数 + * @return PageResult + */ + @Override + public PageResult list(PageParam pageParam, Map params) { + Integer page = pageParam.getPageNo(); + Integer limit = pageParam.getPageSize(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("is_delete", 0); + queryWrapper.orderByDesc("id"); + + equipmentMapper.setSearch(queryWrapper, params, new String[]{ + "like:number:str", + "like:name:str", + "=:clientId@client_id:int", + "like:clientName@client_name:str", + "=:deviceStatus@device_status:int", + "datetime:createTimeStart-createTimeEnd@create_time:str", + }); + + IPage iPage = equipmentMapper.selectPage(new Page<>(page, limit), queryWrapper); + Map regionMap = regionService.getRegionMap();//获取省市区 + + List list = new LinkedList<>(); + for(Equipment item : iPage.getRecords()) { + EquipmentListVo vo = new EquipmentListVo(); + BeanUtils.copyProperties(item, vo); + vo.setProvince(regionMap.get(vo.getProvinceId())); + vo.setCity(regionMap.get(vo.getCityId())); + vo.setDistrict(regionMap.get(vo.getDistrictId())); + //获取客户名称 + Client client = clientMapper.selectOne( + new QueryWrapper() + .eq("id", item.getClientId()) + .last("limit 1")); + if (client != null){ + vo.setClientName(client.getClientName()); + } + + //设置设备模块信息 + EquipmentModel equipmentModel = equipmentModelMapper.findEquipmentModelByEquipmentId(vo.getId()); + EquipmentModelDetailVo equipmentModelDetailVo = new EquipmentModelDetailVo(); + if(equipmentModel != null){ + BeanUtils.copyProperties(equipmentModel, equipmentModelDetailVo); + + User insetallUser = userMapper.selectById(equipmentModel.getUserId()); + equipmentModelDetailVo.setInstallationName(insetallUser.getUsername()); + } + //设置设备模块信息 + vo.setEquipmentModel(equipmentModelDetailVo); + + vo.setCreateTime(TimeUtil.timestampToDate(item.getCreateTime())); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } /** * 设备管理详情 * * @author hcy - * @param number 主键参数 + * @param id 主键参数 * @return Equipment */ @Override - public EquipmentDetailVo detail(String number) { + public EquipmentDetailVo detailById(Integer id) { Equipment model = equipmentMapper.selectOne( new QueryWrapper() - .eq("number", number) + .eq("id", id) .eq("is_delete", 0) .last("limit 1")); Assert.notNull(model, "数据不存在"); - Map regionMap = regionService.getRegionMap(); + Map regionMap = regionService.getRegionMap();//获取省市区 EquipmentDetailVo vo = new EquipmentDetailVo(); BeanUtils.copyProperties(model, vo); vo.setProvince(regionMap.get(vo.getProvinceId())); @@ -64,4 +141,29 @@ public class EquipmentServiceImpl implements IEquipmentService { return vo; } + /** + * 设备管理详情 根据设备编号去查 + * + * @author hcy + * @param number 主键参数 + * @param number 主键参数 + * @return Equipment + */ + @Override + public EquipmentDetailVo detail(String number) { + Equipment model = equipmentMapper.selectOne( + new QueryWrapper() + .eq("number", number) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + Map regionMap = regionService.getRegionMap();//获取省市区 + EquipmentDetailVo vo = new EquipmentDetailVo(); + BeanUtils.copyProperties(model, vo); + vo.setProvince(regionMap.get(vo.getProvinceId())); + vo.setCity(regionMap.get(vo.getCityId())); + vo.setDistrict(regionMap.get(vo.getDistrictId())); + return vo; + } } diff --git a/front/src/main/java/com/hcy/front/service/order/IRepairOrderService.java b/front/src/main/java/com/hcy/front/service/order/IRepairOrderService.java new file mode 100644 index 0000000..f18c00f --- /dev/null +++ b/front/src/main/java/com/hcy/front/service/order/IRepairOrderService.java @@ -0,0 +1,75 @@ +package com.hcy.front.service.order; + + +import com.hcy.common.core.PageResult; +import com.hcy.front.validate.PageParam; +import com.hcy.front.validate.order.RepairOrderParam; +import com.hcy.front.vo.order.MaintenanceOrderListVo; +import com.hcy.front.vo.order.RepairOrderDetailVo; +import com.hcy.front.vo.order.RepairOrderListVo; + +import java.util.List; + +/** + * 维修订单服务接口类 + */ +public interface IRepairOrderService { + + /** + * 维修订单列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param repairOrderParam 搜索参数 + * @return PageResult + */ + PageResult pageList(PageParam pageParam, RepairOrderParam repairOrderParam); + + /** + * 维修订单详情 + * + * @author hcy + * @param id 主键ID + * @return RepairOrder + */ + RepairOrderDetailVo detail(Integer id); + + /** + * 维修订单新增 + * + * @author hcy + * @param repairOrderParam 参数 + */ + void add(RepairOrderParam repairOrderParam); + + /** + * 抢单 + * @param repairOrderParam + */ + void grabTheOrder(RepairOrderParam repairOrderParam); + + /** + * 接单 + * @param repairOrderParam + */ + void receivingOrder(RepairOrderParam repairOrderParam); + + /** + * 退单 + * @param repairOrderParam + */ + void refundOrder(RepairOrderParam repairOrderParam); + + /** + * 故障检测 + * @param repairOrderParam + */ + void faultDetect(RepairOrderParam repairOrderParam); + + /** + * 工单池 + * @param repairOrderParam + * @return + */ + List list(RepairOrderParam repairOrderParam); +} diff --git a/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java b/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java new file mode 100644 index 0000000..401a4e8 --- /dev/null +++ b/front/src/main/java/com/hcy/front/service/order/impl/RepairOrderServiceImpl.java @@ -0,0 +1,494 @@ +package com.hcy.front.service.order.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.hcy.common.constant.GlobalConstant; +import com.hcy.common.core.PageResult; +import com.hcy.common.dto.order.MaintenanceOrderDto; +import com.hcy.common.dto.order.OrderSparePart; +import com.hcy.common.dto.order.RepairOrderDto; +import com.hcy.common.entity.address.UserAddress; +import com.hcy.common.entity.client.Client; +import com.hcy.common.entity.client.Equipment; +import com.hcy.common.entity.order.MaintenanceOrder; +import com.hcy.common.entity.order.RepairOrder; +import com.hcy.common.entity.plant.Plant; +import com.hcy.common.entity.sparePart.SparePart; +import com.hcy.common.entity.system.SystemAuthAdmin; +import com.hcy.common.entity.user.User; +import com.hcy.common.enums.order.MaintenanceOrderStatusEnum; +import com.hcy.common.enums.order.OrderStateEnum; +import com.hcy.common.enums.order.RepairOrderStatusEnum; +import com.hcy.common.exception.OperateException; +import com.hcy.common.mapper.address.UserAddressMapper; +import com.hcy.common.mapper.client.ClientMapper; +import com.hcy.common.mapper.client.EquipmentMapper; +import com.hcy.common.mapper.order.OrderSparePartMapper; +import com.hcy.common.mapper.order.RepairOrderMapper; +import com.hcy.common.mapper.plant.PlantMapper; +import com.hcy.common.mapper.sparePart.SparePartMapper; +import com.hcy.common.mapper.system.SystemAuthAdminMapper; +import com.hcy.common.mapper.user.UserMapper; +import com.hcy.common.utils.ToolsUtil; +import com.hcy.front.FrontThreadLocal; +import com.hcy.front.service.order.IRepairOrderService; +import com.hcy.front.service.region.IDevRegionService; +import com.hcy.front.validate.PageParam; +import com.hcy.front.validate.order.MaintenanceOrderParam; +import com.hcy.front.validate.order.RepairOrderParam; +import com.hcy.front.validate.warehouse.SparePartParam; +import com.hcy.front.vo.address.UserAddressListVo; +import com.hcy.front.vo.client.EquipmentListVo; +import com.hcy.front.vo.order.MaintenanceOrderListVo; +import com.hcy.front.vo.order.RepairOrderDetailVo; +import com.hcy.front.vo.order.RepairOrderListVo; +import com.sun.xml.internal.ws.resources.AddressingMessages; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 维修订单实现类 + */ +@Service +public class RepairOrderServiceImpl implements IRepairOrderService { + + @Resource + RepairOrderMapper repairOrderMapper; + + @Resource + SystemAuthAdminMapper systemAuthAdminMapper; + + @Resource + PlantMapper plantMapper; + + @Resource + UserMapper userMapper; + + @Resource + ClientMapper clientMapper; + + @Resource + private IDevRegionService regionService; + + @Resource + UserAddressMapper userAddressMapper; + + @Resource + EquipmentMapper equipmentMapper; + + @Resource + SparePartMapper sparePartMapper; + + @Resource + OrderSparePartMapper orderSparePartMapper; + + private final DecimalFormat df = new DecimalFormat ("#.#"); + + /** + * 工单池 + * + * @param repairOrderParam + * @return + */ + @Override + public List list(RepairOrderParam repairOrderParam) { + RepairOrderDto repairOrderDto = new RepairOrderDto(); + BeanUtils.copyProperties(repairOrderParam,repairOrderDto); + //默认查询订单状态 + + List repairOrderDtoList = repairOrderMapper.list(repairOrderDto); + SystemAuthAdmin systemAuthAdmin = systemAuthAdminMapper.findSystemAuthAdminByUserId(FrontThreadLocal.getUserId()); + + List returnData = new LinkedList<>(); + for (RepairOrderDto item : repairOrderDtoList) { + + if(repairOrderParam.getQueryType() == MaintenanceOrderStatusEnum.NEAREST_TO_ME.getStatus()){ + //判断抢单距离大于订单距离则返回订单 + double distance = ToolsUtil.getDistance(item.getLongitude(), item.getLatitude() + , repairOrderParam.getLongitude(), repairOrderParam.getLatitude()); + + if(item.getReceiverType() == OrderStateEnum.REGIONAL_DISPATCH.getStatus()){ + if(item.getEquipmentProvinceId().equals(systemAuthAdmin.getProvinceId()) && + item.getEquipmentCityId().equals(systemAuthAdmin.getCityId()) && + item.getEquipmentDistrictId().equals(systemAuthAdmin.getDistrictId()) ){ + + // 计算距离 + RepairOrderListVo vo = new RepairOrderListVo(); + BeanUtils.copyProperties(item, vo); + vo.setDistance(distance); + returnData.add(vo); + } + }else{ + if(item.getOrderDistance().compareTo(BigDecimal.valueOf((distance / 1000))) >= 0){ + // 计算距离 + RepairOrderListVo vo = new RepairOrderListVo(); + BeanUtils.copyProperties(item, vo); + vo.setDistance(distance); + returnData.add(vo); + } + } + }else{ + RepairOrderListVo vo = new RepairOrderListVo(); + BeanUtils.copyProperties(item, vo); + returnData.add(vo); + } + } + + if(repairOrderParam.getQueryType() == MaintenanceOrderStatusEnum.NEAREST_TO_ME.getStatus()){ + //按距离排序 + returnData = returnData.stream() + .sorted(Comparator.comparing(RepairOrderListVo::getDistance)) + .collect(Collectors.toList()); + + //将米数转换为km + for (RepairOrderListVo repairOrderListVo : returnData) { + if(repairOrderListVo.getDistance() != null){ + double distance = repairOrderListVo.getDistance(); + if(distance < 1000){ + repairOrderListVo.setPracticalDistance(df.format(distance) + "米"); + }else{ + double km = distance / 1000; + repairOrderListVo.setPracticalDistance(df.format(km) + "km"); + } + } + } + } + + return returnData; + } + + /** + * 维修订单列表 + * + * @author hcy + * @param pageParam 分页参数 + * @param repairOrderParam 搜索参数 + * @return PageResult + */ + @Override + public PageResult pageList(PageParam pageParam, RepairOrderParam repairOrderParam) { + Integer page = pageParam.getPageNo(); + Integer limit = pageParam.getPageSize(); + + RepairOrderDto repairOrderDto = new RepairOrderDto(); + BeanUtils.copyProperties(repairOrderParam,repairOrderDto); + + if(repairOrderParam.getIsClient() == MaintenanceOrderStatusEnum.REPAIRER.getStatus()){ + repairOrderDto.setReceiverId(FrontThreadLocal.getUserId().longValue()); + if(StringUtils.isEmpty(repairOrderParam.getOrderStatusIds())){ + repairOrderDto.setOrderStatusIds("1,2,7,8"); + } + }else{ + if(StringUtils.isEmpty(repairOrderParam.getOrderStatusIds())){ + repairOrderDto.setOrderStatusIds("0,1,2,7,8"); + } + repairOrderDto.setClientId(repairOrderDto.getClientId()); + } + + IPage iPage = repairOrderMapper.pageList(new Page<>(page, limit), repairOrderDto); + + List list = new LinkedList<>(); + for(RepairOrderDto item : iPage.getRecords()) { + RepairOrderListVo vo = new RepairOrderListVo(); + BeanUtils.copyProperties(item, vo); + //管辖工厂 + SystemAuthAdmin authAdmin = systemAuthAdminMapper.selectOne( + new QueryWrapper() + .eq("user_id", vo.getCreatorId())); + if(authAdmin != null){ + Plant plant = plantMapper.selectOne( + new QueryWrapper() + .eq("id", authAdmin.getPlantId())); + if(plant != null){ + vo.setPlantId(plant.getId()); + vo.setPlantName(plant.getName()); + } + } + + vo.setCreateTime(item.getCreateTime()); + vo.setUpdateTime(item.getUpdateTime()); + list.add(vo); + } + + return PageResult.iPageHandle(iPage.getTotal(), iPage.getCurrent(), iPage.getSize(), list); + } + + /** + * 维修订单详情 + * + * @author hcy + * @param id 主键参数 + * @return RepairOrder + */ + @Override + public RepairOrderDetailVo detail(Integer id) { + RepairOrder model = repairOrderMapper.selectOne( + new QueryWrapper() + .eq("id", id) + .eq("is_delete", 0) + .last("limit 1")); + + Assert.notNull(model, "数据不存在"); + + RepairOrderDetailVo vo = new RepairOrderDetailVo(); + BeanUtils.copyProperties(model, vo); + vo.setUpdateTime(model.getUpdateTime()); + //客户名称 + Client clientName = clientMapper.selectOne( + new QueryWrapper() + .eq("id", model.getClientId())); + if(clientName != null){ + vo.setClientName(clientName.getClientName()); + } + //创建人名称 + User creatorName = userMapper.selectOne( + new QueryWrapper() + .eq("id", model.getCreatorId())); + if(creatorName != null){ + vo.setCreatorName(creatorName.getUsername()); + } + //接单人名称 + User user = userMapper.selectOne( + new QueryWrapper() + .eq("id", model.getReceiverId())); + if(user != null){ + vo.setReceiverName(user.getUsername()); + } + //管辖工厂 + SystemAuthAdmin authAdmin = systemAuthAdminMapper.selectOne( + new QueryWrapper() + .eq("user_id", vo.getCreatorId())); + if(authAdmin != null){ + Plant plant = plantMapper.selectOne( + new QueryWrapper() + .eq("id", authAdmin.getPlantId())); + if(plant != null){ + vo.setPlantId(plant.getId()); + vo.setPlantName(plant.getName()); + } + } + //回寄地址 + UserAddress userAddress = userAddressMapper.selectOne( + new QueryWrapper() + .eq("id", model.getAddressId())); + UserAddressListVo userAddressListVo = new UserAddressListVo(); + BeanUtils.copyProperties(userAddress, userAddressListVo); + Map regionMap = regionService.getRegionMap(); + userAddressListVo.setProvince(regionMap.get(userAddressListVo.getProvinceId())); + userAddressListVo.setCity(regionMap.get(userAddressListVo.getCityId())); + userAddressListVo.setDistrict(regionMap.get(userAddressListVo.getDistrictId())); + if(userAddress != null){ + vo.setAddress(userAddressListVo); + } + //设备信息 + Equipment equipment = equipmentMapper.selectOne( + new QueryWrapper() + .eq("id", model.getEquipmentId())); + EquipmentListVo equipmentListVo = new EquipmentListVo(); + equipmentListVo.setProvince(regionMap.get(equipment.getProvinceId())); + equipmentListVo.setCity(regionMap.get(equipment.getCityId())); + equipmentListVo.setDistrict(regionMap.get(equipment.getDistrictId())); + BeanUtils.copyProperties(equipment, equipmentListVo); + if(equipment != null){ + vo.setEquipment(equipmentListVo); + } + return vo; + } + + /** + * 维修订单新增 + * + * @author hcy + * @param repairOrderParam 参数 + */ + @Override + public void add(RepairOrderParam repairOrderParam) { + RepairOrder model = new RepairOrder(); + model.setOrderNo(getOrderNo()); //工单编号 + + model.setOrderStatus(RepairOrderStatusEnum.WAITING_LIST.getStatus()); // 订单状态 0-待抢单;1-待接单;2-接单超时;3-检测中;4-待客户确认;5-维修中;6-已完成;7-已退单;8-已关闭 + model.setOrderSource(OrderStateEnum.MAINTENANCE_SUPERVISOR_CREATION.getStatus()); //订单来源 5-维修主管创建 + model.setRepairWorkOrderFlow(OrderStateEnum.WORK_ORDER_TANK.getStatus()); // 工单去向 0=工单池 1=检修员 + model.setReceiverType(OrderStateEnum.REGIONAL_DISPATCH.getStatus()); // 接单类型 0-区域派单;1-距离派单 + + model.setClientId(repairOrderParam.getClientId()); // 客户id + model.setEquipmentId(repairOrderParam.getEquipmentId()); // 设备id + model.setFaultDescription(repairOrderParam.getFaultDescription()); // 故障描述 + model.setModuleNumber(repairOrderParam.getModuleNumber()); // 模块号 + model.setBrand(repairOrderParam.getBrand()); // 品牌 + model.setRemark(repairOrderParam.getRemark()); // 备注 + + model.setMaintenanceOrderId(repairOrderParam.getMaintenanceOrderId()); // 检修单id + model.setPriorityId(repairOrderParam.getPriorityId()); // 优先级 0-普通 1-加急 + model.setLogisticsMode(repairOrderParam.getLogisticsMode()); // 物流方式 0-物流快递 1=自领带回 + model.setExpressName(repairOrderParam.getExpressName()); // 快递名称 + model.setReturnOrNot(repairOrderParam.getReturnOrNot()); // 是否回寄(0=是 1=否) + model.setAddressId(repairOrderParam.getAddressId()); // 回寄地址 + model.setSiteImg(repairOrderParam.getSiteImg()); // 现场照片 + + // 获取当前的用户 + model.setCreatorId(FrontThreadLocal.getUserId().longValue()); // 创建人id + model.setCreateTime(new Date()); //创建时间 + + repairOrderMapper.insert(model); + } + + /** + * 抢单 + * @param repairOrderParam + */ + @Override + public void grabTheOrder(RepairOrderParam repairOrderParam) { + RepairOrder repairOrder = repairOrderMapper.findMaintenanceOrderById(repairOrderParam.getId()); + Assert.notNull(repairOrder, "数据不存在"); + + if(repairOrder.getOrderStatus() == MaintenanceOrderStatusEnum.WAITING_LIST.getStatus() + && repairOrder.getReceiverId() == null){ + repairOrder.setReceiverId(FrontThreadLocal.getUserId().longValue()); + repairOrder.setOrderStatus(MaintenanceOrderStatusEnum.CHECKING.getStatus()); + repairOrder.setReceiverTime(new Date()); + repairOrderMapper.updateById(repairOrder); + }else{ + throw new OperateException("订单已被其他人抢走"); + } + } + + /** + * 接单 + * @param repairOrderParam + */ + @Override + public void receivingOrder(RepairOrderParam repairOrderParam) { + RepairOrder repairOrder = repairOrderMapper.findMaintenanceOrderById(repairOrderParam.getId()); + Assert.notNull(repairOrder, "数据不存在"); + + if(repairOrder.getOrderStatus() == MaintenanceOrderStatusEnum.PENDING_ORDER.getStatus()){ + repairOrder.setOrderStatus(MaintenanceOrderStatusEnum.CHECKING.getStatus()); + repairOrder.setReceiverTime(new Date()); + repairOrderMapper.updateById(repairOrder); + }else{ + throw new OperateException("订单状态不正确"); + } + } + + /** + * 退单 + * @param repairOrderParam + */ + @Override + public void refundOrder(RepairOrderParam repairOrderParam) { + RepairOrder repairOrder = repairOrderMapper.findMaintenanceOrderById(repairOrderParam.getId()); + Assert.notNull(repairOrder, "数据不存在"); + Assert.notNull(repairOrderParam.getCancelCause(), "退单原因不可为空"); + + repairOrder.setCancelOrderTime(new Date()); //取消时间 + repairOrder.setCancelCause(repairOrderParam.getCancelCause()); //取消原因 + + if(repairOrderParam.getIsClient() == MaintenanceOrderStatusEnum.CLIENT.getStatus()){ + if(repairOrder.getOrderStatus() == MaintenanceOrderStatusEnum.WAITING_LIST.getStatus() || + repairOrder.getOrderStatus() == MaintenanceOrderStatusEnum.PENDING_ORDER.getStatus()){ + repairOrder.setOrderStatus(MaintenanceOrderStatusEnum.CLOSED.getStatus()); + repairOrderMapper.updateById(repairOrder); + }else{ + throw new OperateException("当前订单状态不可退单"); + } + }else { + if(repairOrder.getOrderStatus() == MaintenanceOrderStatusEnum.CHECKING.getStatus() || + repairOrder.getOrderStatus() == MaintenanceOrderStatusEnum.PENDING_ORDER.getStatus()){ + + if(repairOrder.getRepairWorkOrderFlow() == OrderStateEnum.WORK_ORDER_TANK.getStatus()){ + repairOrder.setOrderStatus(MaintenanceOrderStatusEnum.WAITING_LIST.getStatus()); + repairOrder.setReceiverId(null); + repairOrder.setReceiverTime(null); + }else{ + repairOrder.setOrderStatus(MaintenanceOrderStatusEnum.CHARGEBACK.getStatus()); + } + + repairOrderMapper.updateById(repairOrder); + }else{ + throw new OperateException("当前订单状态不可退单"); + } + } + } + + /** + * 故障检测 + * + * @param repairOrderParam + */ + @Override + public void faultDetect(RepairOrderParam repairOrderParam) { + RepairOrder repairOrder = repairOrderMapper.findMaintenanceOrderById(repairOrderParam.getId()); + Assert.notNull(repairOrder, "数据不存在"); + + for (SparePartParam item : repairOrderParam.getSparePartParams()) { + SparePart sparePart = sparePartMapper.findSparePartById(item.getId()); + + OrderSparePart orderSparePart = new OrderSparePart(); + BeanUtils.copyProperties(sparePart, orderSparePart); + + orderSparePart.setId(null); + orderSparePart.setRepairOrderId(repairOrder.getId()); + orderSparePart.setSparePartsId(item.getId()); + orderSparePart.setWarehouseId(sparePart.getWarehouseId()); + orderSparePart.setQuantity(item.getQuantity()); + orderSparePartMapper.insert(orderSparePart); + } + repairOrder.setFaultId(repairOrderParam.getFaultId()); //故障原因id + + repairOrder.setPreMaintenanceImg(repairOrderParam.getPreMaintenanceImg()); // 维修前图片 + repairOrder.setFaultPointImg(repairOrderParam.getFaultPointImg()); //故障点图片 + repairOrder.setScrapOrNot(repairOrderParam.getScrapOrNot()); // 是否报废(0=是,1=否) + repairOrder.setScrapFaultId(repairOrderParam.getScrapFaultId()); // 报废类型id + repairOrder.setScrapAddress(repairOrderParam.getScrapAddress()); // 报废地址 + repairOrder.setScrapExplain(repairOrderParam.getScrapExplain()); // 报废说明 + repairOrderMapper.updateById(repairOrder); + } + + + + /** + * 工单编号 + * @return + */ + private String getOrderNo() { + //获取当前日期并将其进行格式化 + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); + String formatDate = simpleDateFormat.format(new Date()); + + StringBuilder currentOrderNo = new StringBuilder(formatDate + "000001"); + RepairOrder repairOrder = repairOrderMapper.selectOne(new LambdaQueryWrapper() + .eq(RepairOrder::getIsDelete, GlobalConstant.NOT_DELETE) + .like(RepairOrder::getOrderNo, formatDate) + .orderByDesc(RepairOrder::getOrderNo) + .last("limit 1")); + //当天日期加第一条流水号,如果数据库不存在,则代表今天第一条数据 + if (repairOrder == null) { + return currentOrderNo.toString(); + } else { + int lastOrderNo = Integer.parseInt(repairOrder.getOrderNo().substring(8)); + int length = String.valueOf((lastOrderNo + 1)).length(); + StringBuilder newOrderNo = new StringBuilder(lastOrderNo + 1 + ""); + + //如果流水号长度小于6位,则在前面补0 + if (length < 6) { + for (int i = 0; i < 6 - length; i++) { + newOrderNo.insert(0, "0"); + } + } + + return formatDate + newOrderNo; + } + } +} diff --git a/front/src/main/java/com/hcy/front/validate/client/ClientParam.java b/front/src/main/java/com/hcy/front/validate/client/ClientParam.java new file mode 100644 index 0000000..66e7b82 --- /dev/null +++ b/front/src/main/java/com/hcy/front/validate/client/ClientParam.java @@ -0,0 +1,89 @@ +package com.hcy.front.validate.client; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * 客户参数 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class ClientParam implements Serializable { + + private static final long serialVersionUID = 1L; + + public interface create{} + public interface update{} + public interface delete{} + + private Long id; + + private Long userId; + + @NotNull(message = "clientNo参数缺失", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "clientNo参数值不能少于0", groups = {create.class, update.class}) + private String clientNo; + + @NotNull(message = "clientName参数缺失", groups = {create.class, update.class}) + @Length(max = 50, message = "clientName参数不能超出50个字符", groups = {create.class, update.class}) + private String clientName; + + @NotNull(message = "director参数缺失", groups = {create.class, update.class}) + @Length(max = 50, message = "director参数不能超出50个字符", groups = {create.class, update.class}) + private String director; + + private String directorStaffId; + + @NotNull(message = "phone参数缺失", groups = {create.class, update.class}) + @Length(max = 11, message = "phone参数不能超出11个字符", groups = {create.class, update.class}) + private String phone; + + @NotNull(message = "provinceId参数缺失", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "provinceId参数值不能少于0", groups = {create.class, update.class}) + private Long provinceId; + + @NotNull(message = "cityId参数缺失", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "cityId参数值不能少于0", groups = {create.class, update.class}) + private Long cityId; + + @NotNull(message = "districtId参数缺失", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "districtId参数值不能少于0", groups = {create.class, update.class}) + private Long districtId; + + @NotNull(message = "address参数缺失", groups = {create.class, update.class}) + @Length(max = 255, message = "address参数不能超出255个字符", groups = {create.class, update.class}) + private String address; + + @NotNull(message = "clientType参数缺失", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "clientType参数值不能少于0", groups = {create.class, update.class}) + private Integer clientType; + + @NotNull(message = "maintainType参数缺失", groups = {create.class, update.class}) + @DecimalMin(value = "0", message = "maintainType参数值不能少于0", groups = {create.class, update.class}) + private Integer maintainType; + + @NotNull(message = "purchaseDivisor参数缺失", groups = {create.class, update.class}) + private BigDecimal purchaseDivisor; + + @NotNull(message = "pointMaintainDivisor参数缺失", groups = {create.class, update.class}) + private BigDecimal pointMaintainDivisor; + + @NotNull(message = "partMaintainDivisor参数缺失", groups = {create.class, update.class}) + private BigDecimal partMaintainDivisor; + + @NotNull(message = "remark参数缺失", groups = {create.class, update.class}) + @Length(max = 250, message = "remark参数不能超出250个字符", groups = {create.class, update.class}) + private String remark; + + private Long creatorId; + private String shortName; // 客户简称 + +} diff --git a/front/src/main/java/com/hcy/front/validate/client/EquipmentParam.java b/front/src/main/java/com/hcy/front/validate/client/EquipmentParam.java new file mode 100644 index 0000000..0058989 --- /dev/null +++ b/front/src/main/java/com/hcy/front/validate/client/EquipmentParam.java @@ -0,0 +1,80 @@ +package com.hcy.front.validate.client; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import java.io.Serializable; +import java.util.List; + +/** + * 设备管理参数 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class EquipmentParam implements Serializable { + + private static final long serialVersionUID = 1L; + + public interface create{} + public interface update{} + public interface delete{} + + private Long id; + + @DecimalMin(value = "0", message = "clientId参数值不能少于0", groups = {create.class, update.class}) + private Long clientId; + + @DecimalMin(value = "0", message = "moduleId参数值不能少于0", groups = {create.class, update.class}) + private Long moduleId; + + private String number; + + @Length(max = 255, message = "name参数不能超出255个字符", groups = {create.class, update.class}) + private String name; + + @Length(max = 255, message = "model参数不能超出255个字符", groups = {create.class, update.class}) + private String model; + + @Length(max = 255, message = "manufacturers参数不能超出255个字符", groups = {create.class, update.class}) + private String manufacturers; + + @Length(max = 255, message = "specification参数不能超出255个字符", groups = {create.class, update.class}) + private String specification; + + @DecimalMin(value = "0", message = "deviceStatus参数值不能少于0", groups = {create.class, update.class}) + private Integer deviceStatus; + + @Length(max = 24, message = "longitude参数不能超出24个字符", groups = {create.class, update.class}) + private String longitude; + + @Length(max = 24, message = "latitude参数不能超出24个字符", groups = {create.class, update.class}) + private String latitude; + + @DecimalMin(value = "0", message = "provinceId参数值不能少于0", groups = {create.class, update.class}) + private Long provinceId; + + @DecimalMin(value = "0", message = "districtId参数值不能少于0", groups = {create.class, update.class}) + private Long districtId; + + @DecimalMin(value = "0", message = "cityId参数值不能少于0", groups = {create.class, update.class}) + private Long cityId; + + @Length(max = 255, message = "detailedAddress参数不能超出255个字符", groups = {create.class, update.class}) + private String detailedAddress; + + @DecimalMin(value = "0", message = "inspectionCycle参数值不能少于0", groups = {create.class, update.class}) + private Integer inspectionCycle; + + @DecimalMin(value = "0", message = "dailyAudit参数值不能少于0", groups = {create.class, update.class}) + private Integer dailyAudit; + + @Length(max = 255, message = "deviceCode参数不能超出255个字符", groups = {create.class, update.class}) + private String deviceCode; + + private List ids; //批量停用 + private String clientName; // 客户名称 +} diff --git a/front/src/main/java/com/hcy/front/validate/order/RepairOrderParam.java b/front/src/main/java/com/hcy/front/validate/order/RepairOrderParam.java new file mode 100644 index 0000000..1e5d1cf --- /dev/null +++ b/front/src/main/java/com/hcy/front/validate/order/RepairOrderParam.java @@ -0,0 +1,124 @@ +package com.hcy.front.validate.order; + +import com.hcy.front.validate.warehouse.SparePartParam; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.DecimalMin; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 维修订单参数 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +public class RepairOrderParam implements Serializable { + + private static final long serialVersionUID = 1L; + + public interface create{} + public interface update{} + public interface delete{} + + private Long id; + + @Length(max = 50, message = "orderNo参数不能超出50个字符", groups = {create.class, update.class}) + private String orderNo; + + @DecimalMin(value = "0", message = "orderSource参数值不能少于0", groups = {create.class, update.class}) + private Integer orderSource; + + @DecimalMin(value = "0", message = "orderStatus参数值不能少于0", groups = {create.class, update.class}) + private Integer orderStatus; + + @DecimalMin(value = "0", message = "clientId参数值不能少于0", groups = {create.class, update.class}) + private Long clientId; + + @DecimalMin(value = "0", message = "equipmentId参数值不能少于0", groups = {create.class, update.class}) + private Long equipmentId; + + @Length(max = 32, message = "clientName参数不能超出32个字符", groups = {create.class, update.class}) + private String clientName; + + @Length(max = 32, message = "clientContacts参数不能超出32个字符", groups = {create.class, update.class}) + private String clientContacts; + + @Length(max = 32, message = "clientPhone参数不能超出32个字符", groups = {create.class, update.class}) + private String clientPhone; + + @Length(max = 250, message = "faultDescription参数不能超出250个字符", groups = {create.class, update.class}) + private String faultDescription; + + @Length(max = 32, message = "moduleNumber参数不能超出32个字符", groups = {create.class, update.class}) + private String moduleNumber; + + @Length(max = 32, message = "brand参数不能超出32个字符", groups = {create.class, update.class}) + private String brand; + + @Length(max = 250, message = "remark参数不能超出250个字符", groups = {create.class, update.class}) + private String remark; + + @DecimalMin(value = "0", message = "creatorId参数值不能少于0", groups = {create.class, update.class}) + private Long creatorId; + + private Date createTime; + + private Date updateTime; + + @DecimalMin(value = "0", message = "maintenanceOrderId参数值不能少于0", groups = {create.class, update.class}) + private Long maintenanceOrderId; + + @DecimalMin(value = "0", message = "priorityId参数值不能少于0", groups = {create.class, update.class}) + private Integer priorityId; + + @Length(max = 50, message = "expressName参数不能超出50个字符", groups = {create.class, update.class}) + private String expressName; + + @DecimalMin(value = "0", message = "returnOrNot参数值不能少于0", groups = {create.class, update.class}) + private Integer returnOrNot; + + @DecimalMin(value = "0", message = "addressId参数值不能少于0", groups = {create.class, update.class}) + private Long addressId; + + @Length(max = 255, message = "siteImg参数不能超出255个字符", groups = {create.class, update.class}) + private String siteImg; + private String equipmentName; // 设备名称 + private String moduleImg; // 模块图片 + private Integer logisticsMode; // 物流方式 0-物流快递 1=自领带回 + private String creatorName; // 创建人名称 + private String receiverName; //接单人名称 + private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 + private BigDecimal orderDistance; // 订单距离 + private Long receiverId; // 接单人id + private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 + private String likeWork; //关键字 + private String orderStatusIds; //订单状态ids + private Double longitude; // 经度 + private Double latitude; // 纬度 + private Integer queryType; // 查询类型 0-离我最近 1-时间优先 + private Long faultId; // 故障id + + private Date cancelOrderTime; // 取消订单时间 + private String cancelCause; // 取消原因 + + //服务报价列表 + private List sparePartParams; + + private Integer isClient; //是否客户 0-客户端 1-检修员端 + private Integer isMaintain; //是否维修 0-维修 1-不维修 + private Integer warehouseType; //仓库类型 0-我的仓库 1-公共仓库 + private Integer deliveryMethod; //配送方式 0-物流 1-上门取件 2-送货上门 + + private String preMaintenanceImg; // 维修前照片 + private String faultPointImg; // 故障点照片 + private Integer scrapOrNot; // 是否报废(0=是,1=否) + private Long scrapFaultId; // 报废类型id + private String scrapAddress; // 报废地址 + private String scrapExplain; // 报废说明 +} diff --git a/front/src/main/java/com/hcy/front/vo/client/ClientDetailVo.java b/front/src/main/java/com/hcy/front/vo/client/ClientDetailVo.java new file mode 100644 index 0000000..ba05400 --- /dev/null +++ b/front/src/main/java/com/hcy/front/vo/client/ClientDetailVo.java @@ -0,0 +1,39 @@ +package com.hcy.front.vo.client; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +/** + * ClientVo + */ +@Data +public class ClientDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; // id + private Long userId; // 用户id + private String clientNo; // 客户编号 + private String clientName; // 客户名称 + private String director; // 负责人 + private String directorStaffId; // 负责员工id + private String phone; // 联系电话 + private Long provinceId; // 省id + private Long cityId; // 市id + private Long districtId; // 区id + private String province; // 省 + private String city; // 市 + private String district; // 区 + private String address; // 详细地址 + private Integer clientType; // 桩点维修类型 0-全包 1-半包 + private Integer maintainType; // 模块维修类型 0-全包 1-半包 + private BigDecimal purchaseDivisor; // 配件采购价格因子 + private BigDecimal pointMaintainDivisor; // 桩点维修价格因子 + private BigDecimal partMaintainDivisor; // 配件维修价格因子 + private String remark; // 备注 + private Long creatorId; // 创建人id + private String shortName; // 客户简称 + +} diff --git a/front/src/main/java/com/hcy/front/vo/client/ClientListVo.java b/front/src/main/java/com/hcy/front/vo/client/ClientListVo.java new file mode 100644 index 0000000..31f6d2c --- /dev/null +++ b/front/src/main/java/com/hcy/front/vo/client/ClientListVo.java @@ -0,0 +1,46 @@ +package com.hcy.front.vo.client; + +import com.hcy.common.entity.client.ClientContacts; +import com.hcy.common.entity.client.Equipment; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * ClientVo + */ +@Data +public class ClientListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; // id + private Long userId; // 用户id + private String clientNo; // 客户编号 + private String clientName; // 客户名称 + private String director; // 负责人 + private String directorStaffId; // 负责员工id + private String phone; // 联系电话 + private Long provinceId; // 省id + private Long cityId; // 市id + private Long districtId; // 区id + private String province; // 省 + private String city; // 市 + private String district; // 区 + private String address; // 详细地址 + private Integer clientType; // 桩点维修类型 0-全包 1-半包 + private Integer maintainType; // 模块维修类型 0-全包 1-半包 + private BigDecimal purchaseDivisor; // 配件采购价格因子 + private BigDecimal pointMaintainDivisor; // 桩点维修价格因子 + private BigDecimal partMaintainDivisor; // 配件维修价格因子 + private String remark; // 备注 + private Long creatorId; // 创建人id + private Date createTime; // 创建时间 + private Date updateTime; // 更新时间 + private List equipmentList; //设备列表 + private String shortName; // 客户简称 + private List clientContactsList; //联系人列表 +} diff --git a/front/src/main/java/com/hcy/front/vo/client/EquipmentListVo.java b/front/src/main/java/com/hcy/front/vo/client/EquipmentListVo.java index 4cb9c8a..a43aab3 100644 --- a/front/src/main/java/com/hcy/front/vo/client/EquipmentListVo.java +++ b/front/src/main/java/com/hcy/front/vo/client/EquipmentListVo.java @@ -35,4 +35,7 @@ public class EquipmentListVo implements Serializable { private String deviceCode; // 设备码 private String createTime; // 创建时间 private String clientName; // 客户名称 + + private EquipmentModelDetailVo equipmentModel; //设备模块信息 + } diff --git a/front/src/main/java/com/hcy/front/vo/order/OrderSparePartListVo.java b/front/src/main/java/com/hcy/front/vo/order/OrderSparePartListVo.java index 53459fc..02a04dd 100644 --- a/front/src/main/java/com/hcy/front/vo/order/OrderSparePartListVo.java +++ b/front/src/main/java/com/hcy/front/vo/order/OrderSparePartListVo.java @@ -15,6 +15,7 @@ public class OrderSparePartListVo implements Serializable { private Long id; // id private Long maintenanceOrderId; //检修单id + private Long repairOrderId; //维修单id private Long sparePartsId; // 备件id private String sparePartsCode; // 备件编码 private String sparePartsName; // 备件名称 diff --git a/front/src/main/java/com/hcy/front/vo/order/RepairOrderDetailVo.java b/front/src/main/java/com/hcy/front/vo/order/RepairOrderDetailVo.java new file mode 100644 index 0000000..f520899 --- /dev/null +++ b/front/src/main/java/com/hcy/front/vo/order/RepairOrderDetailVo.java @@ -0,0 +1,57 @@ +package com.hcy.front.vo.order; + +import com.hcy.common.entity.address.UserAddress; +import com.hcy.common.entity.client.Equipment; +import com.hcy.front.vo.address.UserAddressListVo; +import com.hcy.front.vo.client.EquipmentListVo; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * RepairOrderVo + */ +@Data +public class RepairOrderDetailVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; // 主键id + private String orderNo; // 订单编号 + private Integer orderSource; // 订单来源 0-客户上报;1-系统创建;2-维修员创建;3-检修员创建;4-客服创建;5-维修主管创建 + private Integer orderStatus; // 订单状态 0-待抢单;1-待接单;2-接单超时;3-检测中;4-待客户确认;5-维修中;6-已完成;7-已退单;8-已关闭 + private Long clientId; // 客户id + private Long equipmentId; // 设备id + private String clientName; // 客户名称 + private String clientContacts; // 客户联系人 + private String clientPhone; // 客户联系电话 + private Long faultId; // 故障id + private String faultDescription; // 故障描述 + private String moduleNumber; // 模块号 + private String brand; // 品牌 + private Long receiverId; // 接单人id + private String receiverName; //接单人名称 + private Date receiverTime; // 接单时间 + private String remark; // 备注 + private Long creatorId; // 创建人id + private String creatorName; // 创建人名称 + private Date createTime; // 创建时间 + private Date updateTime; // 更新时间 + private Long maintenanceOrderId; // 检修单id + private Integer priorityId; // 优先级 0-普通 1-加急 + private Integer logisticsMode; // 物流方式 0-物流快递 1=自领带回 + private String expressName; // 快递名称 + private Integer returnOrNot; // 是否回寄(0=是 1=否) + private Long addressId; // 回寄地址 + private String siteImg; // 现场照片 + private Long plantId; // 管辖工厂 + private String plantName; //管辖工厂名 + private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 + private BigDecimal orderDistance; // 订单距离 + private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 + private UserAddressListVo address; //地址信息 + private EquipmentListVo equipment; //设备信息 + +} diff --git a/front/src/main/java/com/hcy/front/vo/order/RepairOrderListVo.java b/front/src/main/java/com/hcy/front/vo/order/RepairOrderListVo.java new file mode 100644 index 0000000..190545f --- /dev/null +++ b/front/src/main/java/com/hcy/front/vo/order/RepairOrderListVo.java @@ -0,0 +1,60 @@ +package com.hcy.front.vo.order; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * RepairOrderVo + */ +@Data +public class RepairOrderListVo implements Serializable { + + private static final long serialVersionUID = 1L; + + private Long id; // 主键id + private String orderNo; // 订单编号 + private Integer orderSource; // 订单来源 0-客户上报;1-系统创建;2-维修员创建;3-检修员创建;4-客服创建;5-维修主管创建 + private Integer orderStatus; // 订单状态 0-待抢单;1-待接单;2-接单超时;3-检测中;4-待客户确认;5-维修中;6-已完成;7-已退单;8-已关闭 + private Long clientId; // 客户id + private Long equipmentId; // 设备id + private String clientName; // 客户名称 + private String clientContacts; // 客户联系人 + private String clientPhone; // 客户联系电话 + private Long faultId; // 故障id + private String faultDescription; // 故障描述 + private String moduleNumber; // 模块号 + private String brand; // 品牌 + private Long receiverId; // 接单人id + private String receiverName; //接单人名称 + private Date receiverTime; // 接单时间 + private String remark; // 备注 + private Long creatorId; // 创建人id + private String creatorName; // 创建人名称 + private Date createTime; // 创建时间 + private Date updateTime; // 更新时间 + private Long maintenanceOrderId; // 检修单id + private Long priorityId; // 优先级 0-普通 1-加急 + private Integer logisticsMode; // 物流方式 0-物流快递 1=自领带回 + private String expressName; // 快递名称 + private Integer returnOrNot; // 是否回寄(0=是 1=否) + private Long addressId; // 回寄地址 + private String siteImg; // 现场照片 + private Long plantId; // 管辖工厂 + private String plantName; //管辖工厂名 + private Integer receiverType; // 接单类型 0-区域派单;1-距离派单 + private Integer repairWorkOrderFlow; // 工单去向 0=工单池 1=检修员 + private Integer isMaintain; //是否维修 0-维修 1-不维修 + private Integer warehouseType; //仓库类型 0-我的仓库 1-公共仓库 + private Double distance; //距离 + private String practicalDistance; //实际距离 + + private Integer isConfirmReceipt; //是否确认收货 0-未收货 1-已收货 + + private String faultName; //故障名称 + private String equipmentNo; //设备编号 + private String equipmentName; //设备名称 + private String detailedAddress; //设备详情地址 + +}