Browse Source

虚拟车位

guoshuai 1 month ago
parent
commit
415c9e31d9

+ 107 - 0
src/main/java/com/qmrb/system/controller/VirtualParkingSlotController.java

@@ -0,0 +1,107 @@
+package com.qmrb.system.controller;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.common.result.PageResult;
+import com.qmrb.system.common.result.Result;
+import com.qmrb.system.common.result.ResultCode;
+import com.qmrb.system.framework.resubmit.Resubmit;
+import com.qmrb.system.service.IVirtualParkingSlotService;
+import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
+import com.qmrb.system.pojo.vo.VirtualParkingSlotVO;
+import com.qmrb.system.pojo.query.VirtualParkingSlotQuery;
+import com.qmrb.system.pojo.vo.Option;
+
+import cn.hutool.core.util.StrUtil;
+import org.springframework.web.bind.annotation.RestController;
+import jakarta.validation.Valid;
+
+/**
+ * <p>
+ * 虚拟车位表 前端控制器
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Tag(name = "虚拟车位表接口")
+@RestController
+@RequestMapping("/api/v1/parking_slot")
+@CrossOrigin
+public class VirtualParkingSlotController{
+
+    @Autowired
+    private IVirtualParkingSlotService virtualParkingSlotService;
+
+	@Operation(summary = "虚拟车位表分页列表", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/page")
+    public PageResult<VirtualParkingSlotVO> getPage(
+            @ParameterObject VirtualParkingSlotQuery queryParams
+    ) {
+        Page<VirtualParkingSlotVO> result = virtualParkingSlotService.getPage(queryParams);
+        return PageResult.success(result);
+    }
+    
+    @Operation(summary = "新增虚拟车位表", security = {@SecurityRequirement(name = "Authorization")})
+    @PostMapping
+    @Resubmit
+    public Result<VirtualParkingSlotForm> saveForm(
+            @RequestBody @Valid VirtualParkingSlotForm form
+    ) {
+        VirtualParkingSlotForm result = virtualParkingSlotService.saveForm(form);
+        return Result.success(result);
+    }
+
+    @Operation(summary = "虚拟车位表表单数据", security = {@SecurityRequirement(name = "Authorization")})
+    @GetMapping("/{id}/form")
+    public Result<VirtualParkingSlotForm> getForm(
+            @Parameter(description = "虚拟车位表ID") @PathVariable Long id
+    ) {
+    	VirtualParkingSlotForm formData = virtualParkingSlotService.getFormData(id);
+        return Result.success(formData);
+    }
+
+    @Operation(summary = "修改虚拟车位表", security = {@SecurityRequirement(name = "Authorization")})
+    @PutMapping(value = "/{id}")
+    public Result<?> updateForm(
+            @Parameter(description = "虚拟车位表ID") @PathVariable Long id,
+            @RequestBody @Validated VirtualParkingSlotForm form) {
+    	
+        boolean result = virtualParkingSlotService.updateForm(id,form);
+        return Result.judge(result);
+    }
+
+    @Operation(summary = "删除虚拟车位表", security = {@SecurityRequirement(name = "Authorization")})
+    @DeleteMapping("/{ids}")
+    public Result<?> deleteUsers(
+            @Parameter(description = "虚拟车位表ID,多个以英文逗号(,)分割") @PathVariable String ids
+    ) {
+    	if(StrUtil.isBlank(ids)) {
+    		 return Result.failed(ResultCode.PARAM_ERROR, "删除的虚拟车位表数据为空");
+    	}
+        // 逻辑删除
+        List<Long> idList = Arrays.asList(ids.split(",")).stream()
+                .map(idStr -> Long.parseLong(idStr)).collect(Collectors.toList());
+        boolean result = virtualParkingSlotService.removeByIds(idList);
+        return Result.judge(result);
+    }
+}

+ 29 - 0
src/main/java/com/qmrb/system/converter/VirtualParkingSlotConverter.java

@@ -0,0 +1,29 @@
+package com.qmrb.system.converter;
+
+import org.mapstruct.InheritInverseConfiguration;
+import org.mapstruct.Mapper;
+import org.mapstruct.ReportingPolicy;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.pojo.entity.VirtualParkingSlot;
+import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
+import com.qmrb.system.pojo.vo.VirtualParkingSlotVO;
+
+/**
+ * 虚拟车位表数据项对象转换器
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
+public interface VirtualParkingSlotConverter {
+
+    Page<VirtualParkingSlotVO> entity2Page(Page<VirtualParkingSlot> page);
+
+    VirtualParkingSlotForm entity2Form(VirtualParkingSlot entity);
+
+    @InheritInverseConfiguration(name="entity2Form")
+    VirtualParkingSlot form2Entity(VirtualParkingSlotForm form);
+    
+    VirtualParkingSlotVO entity2Vo(VirtualParkingSlot entity);
+}

+ 18 - 0
src/main/java/com/qmrb/system/mapper/VirtualParkingSlotMapper.java

@@ -0,0 +1,18 @@
+package com.qmrb.system.mapper;
+
+import com.qmrb.system.pojo.entity.VirtualParkingSlot;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 虚拟车位表 Mapper 接口
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Mapper
+public interface VirtualParkingSlotMapper extends BaseMapper<VirtualParkingSlot> {
+
+}

+ 88 - 0
src/main/java/com/qmrb/system/pojo/entity/VirtualParkingSlot.java

@@ -0,0 +1,88 @@
+package com.qmrb.system.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.qmrb.system.common.base.BaseEntity;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 虚拟车位表
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("virtual_parking_slot")
+public class VirtualParkingSlot extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 虚拟车位编号(如A1)
+     */
+    @TableField("virtual_slot_number")
+    private String virtualSlotNumber;
+
+    /**
+     * 车位类型
+     */
+    @TableField("slot_type")
+    private String slotType;
+
+    /**
+     * 所属区域
+     */
+    @TableField("zone")
+    private String zone;
+
+    /**
+     * 状态 0:空闲,1:占用,2:停用
+     */
+    @TableField("status")
+    private String status;
+
+    /**
+     * 当前停放车牌
+     */
+    @TableField("current_plate_number")
+    private String currentPlateNumber;
+
+    /**
+     * 最近占用开始时间
+     */
+    @TableField("last_occupied_time")
+    private Date lastOccupiedTime;
+
+    /**
+     * 最近释放时间
+     */
+    @TableField("last_released_time")
+    private Date lastReleasedTime;
+
+    /**
+     * 扩展字段
+     */
+    @TableField("extend_field")
+    private String extendField;
+
+    /**
+     * 包租协议ID
+     */
+    @TableField("contract_id")
+    private Long contractId;
+
+
+}

