修改了物业一些bug
Some checks failed
Build and Push to Target Registry / 构建并推送镜像到目标仓库 (push) Failing after 12m36s

This commit is contained in:
2025-08-25 17:31:33 +08:00
parent c86f887d3e
commit da131cda5c
26 changed files with 362 additions and 90 deletions

View File

@@ -26,7 +26,7 @@ import java.util.List;
/**
* 【业务管理-工单处理】
* 前端访问路由地址为:/system/workOrders
* 前端访问路由地址为:/property/workOrders
*
* @author mocheng
* @date 2025-07-07
@@ -42,7 +42,7 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 查询【工单处理】列表
*/
//@SaCheckPermission("system:workOrders:list")
@SaCheckPermission("property:workOrders:list")
@GetMapping("/list")
public TableDataInfo<ServiceWorkOrdersVo> list(ServiceWorkOrdersBo bo, PageQuery pageQuery) {
return serviceWorkOrdersService.queryPageList(bo, pageQuery);
@@ -51,7 +51,7 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 导出【工单处理】列表
*/
// @SaCheckPermission("system:workOrders:export")
@SaCheckPermission("property:workOrders:export")
@Log(title = "【工单处理】", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ServiceWorkOrdersBo bo, HttpServletResponse response) {
@@ -64,7 +64,7 @@ public class ServiceWorkOrdersController extends BaseController {
*
* @param id 主键
*/
// @SaCheckPermission("system:workOrders:query")
@SaCheckPermission("property:workOrders:query")
@GetMapping("/{id}")
public R<ServiceWorkOrdersInfoVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("id") Long id) {
@@ -74,7 +74,7 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 新增【工单处理】
*/
// @SaCheckPermission("system:workOrders:add")
@SaCheckPermission("property:workOrders:add")
@Log(title = "【工单处理】", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
@@ -85,20 +85,40 @@ public class ServiceWorkOrdersController extends BaseController {
/**
* 修改【工单处理】
*/
//@SaCheckPermission("system:workOrders:edit")
@SaCheckPermission("property:workOrders:edit")
@Log(title = "【工单处理】", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) {
return toAjax(serviceWorkOrdersService.updateByBo(bo));
}
/**
* 派单【工单处理】
*/
@SaCheckPermission("property:workOrders:dispatch")
@Log(title = "【工单处理】", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("/dispatch")
public R<Void> dispatch(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) {
return toAjax(serviceWorkOrdersService.updateByBo(bo));
}
/**
* 抢单【工单处理】
*/
@SaCheckPermission("property:workOrders:grab")
@Log(title = "【工单处理】", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping("grab")
public R<Void> grab(@Validated(EditGroup.class) @RequestBody ServiceWorkOrdersBo bo) {
return toAjax(serviceWorkOrdersService.updateByBo(bo));
}
/**
* 删除【工单处理】
*
* @param ids 主键串
*/
// @SaCheckPermission("system:workOrders:remove")
@SaCheckPermission("property:workOrders:remove")
@Log(title = "【工单处理】", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")

View File

@@ -47,7 +47,7 @@ public class ServiceWorkOrders extends TenantEntity {
private Long type;
/**
* 状态
* 状态(0创建工单,1已派单2已抢单3处理中,4已完成,5已评价)
*/
private String status;

View File

@@ -38,7 +38,7 @@ public class ServiceWorkOrdersType extends TenantEntity {
private String orderTypeName;
/**
* 运作模式
* 运作模式(0派单+抢单,1派单,2自动派单)
*/
private String operationMode;
@@ -56,7 +56,10 @@ public class ServiceWorkOrdersType extends TenantEntity {
* 是否支持转单(0支持,1不支持)
*/
private Integer isTransfers;
/**
* 权重(1一般2紧急3危急)
*/
private String processingWeight;
/**
* 搜索值
*/

View File

@@ -50,6 +50,11 @@ public class CostCarChargeBo extends BaseEntity {
* 车位
*/
private String location;
/**
* 车位名称
*/
private String locationName;
/**
* 缴费状态
*/

View File

@@ -54,7 +54,10 @@ public class ServiceWorkOrdersTypeBo extends BaseEntity {
*/
@NotNull(message = "完成时效不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer completionNumber;
/**
* 权重(1一般2紧急3危急)
*/
private String processingWeight;
/**
* 是否支持转单(0支持,1不支持)
*/

View File

@@ -0,0 +1,28 @@
package org.dromara.property.domain.enums;
/**
* 工单上报类型
*/
public enum OrderReportingTypeEnum {
TELEPHONE_REPORT("电话上报", "1"),
SCENE_REPORT("现场上报", "2"),
SYSTEM_REPORT("系统上报", "3"),
PHONE_REPORT("手机上报", "4");
private final String name;
private final String value;
OrderReportingTypeEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
}

View File

@@ -0,0 +1,28 @@
package org.dromara.property.domain.enums;
/**
* @Author:yuyongle
* @Date:2025/7/4 10:35
* @Description:工单类型运作模式
**/
public enum OrderTypeOperationEnum {
DISPATCH_ORDERS_AND_GRAB_ORDERS("派单+抢单", "0"),
DISPATCH("派单", "1"),
AUTOMATE_DISPATCH("自动派单", "2");
private final String name;
private final String value;
OrderTypeOperationEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getName() {
return this.name;
}
public String getValue() {
return this.value;
}
}

View File

@@ -35,6 +35,10 @@ public class CostHouseChargeDetailVo implements Serializable {
*/
@ExcelProperty(value = "房屋")
private Long roomId;
/**
* 房屋名称
*/
private String roomName;
/**
* 业主
*/

View File

@@ -42,6 +42,11 @@ public class CostHouseChargeVo implements Serializable {
*/
@ExcelProperty(value = "房屋")
private Long roomId;
/**
* 房屋名称
*/
private String roomName;
/**
* 业主
*/

View File

@@ -45,6 +45,10 @@ public class CostMeterWaterVo implements Serializable {
* 费用类型
*/
private String costType;
/**
* 费用名称
*/
private String costTypeName;
/**
* 房间id
*/

View File

@@ -57,7 +57,10 @@ public class ServiceWorkOrdersInfoVo implements Serializable {
*/
@ExcelProperty(value = "权重")
private String processingWeight;
/**
* 运作模式(0派单+抢单,1派单,2自动派单)
*/
private String operationMode;
/**
* 状态
*/

View File

@@ -68,7 +68,10 @@ public class ServiceWorkOrdersTypeVo implements Serializable {
*/
@ExcelProperty(value = "是否支持转单(0支持,1不支持)")
private Integer isTransfers;
/**
* 权重(1一般2紧急3危急)
*/
private String processingWeight;
/**
* 搜索值

View File

@@ -67,7 +67,7 @@ public class ServiceWorkOrdersVo implements Serializable {
/**
* 状态
*/
@ExcelProperty(value = "状态")
@ExcelProperty(value = "状态(0创建工单,1已派单2已抢单3处理中,4已完成,5已评价)")
private String status;
/**
@@ -75,7 +75,10 @@ public class ServiceWorkOrdersVo implements Serializable {
*/
@ExcelProperty(value = "派单时间")
private Date dispatchTime;
/**
* 运作模式(0派单+抢单,1派单,2自动派单)
*/
private String operationMode;
/**
* 发起人
*/

View File

@@ -20,5 +20,5 @@ public interface TbRoomMapper extends BaseMapperPlus<TbRoom, TbRoomVo> {
//查询房间名称
String queryRoomName(Long roomId);
Map<Long,String> queryRoomNameList(@Param("ids") List<Long> ids);
List<String> queryRoomNameList(@Param("ids") List<Long> ids);
}

View File

@@ -9,6 +9,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 房间信息Service接口
@@ -76,5 +77,11 @@ public interface ITbRoomService {
* @return 房间名称
*/
String queryRoomName(Long roomId);
/**
* 获取详细房间名称
* @param ids 房间id集合
* @return 房间名称
*/
List<String> queryRoomNameList(List<Long> ids);
}

View File

@@ -73,7 +73,7 @@ public class AssetTypeServiceImpl implements IAssetTypeService {
private LambdaQueryWrapper<AssetType> buildQueryWrapper(AssetTypeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<AssetType> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(AssetType::getId);
lqw.orderByAsc(AssetType::getSort);
lqw.like(StringUtils.isNotBlank(bo.getAssetTypeName()), AssetType::getAssetTypeName, bo.getAssetTypeName());
lqw.eq(bo.getSort() != null, AssetType::getSort, bo.getSort());
return lqw;

View File

@@ -82,6 +82,7 @@ public class CostCarChargeServiceImpl implements ICostCarChargeService {
// List<Long> residentPersonIdList = result.getRecords().stream().map(vo -> vo.getPersonId()).distinct().collect(Collectors.toList());
// List<RemoteUserVo> remoteUserVos = remoteUserService.selectListByIds(residentPersonIdList);
List<ResidentPerson> residentPeoplelist = residentPersonMapper.selectList();
List<String> roomNames = roomService.queryRoomNameList(idList);
result.getRecords().stream().forEach(s -> {
if (CollUtil.isNotEmpty(residentPeoplelist)) {
ResidentPerson residentPerson = residentPeoplelist.stream()

View File

@@ -55,6 +55,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
private final ResidentPersonMapper residentPersonMapper;
@DubboReference
private RemoteUserService remoteUserService;
/**
* 查询房屋收费
*
@@ -66,12 +67,14 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
CostHouseChargeVo costHouseChargeVo = baseMapper.selectVoById(id);
CostHouseChargeDetailVo costHouseChargeDetailVo = BeanUtil.copyProperties(costHouseChargeVo, CostHouseChargeDetailVo.class);
CostItemsVo costItemsVo = costItemsMapper.selectVoById(costHouseChargeDetailVo.getCostItemsId());
costHouseChargeDetailVo.setCostItemsVo(ObjectUtil.isNotEmpty(costItemsVo)?costItemsVo:null);
costHouseChargeDetailVo.setCostItemsVo(ObjectUtil.isNotEmpty(costItemsVo) ? costItemsVo : null);
TbRoomVo tbRoomVo = tbRoomMapper.selectVoById(costHouseChargeDetailVo.getRoomId());
costHouseChargeDetailVo.setRoomVo(ObjectUtil.isNotEmpty(tbRoomVo)?tbRoomVo:null);
ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(costHouseChargeVo.getPersonId());
costHouseChargeDetailVo.setRoomVo(ObjectUtil.isNotEmpty(tbRoomVo) ? tbRoomVo : null);
ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(costHouseChargeVo.getPersonId());
//RemoteUserVo userInfo = remoteUserService.getUserInfoById(costHouseChargeVo.getPersonId());
costHouseChargeDetailVo.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo)?residentPersonVo.getUserName():null);
String roomName = tbRoomMapper.queryRoomName(costHouseChargeDetailVo.getRoomId());
costHouseChargeDetailVo.setRoomName(StringUtils.isNotBlank(roomName) ? roomName : null);
costHouseChargeDetailVo.setPersonName(ObjectUtil.isNotEmpty(residentPersonVo) ? residentPersonVo.getUserName() : null);
return costHouseChargeDetailVo;
}
@@ -91,7 +94,9 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
if (CollUtil.isNotEmpty(residentPeoplelist)) {
ResidentPerson residentPerson = residentPeoplelist.stream()
.filter(vo -> vo.getId() != null && vo.getId().equals(s.getPersonId())).findFirst().orElse(null);
s.setPersonName(ObjectUtil.isNotEmpty(residentPerson)?residentPerson.getUserName():null);
s.setPersonName(ObjectUtil.isNotEmpty(residentPerson) ? residentPerson.getUserName() : null);
String roomName = tbRoomMapper.queryRoomName(s.getRoomId());
s.setRoomName(StringUtils.isNotBlank(roomName) ? roomName : null);
}
});
return TableDataInfo.build(result);
@@ -181,7 +186,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
@Transactional(rollbackFor = Exception.class)
public Boolean returnFree(CostChargeReturnFeeBo bo) {
CostHouseChargeVo costHouseChargeVo = baseMapper.selectVoById(bo.getId());
Assert.isTrue(ObjectUtil.isNotEmpty(costHouseChargeVo),"该费用不存在");
Assert.isTrue(ObjectUtil.isNotEmpty(costHouseChargeVo), "该费用不存在");
var CostReturnPayFee = new CostReturnPayFee().setItemId(costHouseChargeVo.getCostItemsId())
.setReturnNo(RandomUtil.randomNumbers(11))
.setReason(bo.getReason())
@@ -189,8 +194,7 @@ public class CostHouseChargeServiceImpl implements ICostHouseChargeService {
.setUserId(costHouseChargeVo.getPersonId())
.setPayNo(costHouseChargeVo.getId().toString())
.setPayAcount(costHouseChargeVo.getAmountReceivable())
.setState("0")
;
.setState("0");
boolean flag = costReturnPayFeeMapper.insert(CostReturnPayFee) > 0;
CostHouseCharge costHouseCharge = BeanUtil.copyProperties(costHouseChargeVo, CostHouseCharge.class);
costHouseCharge.setChargeStatus(ChargeStatusEnum.REFUND_PENDING_REVIEW.getValue());

View File

@@ -1,6 +1,8 @@
package org.dromara.property.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -10,6 +12,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.property.domain.vo.CostMeterTypeVo;
import org.dromara.property.mapper.CostMeterTypeMapper;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.CostMeterWaterBo;
import org.dromara.property.domain.vo.CostMeterWaterVo;
@@ -35,6 +39,7 @@ import java.util.Collection;
public class CostMeterWaterServiceImpl implements ICostMeterWaterService {
private final CostMeterWaterMapper baseMapper;
private final CostMeterTypeMapper costMeterTypeMapper;
/**
* 查询费用-水电抄
@@ -58,6 +63,16 @@ public class CostMeterWaterServiceImpl implements ICostMeterWaterService {
public TableDataInfo<CostMeterWaterVo> queryPageList(CostMeterWaterBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<CostMeterWater> lqw = buildQueryWrapper(bo);
Page<CostMeterWaterVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
if (CollUtil.isNotEmpty(result.getRecords())){
//收集抄表类型id
List<Long> meterTypeIds = result.getRecords().stream().map(CostMeterWaterVo::getMeterTypeId).toList();
List<CostMeterTypeVo> costMeterTypeVos = costMeterTypeMapper.selectVoByIds(meterTypeIds);
result.getRecords().stream().forEach(s -> {
//查找抄表类型名称
CostMeterTypeVo costMeterTypeVo = costMeterTypeVos.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getMeterTypeId())).findFirst().orElse(null);
s.setCostTypeName(ObjectUtil.isNotEmpty(costMeterTypeVo)?costMeterTypeVo.getName():null);
});
}
return TableDataInfo.build(result);
}
@@ -79,6 +94,7 @@ public class CostMeterWaterServiceImpl implements ICostMeterWaterService {
lqw.orderByAsc(CostMeterWater::getId);
lqw.eq(bo.getItemId() != null, CostMeterWater::getItemId, bo.getItemId());
lqw.eq(bo.getMeterTypeId() != null, CostMeterWater::getMeterTypeId, bo.getMeterTypeId());
lqw.eq(StringUtils.isNotBlank(bo.getCostType()), CostMeterWater::getCostType, bo.getCostType());
lqw.like(StringUtils.isNotBlank(bo.getObjName()), CostMeterWater::getObjName, bo.getObjName());
lqw.eq(StringUtils.isNotBlank(bo.getCurDegrees()), CostMeterWater::getCurDegrees, bo.getCurDegrees());
lqw.eq(StringUtils.isNotBlank(bo.getPreDegrees()), CostMeterWater::getPreDegrees, bo.getPreDegrees());

View File

@@ -92,7 +92,7 @@ public class CostPayFeeAuditServiceImpl implements ICostPayFeeAuditService {
}
if (CollUtil.isNotEmpty(roomVoList)) {
TbRoomVo tbRoomVo = roomVoList.stream()
.filter(vo -> vo.getId() != null && vo.getId().equals(s.getChargeId())).findFirst().orElse(null);
.filter(vo -> vo.getId() != null && vo.getId().equals(s.getRoomNumber())).findFirst().orElse(null);
s.setRoomNumber(ObjectUtil.isNotEmpty(tbRoomVo) ? tbRoomVo.getRoomNumber() : null);
}
costPayFeeAuditVoList.add(s);

View File

@@ -63,16 +63,16 @@ public class MeetServiceImpl implements IMeetService {
@Override
public MeetVo queryById(Long id) {
MeetVo meetVo = baseMapper.selectVoById(id);
ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(meetVo.getPrincipals());
if(ObjectUtil.isNotEmpty(residentPersonVo)){
meetVo.setPrincipalsName(residentPersonVo.getUserName());
meetVo.setPhoneNo(residentPersonVo.getPhone());
}
// RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(meetVo.getPrincipals()));
// if (ObjectUtil.isNotEmpty(userInfo)) {
// meetVo.setPrincipalsName(userInfo.getNickName());
// meetVo.setPhoneNo(userInfo.getPhonenumber());
// ResidentPersonVo residentPersonVo = residentPersonMapper.selectVoById(meetVo.getPrincipals());
// if(ObjectUtil.isNotEmpty(residentPersonVo)){
// meetVo.setPrincipalsName(residentPersonVo.getUserName());
// meetVo.setPhoneNo(residentPersonVo.getPhone());
// }
RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(meetVo.getPrincipals()));
if (ObjectUtil.isNotEmpty(userInfo)) {
meetVo.setPrincipalsName(userInfo.getNickName());
meetVo.setPhoneNo(userInfo.getPhonenumber());
}
String locationName = roomMapper.queryRoomName(Long.valueOf(meetVo.getLocation()));
meetVo.setLocationName(locationName);
return meetVo;
@@ -172,7 +172,7 @@ public class MeetServiceImpl implements IMeetService {
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(MeetBo bo) {
Meet add = MapstructUtils.convert(bo, Meet.class);
bo.setStatus(1);
bo.setStatus(0);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {

View File

@@ -1,5 +1,6 @@
package org.dromara.property.service.impl;
import cn.hutool.core.collection.CollUtil;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -18,9 +19,11 @@ import org.dromara.property.domain.ResidentUnit;
import org.dromara.property.mapper.ResidentUnitMapper;
import org.dromara.property.service.IResidentUnitService;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* 入驻单位Service业务层处理
@@ -50,8 +53,18 @@ public class ResidentUnitServiceImpl implements IResidentUnitService {
ResidentUnitVo residentUnitVo = baseMapper.selectVoById(id);
//获取入驻位置详情
if(StringUtils.isNotBlank(residentUnitVo.getLocation())){
String roomName = roomService.queryRoomName(Long.valueOf(residentUnitVo.getLocation()));
residentUnitVo.setLocationDetail(roomName);
// 修改后的代码
List<Long> idList = Arrays.stream(residentUnitVo.getLocation().split(","))
.map(String::trim)
.map(Long::parseLong)
.collect(Collectors.toList());
List<String> roomNames = roomService.queryRoomNameList(idList);
// 元素用,拼接成字符串
if(CollUtil.isNotEmpty(roomNames)){
String locationDetail = String.join("", roomNames);
residentUnitVo.setLocationDetail(locationDetail);
}
}
Long num = personService.queryPersonCount(residentUnitVo.getId());
residentUnitVo.setNumber(num);

View File

@@ -2,6 +2,7 @@ package org.dromara.property.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -16,15 +17,20 @@ import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.property.domain.*;
import org.dromara.property.domain.bo.ServiceWorkOrdersBo;
import org.dromara.property.domain.bo.mobile.MServiceWorkOrdersBo;
import org.dromara.property.domain.enums.OrderReportingTypeEnum;
import org.dromara.property.domain.enums.OrderTypeOperationEnum;
import org.dromara.property.domain.enums.WorkOrderStatusEnum;
import org.dromara.property.domain.vo.*;
import org.dromara.property.mapper.ResidentPersonMapper;
import org.dromara.property.mapper.ServiceWorkOrdersMapper;
import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper;
import org.dromara.property.mapper.ServiceWorkOrdersTypeMapper;
import org.dromara.property.mapper.attendanceMapper.AttendanceUserGroupMapper;
import org.dromara.property.service.IServiceWorkOrdersService;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteUserVo;
@@ -54,6 +60,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
private final ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
@DubboReference
private RemoteUserService remoteUserService;
private final AttendanceUserGroupMapper attendanceUserGroupMapper;
/**
* 查询【工单处理】
@@ -71,10 +78,12 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = typesMapper.selectVoById(serviceWorkOrdersVo.getType());
if (Objects.nonNull(serviceWorkOrdersTypeVo)) {
serviceWorkOrdersInfoVo.setTypeName(serviceWorkOrdersTypeVo.getOrderTypeName());
serviceWorkOrdersInfoVo.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null);
}
//ResidentPersonVo residentPersonHandler = residentPersonMapper.selectVoById(Long.valueOf(serviceWorkOrdersVo.getHandler()));
RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(serviceWorkOrdersVo.getHandler()));
RemoteUserVo userInfo = remoteUserService.getUserInfoById(Long.valueOf(serviceWorkOrdersVo.getHandler()));
if (ObjectUtil.isNotEmpty(userInfo)) {
serviceWorkOrdersInfoVo.setHandlerText(userInfo.getNickName());
serviceWorkOrdersInfoVo.setHandlerPhone(userInfo.getPhonenumber());
@@ -89,7 +98,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
serviceWorkOrdersRecordInfoVos.stream().forEach(workOrdersRecordVo -> {
RemoteUserVo remoteUserVo = remoteUserVos.stream().filter(vo -> vo.getUserId() != null && vo.getUserId().equals(serviceWorkOrdersVo.getHandler())).findFirst().orElse(null);
workOrdersRecordVo.setHandlerName(Objects.nonNull(remoteUserVo) ? remoteUserVo.getNickName() : null);
workOrdersRecordVo.setInitiatorPeople(Objects.nonNull(serviceWorkOrdersTypeVo)?serviceWorkOrdersVo.getInitiatorPeople():null);
workOrdersRecordVo.setInitiatorPeople(Objects.nonNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersVo.getInitiatorPeople() : null);
if (workOrdersRecordVo.getStatus().equals("1") || workOrdersRecordVo.getStatus().equals("2")) {
serviceWorkOrdersInfoVo.setDispatchTime(workOrdersRecordVo.getCreateTime());
}
@@ -123,6 +132,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null);
s.setTypeName(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOrderTypeName() : null);
s.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null);
serviceWorkOrdersVoList.add(s);
});
return TableDataInfo.build(new Page<ServiceWorkOrdersVo>().setRecords(serviceWorkOrdersVoList).setTotal(result.getTotal()));
@@ -151,6 +161,7 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
ServiceWorkOrdersTypeVo serviceWorkOrdersTypeVo = serviceWorkOrdersTypeVoList.stream().filter(vo -> vo.getId() != null && vo.getId().equals(s.getType())).findFirst().orElse(null);
s.setTypeName(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOrderTypeName() : null);
s.setOperationMode(ObjectUtil.isNotNull(serviceWorkOrdersTypeVo) ? serviceWorkOrdersTypeVo.getOperationMode() : null);
serviceWorkOrdersVoList.add(s);
});
return serviceWorkOrdersVoList;
@@ -159,15 +170,15 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
private LambdaQueryWrapper<ServiceWorkOrders> buildQueryWrapper(ServiceWorkOrdersBo bo) {
//查询类型下子类型id
LambdaQueryWrapper<ServiceWorkOrdersType> OrdersTypeWrapper = new LambdaQueryWrapper<>();
OrdersTypeWrapper.eq(ServiceWorkOrdersType::getParentId,bo.getType());
OrdersTypeWrapper.eq(ServiceWorkOrdersType::getParentId, bo.getType());
List<ServiceWorkOrdersType> serviceWorkOrdersTypes = typesMapper.selectList(OrdersTypeWrapper);
List<Long> typeIds = serviceWorkOrdersTypes.stream()
.map(ServiceWorkOrdersType::getId)
.collect(Collectors.toList());
typeIds.add(bo.getType());
List<String> statusList = new ArrayList<>();
if(StringUtils.isNotBlank(bo.getStatus())){
statusList = Arrays.asList(bo.getStatus().split(","));
if (StringUtils.isNotBlank(bo.getStatus())) {
statusList = Arrays.asList(bo.getStatus().split(","));
}
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ServiceWorkOrders> lqw = Wrappers.lambdaQuery();
@@ -197,11 +208,14 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(ServiceWorkOrdersBo bo) {
//查询工单类型
ServiceWorkOrdersType serviceWorkOrdersType = typesMapper.selectById(bo.getType());
ServiceWorkOrders add = MapstructUtils.convert(bo, ServiceWorkOrders.class);
LoginUser user = LoginHelper.getLoginUser();
add.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr());
add.setStatus("0");
add.setStatus(WorkOrderStatusEnum.CREATE_ORDER.getValue());
add.setInitiatorPeople(user.getNickname());
add.setProcessingWeight(serviceWorkOrdersType.getProcessingWeight());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
@@ -210,11 +224,67 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
serviceWorkOrdersRecord.setOrderId(add.getId());
serviceWorkOrdersRecord.setStatus(add.getStatus());
//serviceWorkOrdersRecord.setHandler(add.getHandler());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
boolean flags = workOrdersRecordMapper.insert(serviceWorkOrdersRecord) > 0;
if (flags) {
if (serviceWorkOrdersType.getOperationMode().equals(OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())) {
handleServiceWorkOrder(add);
}
}
}
return flag;
}
//自动派单
private void handleServiceWorkOrder(ServiceWorkOrders serviceWorkOrders) {
LocalDate today = LocalDate.now();
// 1. 获取今日排班人员(优先查缓存,未命中则查询数据库并缓存)
List<AttendanceUserGroup> attendanceUserGroups = RedisUtils.getCacheList(DateUtil.today());
if (CollUtil.isEmpty(attendanceUserGroups)) {
attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
.le(AttendanceUserGroup::getStartDate, today)
.ge(AttendanceUserGroup::getEndDate, today)
.orderByAsc(AttendanceUserGroup::getCreateTime)
);
Assert.isTrue(CollUtil.isNotEmpty(attendanceUserGroups),"暂无排班人员");
// 缓存当天排班数据(假设当天不会变)
RedisUtils.setCacheList(DateUtil.today(), attendanceUserGroups);
}
// 2. 获取并更新轮询索引(原子性很重要)
int currentIndex;
Integer lastScheduleId = RedisUtils.getCacheObject(DateUtil.today()+"LastScheduleId");
if (lastScheduleId == null || lastScheduleId < 0 || lastScheduleId >= attendanceUserGroups.size()) {
currentIndex = 0; // 越界或未设置重置为0
} else {
currentIndex = lastScheduleId + 1;
if (currentIndex >= attendanceUserGroups.size()) {
currentIndex = 0; // 循环轮询
}
}
RedisUtils.setCacheObject(DateUtil.today()+"LastScheduleId", currentIndex);
// 3. 分配处理人
AttendanceUserGroup assignedGroup = attendanceUserGroups.get(currentIndex);
Long employeeId = assignedGroup.getEmployeeId();
serviceWorkOrders.setHandler(employeeId);
serviceWorkOrders.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
// 4. 插入记录
ServiceWorkOrdersRecord record = new ServiceWorkOrdersRecord();
record.setOrderId(serviceWorkOrders.getId());
record.setHandler(employeeId);
record.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
workOrdersRecordMapper.insert(record);
// 5. 更新工单
serviceWorkOrders.setDispatchTime(new Date());
baseMapper.updateById(serviceWorkOrders);
log.info("成功派单,工单号:{}", serviceWorkOrders.getOrderNo());
}
/**
* 修改【工单处理】
*
@@ -242,17 +312,17 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
* 修改前的数据校验
*/
private void validEntityBeforeUpdate(ServiceWorkOrders entity) {
Assert.isTrue(ObjectUtil.isNotEmpty(entity.getStatus()),"状态不能为空!");
Assert.isTrue(ObjectUtil.isNotEmpty(entity.getStatus()), "状态不能为空!");
LambdaQueryWrapper<ServiceWorkOrdersRecord> ordersLambdaQueryWrapper = new LambdaQueryWrapper<>();
ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getOrderId, entity.getId());
ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getStatus, entity.getStatus());
boolean exists = workOrdersRecordMapper.exists(ordersLambdaQueryWrapper);
//TODO 做一些数据校验,如唯一约束
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
serviceWorkOrdersRecord.setOrderId(entity.getId());
serviceWorkOrdersRecord.setStatus(entity.getStatus());
serviceWorkOrdersRecord.setHandler(entity.getHandler());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
serviceWorkOrdersRecord.setOrderId(entity.getId());
serviceWorkOrdersRecord.setStatus(entity.getStatus());
serviceWorkOrdersRecord.setHandler(entity.getHandler());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
}
/**
@@ -497,16 +567,17 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
}
//小程序端新增
@Override
public Boolean insertMServiceWorkOrdersBo(MServiceWorkOrdersBo bo) {
//查询工单类型
ServiceWorkOrdersType serviceWorkOrdersType = typesMapper.selectById(bo.getType());
ServiceWorkOrders add = MapstructUtils.convert(bo, ServiceWorkOrders.class);
LoginUser user = LoginHelper.getLoginUser();
add.setOrderNo("GD" + IdUtil.getSnowflakeNextIdStr());
add.setOrderName("工单名称");
add.setStatus("0");
add.setStatus(WorkOrderStatusEnum.CREATE_ORDER.getValue());
add.setReportingType(OrderReportingTypeEnum.PHONE_REPORT.getValue());
add.setInitiatorPeople(user.getNickname());
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
@@ -515,15 +586,22 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService {
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
serviceWorkOrdersRecord.setOrderId(add.getId());
serviceWorkOrdersRecord.setStatus(add.getStatus());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
boolean flags = workOrdersRecordMapper.insert(serviceWorkOrdersRecord) > 0;
if (flags) {
if (serviceWorkOrdersType.getOperationMode().equals(OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())) {
handleServiceWorkOrder(add);
}
}
}
return flag;
}
public List<ServiceWorkOrders> getList() {
LambdaQueryWrapper<ServiceWorkOrders> serviceWorkOrdersWrapper = new LambdaQueryWrapper<>();
return baseMapper.selectList(serviceWorkOrdersWrapper);
}
@Override
public List<Map<Object, Object>> getServiceWorkOrdersHandler(String type) {
return switch (type) {

View File

@@ -158,5 +158,13 @@ public class TbRoomServiceImpl implements ITbRoomService {
@Override
public String queryRoomName(Long roomId) {
return baseMapper.queryRoomName(roomId);
} /**
* 获取房间名称
* @param
* @return 房间名称
*/
@Override
public List<String> queryRoomNameList(List<Long> ids) {
return baseMapper.queryRoomNameList(ids);
}
}

View File

@@ -9,10 +9,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.redis.utils.RedisUtils;
import org.dromara.property.domain.AttendanceUserGroup;
import org.dromara.property.domain.ServiceWorkOrders;
import org.dromara.property.domain.ServiceWorkOrdersRecord;
import org.dromara.property.domain.ServiceWorkOrdersType;
import org.dromara.property.domain.enums.OrderTypeOperationEnum;
import org.dromara.property.domain.enums.WorkOrderStatusEnum;
import org.dromara.property.mapper.ServiceWorkOrdersTypeMapper;
import org.dromara.property.mapper.attendanceMapper.AttendanceUserGroupMapper;
import org.dromara.property.mapper.ServiceWorkOrdersMapper;
import org.dromara.property.mapper.ServiceWorkOrdersRecordMapper;
@@ -40,48 +44,81 @@ import org.springframework.web.bind.annotation.RestController;
//@RestController
//@RequestMapping("/serviceWorkOrderTasks")
public class ServiceWorkOrderTasks {
private ServiceWorkOrdersMapper workOrdersMapper;
private ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
private AttendanceUserGroupMapper attendanceUserGroupMapper;
private final ServiceWorkOrdersMapper workOrdersMapper;
private final ServiceWorkOrdersTypeMapper workOrdersTypeMapper;
private final ServiceWorkOrdersRecordMapper workOrdersRecordMapper;
private final AttendanceUserGroupMapper attendanceUserGroupMapper;
/**
* 查询状态为创建工单的工单,查询当天排班人员,为工单自动派单
*/
@Transactional(rollbackFor = Exception.class)
@Scheduled(cron = "0 0 */1 * * ?")
@Scheduled(cron = "0 0,30 * * * ?")
//@GetMapping("/serviceWorkOrderTaskId")
private void handleServiceWorkOrder() {
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrders>()
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue()));
if(CollUtil.isNotEmpty(serviceWorkOrderList)){
LocalDate today = LocalDate.now();
List<AttendanceUserGroup> attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
//查询今天上班的人员
.le(AttendanceUserGroup::getStartDate, today)
.ge(AttendanceUserGroup::getEndDate, today)
LocalDate today = LocalDate.now();
List<AttendanceUserGroup> attendanceUserGroups = attendanceUserGroupMapper.selectList(
new LambdaQueryWrapper<AttendanceUserGroup>()
//查询今天上班的人员
.le(AttendanceUserGroup::getStartDate, today)
.ge(AttendanceUserGroup::getEndDate, today)
);
if (CollUtil.isEmpty(attendanceUserGroups)) {
if (!RedisUtils.isExistsObject("today")) {
//缓存今天排班人员
RedisUtils.setCacheList("today", attendanceUserGroups);
}
//查询工单类型
List<ServiceWorkOrdersType> serviceWorkOrdersTypes = workOrdersTypeMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrdersType>()
.eq(ServiceWorkOrdersType::getOperationMode, OrderTypeOperationEnum.AUTOMATE_DISPATCH.getValue())
);
serviceWorkOrderList.stream().forEach(s->{
if(CollUtil.isNotEmpty(attendanceUserGroups)){
attendanceUserGroups.stream().forEach(s1->{
if (CollUtil.isEmpty(serviceWorkOrdersTypes)) {
//收集工单类型id
List<Long> typeIds = serviceWorkOrdersTypes.stream().map(ServiceWorkOrdersType::getId).toList();
List<ServiceWorkOrders> serviceWorkOrderList = workOrdersMapper.selectList(
new LambdaQueryWrapper<ServiceWorkOrders>()
.eq(ServiceWorkOrders::getStatus, WorkOrderStatusEnum.CREATE_ORDER.getValue())
.in(ServiceWorkOrders::getType, typeIds)
);
if (CollUtil.isNotEmpty(serviceWorkOrderList)) {
serviceWorkOrderList.stream().forEach(s -> {
//获取处理人
List<AttendanceUserGroup> attendanceUserGroupList = RedisUtils.getCacheList("today");
ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord();
//获取上次排班人员序号
if (!RedisUtils.isExistsObject("LastScheduleId")) {
RedisUtils.setCacheObject("LastScheduleId", 0);
serviceWorkOrdersRecord.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
s.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
} else {
Integer lastScheduleId = RedisUtils.getCacheObject("LastScheduleId");
int lastScheduleIdUpdate = lastScheduleId + 1;
AttendanceUserGroup attendanceUserGroup = attendanceUserGroupList.get(lastScheduleIdUpdate);
if (ObjectUtil.isNotEmpty(attendanceUserGroup)) {
serviceWorkOrdersRecord.setHandler(attendanceUserGroup.getEmployeeId());
s.setHandler(attendanceUserGroup.getEmployeeId());
RedisUtils.setCacheObject("LastScheduleId", lastScheduleIdUpdate);
} else {
serviceWorkOrdersRecord.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
s.setHandler(attendanceUserGroupList.get(0).getEmployeeId());
RedisUtils.setCacheObject("LastScheduleId", 0);
}
}
serviceWorkOrdersRecord.setOrderId(s.getId());
serviceWorkOrdersRecord.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
serviceWorkOrdersRecord.setHandler(s1.getEmployeeId());
workOrdersRecordMapper.insert(serviceWorkOrdersRecord);
s.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue());
s.setHandler(s1.getEmployeeId());
workOrdersMapper.updateById(s);
log.info("派单工单号为:{}",s.getOrderNo());
log.info("处理人为:{}",s1.getEmployeeId());
log.info("派单工单号为:{}", s.getOrderNo());
});
}else {
log.info("当天无排班人员");
} else {
log.info("派单工单为:{}", serviceWorkOrderList.size());
}
});
}else {
log.info("派单工单为:{}",serviceWorkOrderList.size());
}
}
}
@@ -134,10 +171,10 @@ public class ServiceWorkOrderTasks {
for (AttendanceUserGroup group : attendanceUserGroups) {
Long employeeId = group.getEmployeeId();
// 可选:避免重新派给原处理人
if (employeeId.equals(latestRecord.getHandler())) {
log.debug("跳过原处理人:{}", employeeId);
continue;
}
if (employeeId.equals(latestRecord.getHandler())) {
log.debug("跳过原处理人:{}", employeeId);
continue;
}
// 创建新的派单记录
ServiceWorkOrdersRecord newRecord = new ServiceWorkOrdersRecord();
newRecord.setOrderId(workOrder.getId());
@@ -147,9 +184,9 @@ public class ServiceWorkOrderTasks {
workOrdersRecordMapper.insert(newRecord);
log.info("工单号:{} 已重新派发给员工ID{}", workOrder.getOrderNo(), employeeId);
// 6. 更新主工单状态(可选:若只保留最新记录状态,也可不更新主表)
workOrder.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue()); // 仍为已派单
workOrder.setHandler(employeeId); // 可清空,或设为最后一个人(根据业务)
workOrdersMapper.updateById(workOrder);
workOrder.setStatus(WorkOrderStatusEnum.DISPATCHED.getValue()); // 仍为已派单
workOrder.setHandler(employeeId); // 可清空,或设为最后一个人(根据业务)
workOrdersMapper.updateById(workOrder);
}
});
}

View File

@@ -15,9 +15,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where r.id=#{roomId}
</select>
<select id="queryRoomNameList" parameterType="list" resultType="java.util.Map">
<select id="queryRoomNameList" resultType="java.lang.String" parameterType="list">
SELECT
r.id,
concat(c.community_name, b.building_name, f.floor_name, r.room_number) AS room_name
FROM
tb_room r