+ 74 - 0
src/main/java/com/qmrb/system/pojo/form/VirtualParkingSlotForm.java

@@ -0,0 +1,74 @@
+package com.qmrb.system.pojo.form;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 虚拟车位表表单
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Data
+public class VirtualParkingSlotForm {
+
+    /**
+     * 主键ID
+     */
+	@Schema(description = "主键ID",type="Long")
+    private Long id;
+    /**
+     * 虚拟车位编号(如A1)
+     */
+	@Schema(description = "虚拟车位编号(如A1)",type="String")
+    private String virtualSlotNumber;
+    /**
+     * 车位类型
+     */
+	@Schema(description = "车位类型",type="String")
+    private String slotType;
+    /**
+     * 所属区域
+     */
+	@Schema(description = "所属区域",type="String")
+    private String zone;
+    /**
+     * 状态
+     */
+	@Schema(description = "状态",type="String")
+    private String status;
+    /**
+     * 当前停放车牌
+     */
+	@Schema(description = "当前停放车牌",type="String")
+    private String currentPlateNumber;
+    /**
+     * 最近占用开始时间
+     */
+	@Schema(description = "最近占用开始时间",type="Date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastOccupiedTime;
+    /**
+     * 最近释放时间
+     */
+	@Schema(description = "最近释放时间",type="Date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastReleasedTime;
+    /**
+     * 扩展字段
+     */
+	@Schema(description = "扩展字段",type="String")
+    private String extendField;
+    /**
+     * 包租协议ID
+     */
+	@Schema(description = "包租协议ID",type="Long")
+    private Long contractId;
+
+
+}

+ 77 - 0
src/main/java/com/qmrb/system/pojo/query/VirtualParkingSlotQuery.java

@@ -0,0 +1,77 @@
+package com.qmrb.system.pojo.query;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.qmrb.system.common.base.BasePageQuery;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 虚拟车位表查询对象
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class VirtualParkingSlotQuery extends BasePageQuery{
+
+ 	@Schema(description="关键字")
+    private String keywords;
+
+    /**
+     * 主键ID
+     */
+	@Schema(description = "主键ID",type="Long")
+    private Long id;
+    /**
+     * 虚拟车位编号(如A1)
+     */
+	@Schema(description = "虚拟车位编号(如A1)",type="String")
+    private String virtualSlotNumber;
+    /**
+     * 车位类型
+     */
+	@Schema(description = "车位类型",type="String")
+    private String slotType;
+    /**
+     * 所属区域
+     */
+	@Schema(description = "所属区域",type="String")
+    private String zone;
+    /**
+     * 状态
+     */
+	@Schema(description = "状态",type="String")
+    private String status;
+    /**
+     * 当前停放车牌
+     */
+	@Schema(description = "当前停放车牌",type="String")
+    private String currentPlateNumber;
+    /**
+     * 最近占用开始时间
+     */
+	@Schema(description = "最近占用开始时间",type="Date")
+    private Date lastOccupiedTime;
+    /**
+     * 最近释放时间
+     */
+	@Schema(description = "最近释放时间",type="Date")
+    private Date lastReleasedTime;
+    /**
+     * 扩展字段
+     */
+	@Schema(description = "扩展字段",type="String")
+    private String extendField;
+    /**
+     * 包租协议ID
+     */
+	@Schema(description = "包租协议ID",type="Long")
+    private Long contractId;
+
+
+}

+ 78 - 0
src/main/java/com/qmrb/system/pojo/vo/VirtualParkingSlotVO.java

@@ -0,0 +1,78 @@
+package com.qmrb.system.pojo.vo;
+
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * <p>
+ * 虚拟车位表视图对象
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Data
+public class VirtualParkingSlotVO {
+
+    /**
+     * 主键ID
+     */
+	@Schema(description = "主键ID",type="Long")
+    private Long id;
+    /**
+     * 虚拟车位编号(如A1)
+     */
+	@Schema(description = "虚拟车位编号(如A1)",type="String")
+    private String virtualSlotNumber;
+    /**
+     * 车位类型
+     */
+	@Schema(description = "车位类型",type="String")
+    private String slotType;
+    /**
+     * 所属区域
+     */
+	@Schema(description = "所属区域",type="String")
+    private String zone;
+    /**
+     * 状态
+     */
+	@Schema(description = "状态",type="String")
+    private String status;
+    /**
+     * 当前停放车牌
+     */
+	@Schema(description = "当前停放车牌",type="String")
+    private String currentPlateNumber;
+    /**
+     * 最近占用开始时间
+     */
+	@Schema(description = "最近占用开始时间",type="Date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastOccupiedTime;
+    /**
+     * 最近释放时间
+     */
+	@Schema(description = "最近释放时间",type="Date")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastReleasedTime;
+    /**
+     * 扩展字段
+     */
+	@Schema(description = "扩展字段",type="String")
+    private String extendField;
+    /**
+     * 包租协议ID
+     */
+	@Schema(description = "包租协议ID",type="Long")
+    private Long contractId;
+
+	@Schema(description = "子分类")
+    private List<VirtualParkingSlotVO> children;
+
+
+}

+ 47 - 0
src/main/java/com/qmrb/system/service/IVirtualParkingSlotService.java

@@ -0,0 +1,47 @@
+package com.qmrb.system.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmrb.system.pojo.entity.Contract;
+import com.qmrb.system.pojo.entity.VirtualParkingSlot;
+import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
+import com.qmrb.system.pojo.vo.VirtualParkingSlotVO;
+import com.qmrb.system.pojo.query.VirtualParkingSlotQuery;
+import com.qmrb.system.pojo.vo.Option;
+import com.baomidou.mybatisplus.extension.service.IService;
+import jakarta.validation.Valid;
+
+/**
+ * <p>
+ * 虚拟车位表 服务类
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+public interface IVirtualParkingSlotService extends IService<VirtualParkingSlot> {
+	
+	/**分页查询
+	 * */
+	public Page<VirtualParkingSlotVO> getPage(VirtualParkingSlotQuery queryParams);
+
+	/**
+	 * 保存表单
+	 * */
+	public VirtualParkingSlotForm saveForm(@Valid VirtualParkingSlotForm form);
+	
+	/**
+	 * 更新包租协议新增虚拟车位
+	 * */
+	public void createFormsByContract(Contract contract);
+	
+	/**更新
+	 * */
+	public boolean updateForm(Long id, VirtualParkingSlotForm form);
+	
+	/**获取表单数据
+	 * */
+	public VirtualParkingSlotForm getFormData(Long id);
+	
+}

+ 12 - 4
src/main/java/com/qmrb/system/service/impl/ContractServiceImpl.java

@@ -18,11 +18,8 @@ import com.qmrb.system.pojo.vo.ContractPlaceNumberRelVO;
 import com.qmrb.system.pojo.vo.ContractVO;
 import com.qmrb.system.pojo.query.ContractQuery;
 import com.qmrb.system.mapper.ContractMapper;
-import com.qmrb.system.service.IContractService;
+import com.qmrb.system.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmrb.system.service.SysRoleService;
-import com.qmrb.system.service.SysUserService;
-import com.qmrb.system.service.UserService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -63,6 +60,10 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
     private SysRoleService roleService;
     @Autowired
     private PasswordEncoder passwordEncoder;
+    
+    
+    @Autowired
+    private IVirtualParkingSlotService virtualParkingSlotService;
 
     @Value("${default_qrcode_login_url}")
     private String defaultQrcodeLoginUrl;
@@ -100,6 +101,8 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         }
         // 持久化
         this.save(entity);
+        // 保存虚拟车位
+        virtualParkingSlotService.createFormsByContract(entity);
         // 创建协议时,创建客商用户
         UserForm user = new UserForm();
         user.setUsername(form.getUsername());
@@ -165,6 +168,11 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract> i
         }
 
         Contract entity = converter.form2Entity(form);
+        // 保存虚拟车位
+        if(form.getMaxParkingLotNum()!= null && contract.getMaxParkingLotNum() != null && !form.getMaxParkingLotNum().equals(contract.getMaxParkingLotNum())){
+            virtualParkingSlotService.createFormsByContract(entity);
+        }
+        
         entity.setId(id);
         boolean result = this.updateById(entity);
         return result;

+ 1 - 1
src/main/java/com/qmrb/system/service/impl/MonthlyParkingRegistrationServiceImpl.java

@@ -48,7 +48,7 @@ public class MonthlyParkingRegistrationServiceImpl extends ServiceImpl<MonthlyPa
         Page<MonthlyParkingRegistration> dictItemPage = this.page(
                 new Page<>(pageNum, pageSize),
                 new LambdaQueryWrapper<MonthlyParkingRegistration>()
-						.eq(StrUtil.isNotBlank(queryParams.getCarType()),MonthlyParkingRegistration::getCarType,queryParams.getCarType())
+						.like(StrUtil.isNotBlank(queryParams.getCarType()),MonthlyParkingRegistration::getCarType,queryParams.getCarType())
 						.eq(queryParams.getRevisitFlag() != null,MonthlyParkingRegistration::getRevisitFlag,queryParams.getRevisitFlag())
 						.orderByDesc(MonthlyParkingRegistration::getCreateTime)
                 	//.like(StrUtil.isNotBlank(keywords), MonthlyParkingRegistration::getCategoryName, keywords)

+ 181 - 0
src/main/java/com/qmrb/system/service/impl/VirtualParkingSlotServiceImpl.java

@@ -0,0 +1,181 @@
+package com.qmrb.system.service.impl;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.qmrb.system.pojo.entity.Contract;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qmrb.system.common.enums.StatusEnum;
+import com.qmrb.system.pojo.vo.Option;
+import com.qmrb.system.converter.VirtualParkingSlotConverter;
+import com.qmrb.system.pojo.entity.VirtualParkingSlot;
+import com.qmrb.system.pojo.form.VirtualParkingSlotForm;
+import com.qmrb.system.pojo.vo.VirtualParkingSlotVO;
+import com.qmrb.system.pojo.query.VirtualParkingSlotQuery;
+import com.qmrb.system.mapper.VirtualParkingSlotMapper;
+import com.qmrb.system.service.IVirtualParkingSlotService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.lang.Assert;
+import jakarta.validation.Valid;
+
+/**
+ * <p>
+ * 虚拟车位表 服务实现类
+ * </p>
+ *
+ * @author gs
+ * @since 2025-04-15
+ */
+@Slf4j
+@Service
+public class VirtualParkingSlotServiceImpl extends ServiceImpl<VirtualParkingSlotMapper, VirtualParkingSlot> implements IVirtualParkingSlotService {
+
+	@Autowired
+	private VirtualParkingSlotConverter converter;
+
+	/**分页查询
+	 * */
+	@Override
+	public Page<VirtualParkingSlotVO> getPage(VirtualParkingSlotQuery queryParams) {
+		// 查询参数
+        int pageNum = queryParams.getPageNum();
+        int pageSize = queryParams.getPageSize();
+        String  status = queryParams.getStatus();
+        //String keywords = queryParams.getKeywords();
+
+        // 查询数据
+        Page<VirtualParkingSlot> dictItemPage = this.page(
+                new Page<>(pageNum, pageSize),
+                new LambdaQueryWrapper<VirtualParkingSlot>()
+                	.eq(StrUtil.isNotBlank(status), VirtualParkingSlot::getStatus,status)
+                	//.like(StrUtil.isNotBlank(keywords), VirtualParkingSlot::getCategoryName, keywords)
+        );
+
+        // 实体转换
+        Page<VirtualParkingSlotVO> pageResult = converter.entity2Page(dictItemPage);
+        return pageResult;
+	}
+
+	/**
+	 * 保存表单
+	 * */
+	@Override
+	public VirtualParkingSlotForm saveForm(@Valid VirtualParkingSlotForm form) {
+		// 实体对象转换 form->entity
+		VirtualParkingSlot entity = converter.form2Entity(form);
+        // 持久化
+        this.save(entity);
+        VirtualParkingSlotForm result = converter.entity2Form(entity);
+        return result;
+	}
+
+	/**
+	 * 更新包租协议新增虚拟车位
+	 * @param contract
+	 * @return
+	 */
+	@Override
+	public void createFormsByContract(Contract contract) {
+		// 1 判断该包租协议是否已创建虚拟车位
+		List<VirtualParkingSlot> list = this.list(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getContractId, contract.getId())
+				.ne(VirtualParkingSlot::getStatus,"2").orderByAsc(VirtualParkingSlot::getId));
+		if(CollectionUtil.isNotEmpty(list)){
+			List<VirtualParkingSlot> allVirtuals = this.list(new LambdaQueryWrapper<VirtualParkingSlot>().eq(VirtualParkingSlot::getContractId, contract.getId()).orderByAsc(VirtualParkingSlot::getId));
+			// 若包租协议得最大车位数小于虚拟车位数,则停用超出部分得虚拟车位
+			if(contract.getMaxParkingLotNum() < list.size()){
+				List<VirtualParkingSlot> outVirtuals = list.subList(contract.getMaxParkingLotNum(), list.size());
+				if(CollectionUtil.isNotEmpty(outVirtuals)){
+					outVirtuals = outVirtuals.stream().map(iter->{
+						iter.setStatus("2");
+						return iter;
+					}).collect(Collectors.toList());
+					log.info("1==============>:{}",outVirtuals.size());
+					// 	todo 如果已停车,是否释放
+					this.updateBatchById(outVirtuals);
+				}
+			}else if(contract.getMaxParkingLotNum()>list.size() && contract.getMaxParkingLotNum() < allVirtuals.size()){
+				ArrayList<VirtualParkingSlot> virtualParkingSlots = new ArrayList<>();
+				// 如果包租协议最大车位数大于启用虚拟车位,但小于总虚拟车位
+				// 更新部分虚拟车位状态为空闲
+				List<VirtualParkingSlot> outVirtuals = allVirtuals.subList(list.size(), contract.getMaxParkingLotNum());
+				outVirtuals = outVirtuals.stream().map(iter -> {
+					iter.setStatus("0");
+					return iter;
+				}).collect(Collectors.toList());
+				log.info("2==============>:{}",outVirtuals.size());
+				this.updateBatchById(outVirtuals);
+				
+			}else if(contract.getMaxParkingLotNum() > allVirtuals.size()){
+				// 如果包租协议最大车位数大于启用虚拟车位,但小于总虚拟车位
+				list = allVirtuals.stream().map(iter->{
+					if(StrUtil.equals("2",iter.getStatus())){
+						iter.setStatus("0");
+					}
+					return iter;
+				}).collect(Collectors.toList());
+				
+				// 增加虚拟车位
+				Integer index = allVirtuals.size() + 1;;
+				List<VirtualParkingSlot> newVirtuals = new ArrayList<>();
+				for(int i = contract.getMaxParkingLotNum(); i > allVirtuals.size();i--){
+					VirtualParkingSlot virtualParkingSlot = new VirtualParkingSlot();
+					virtualParkingSlot.setContractId(contract.getId());
+					virtualParkingSlot.setVirtualSlotNumber("A"+index);
+					newVirtuals.add(virtualParkingSlot);
+					index ++;
+				}
+				list.addAll(newVirtuals);
+				list.sort((s1, s2) -> s1.getVirtualSlotNumber().compareTo(s2.getVirtualSlotNumber()));
+				log.info("3==============>:{}",list.size());
+				this.saveOrUpdateBatch(list);
+			}
+		}else{
+			// 首次创建包租协议,初始化虚拟车位
+			list = new ArrayList<>();
+			Integer index = 1;
+			for(int i = contract.getMaxParkingLotNum(); i > 0;i--){
+				VirtualParkingSlot virtualParkingSlot = new VirtualParkingSlot();
+				virtualParkingSlot.setContractId(contract.getId());
+				virtualParkingSlot.setVirtualSlotNumber("A"+index);
+				list.add(virtualParkingSlot);
+				index ++;
+			}
+			this.saveBatch(list);
+			
+		}
+	}
+
+	/**更新
+	 * */
+	@Override
+	public boolean updateForm(Long id, VirtualParkingSlotForm form) {
+		VirtualParkingSlot entity = converter.form2Entity(form);
+		entity.setId(id);
+        boolean result = this.updateById(entity);
+        return result;
+	}
+
+	/**获取表单数据
+	 * */
+	@Override
+	public VirtualParkingSlotForm getFormData(Long id) {
+		// 获取entity
+		VirtualParkingSlot entity = this.getById(id);
+        Assert.isTrue(entity != null, "虚拟车位表不存在");
+
+        // 实体转换
+        VirtualParkingSlotForm form = converter.entity2Form(entity);
+        return form;
+	}
+	
+}

+ 5 - 0
src/main/resources/mapper/VirtualParkingSlotMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmrb.system.mapper.VirtualParkingSlotMapper">
+
+</mapper>