ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/COSController.java
New file @@ -0,0 +1,40 @@ package com.ruoyi.web.controller.api; import com.ruoyi.common.core.domain.R; import com.ruoyi.web.controller.tool.TencentCosUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; /** * @author HJL * @version 1.0 * @since 2024-05-30 9:27 */ @RestController @RequestMapping("/cos") @Api(tags = "公共-文件上传") public class COSController { @Resource private TencentCosUtil tencentCosUtil; @PostMapping("/upload") @ApiOperation(value = "文件上传", tags = "公共-文件上传") @ApiImplicitParams({ @ApiImplicitParam(value = "文件", name = "file", dataType = "MultipartFile", required = true) }) public R<String> upload(@RequestParam("file") MultipartFile file) { String s = tencentCosUtil.upLoadFile(file); return R.ok(s, s); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OssController.java
File was deleted ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -1,22 +1,36 @@ package com.ruoyi.web.controller.api; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.dto.TContractDTO; import com.ruoyi.system.dto.THouseDTO; import com.ruoyi.system.model.TContract; import com.ruoyi.system.model.TContractRentType; import com.ruoyi.system.model.THouse; import com.ruoyi.system.query.TContractQuery; import com.ruoyi.system.query.THouseQuery; import com.ruoyi.system.query.TUserHistoryQuery; import com.ruoyi.system.service.TContractRentTypeService; import com.ruoyi.system.service.TContractService; import com.ruoyi.system.service.THouseService; import com.ruoyi.system.vo.HouseVO; import io.swagger.annotations.Api; import com.ruoyi.system.vo.TContractVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; import java.util.Arrays; import java.util.List; /** * <p> @@ -32,39 +46,82 @@ public class TContractController { @Autowired private TContractService contractService; // @Log(title = "房屋基础信息管理-新增房屋", businessType = BusinessType.INSERT) // @ApiOperation(value = "新增房屋") // @PostMapping(value = "/addHouse") // public AjaxResult<Boolean> addHouse(@Validated @RequestBody THouseDTO dto) { // return AjaxResult.success(contractService.save(dto)); // } // @Log(title = "房屋基础信息管理-编辑房屋", businessType = BusinessType.UPDATE) // @ApiOperation(value = "编辑房屋") // @PostMapping(value = "/updateHouse") // public AjaxResult<Boolean> updateHouse(@Validated @RequestBody THouseDTO dto) { // return AjaxResult.success(contractService.updateById(dto)); // } // @Log(title = "房屋基础信息管理-查询房屋信息", businessType = BusinessType.DELETE) // @ApiOperation(value = "查询房屋信息") // @GetMapping(value = "/getHouseById") // public AjaxResult<THouse> getHouseById(@RequestParam Long id) { // return AjaxResult.success(contractService.getById(id)); // } // @Log(title = "房屋基础信息管理-删除房屋", businessType = BusinessType.DELETE) // @ApiOperation(value = "删除房屋") // @DeleteMapping(value = "/deleteHouseById") // public AjaxResult<Boolean> deleteHouseById(@RequestParam Long id) { // return AjaxResult.success(contractService.removeById(id)); // } // @ApiOperation(value = "获取房屋分页列表") // @PostMapping(value = "/houseList") // public AjaxResult<PageInfo<THouse>> houseList(@RequestBody THouseQuery query) { // return AjaxResult.success(contractService.houseList(query)); // } // @ApiOperation(value = "历史租户列表") // @PostMapping(value = "/userHistoryList") // public AjaxResult<PageInfo<HouseVO>> userHistoryList(@RequestBody TUserHistoryQuery query) { // return AjaxResult.success(contractService.userHistoryList(query)); // } @Autowired private TContractRentTypeService contractRentTypeService; @Autowired private THouseService houseService; @ApiOperation(value = "获取合同分页列表") @PostMapping(value = "/contractList") public AjaxResult<PageInfo<TContract>> contractList(@RequestBody TContractQuery query) { return AjaxResult.success(contractService.contractList(query)); } @Log(title = "合同管理-新增合同", businessType = BusinessType.INSERT) @ApiOperation(value = "新增合同") @PostMapping(value = "/addContract") public AjaxResult<Boolean> addContract(@Validated @RequestBody TContractDTO dto) { contractService.save(dto); if (dto.getIsIncreasing()==1){ TContractRentType tContractRentType = new TContractRentType(); tContractRentType.setContractId(dto.getId()); tContractRentType.setIncreasingDecreasing(dto.getIncreasingDecreasing()); tContractRentType.setIncreasingDecreasingType(dto.getIncreasingDecreasingType()); tContractRentType.setNumericalValue(dto.getNumericalValue()); tContractRentType.setChangeTime(dto.getChangeTime()); contractRentTypeService.save(tContractRentType); } return AjaxResult.success(); } @Log(title = "合同管理-编辑合同", businessType = BusinessType.UPDATE) @ApiOperation(value = "编辑合同") @PostMapping(value = "/updateContract") public AjaxResult<Boolean> updateContract(@Validated @RequestBody TContractDTO dto) { contractService.updateById(dto); contractRentTypeService.remove(new LambdaQueryWrapper<TContractRentType>() .eq(TContractRentType::getContractId,dto.getId())); if (dto.getIsIncreasing()==1){ TContractRentType tContractRentType = new TContractRentType(); tContractRentType.setContractId(dto.getId()); tContractRentType.setIncreasingDecreasing(dto.getIncreasingDecreasing()); tContractRentType.setIncreasingDecreasingType(dto.getIncreasingDecreasingType()); tContractRentType.setNumericalValue(dto.getNumericalValue()); tContractRentType.setChangeTime(dto.getChangeTime()); contractRentTypeService.save(tContractRentType); } return AjaxResult.success(); } @Log(title = "合同管理-批量删除合同", businessType = BusinessType.DELETE) @ApiOperation(value = "批量删除合同") @DeleteMapping(value = "/deleteContractByIds") public AjaxResult<Boolean> deleteContractByIds3 (@RequestParam String ids) { if (StringUtils.isNotEmpty(ids)){ contractService.removeBatchByIds(Arrays.asList(ids.split(","))); } return AjaxResult.success(); } @ApiOperation(value = "查询合同信息信息") @GetMapping(value = "/getContractById") public AjaxResult<TContractVO> getContractById(@RequestParam Long id) { TContractVO res = new TContractVO(); TContract contract = contractService.getById(id); BeanUtils.copyProperties(contract,res); TContractRentType contractRentType = contractRentTypeService.lambdaQuery().eq(TContractRentType::getContractId, id).one(); if (contractRentType!=null){ BeanUtils.copyProperties(contractRentType,res); } TContract oldContract = contractService.getOne(new LambdaQueryWrapper<TContract>() .eq(TContract::getHouseId,contract.getHouseId()) .eq(TContract::getStatus, 4) .le(TContract::getStartTime, LocalDateTime.now()) .ge(TContract::getEndTime, LocalDateTime.now())); THouse house = houseService.getById(contract.getHouseId()); if (oldContract!=null){ house.setTenantType(oldContract.getPayType()); } res.setHouse(house); return AjaxResult.success(); } } ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TencentCosUtil.java
New file @@ -0,0 +1,108 @@ package com.ruoyi.web.controller.tool; import com.qcloud.cos.COSClient; import com.qcloud.cos.ClientConfig; import com.qcloud.cos.auth.BasicCOSCredentials; import com.qcloud.cos.auth.COSCredentials; import com.qcloud.cos.http.HttpProtocol; import com.qcloud.cos.model.ObjectMetadata; import com.qcloud.cos.model.PutObjectResult; import com.qcloud.cos.region.Region; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.util.UUID; /** * @author HJL */ @Component public class TencentCosUtil { /** * COS的SecretId */ @Value("${cos.client.accessKey}") private String secretId; /** * COS的SecretKey */ @Value("${cos.client.secretKey}") private String secretKey; /** * 文件上传后访问路径的根路径,后面要最佳文件名字与类型 */ @Value("${cos.client.rootSrc}") private String rootSrc; /** * 上传的存储桶的地域 */ @Value("${cos.client.bucketAddr}") private String bucketAddr; /** * 存储桶的名字,是自己在存储空间自己创建的,我创建的名字是:qq-test-1303****** */ @Value("${cos.client.bucket}") private String bucketName; /** * 1.调用静态方法getCosClient()就会获得COSClient实例 * 2.本方法根据永久密钥初始化 COSClient的,官方是不推荐,官方推荐使用临时密钥,是可以限制密钥使用权限,创建cred时有些区别 * * @return COSClient实例 */ private COSClient getCosClient() { // 1 初始化用户身份信息(secretId, secretKey)。 COSCredentials cred = new BasicCOSCredentials(secretId, secretKey); // 2.1 设置存储桶的地域(上文获得) Region region = new Region(bucketAddr); ClientConfig clientConfig = new ClientConfig(region); // 2.2 使用https协议传输 clientConfig.setHttpProtocol(HttpProtocol.https); // 生成 cos 客户端 return new COSClient(cred, clientConfig); } /** * 只要调用静态方法upLoadFile(MultipartFile multipartFile)就可以获取上传后文件的全路径 * * @param file * @return 返回文件的浏览全路径 */ public String upLoadFile(MultipartFile file) { try { // 获取上传的文件的输入流 InputStream inputStream = file.getInputStream(); // 避免文件覆盖,获取文件的原始名称,如123.jpg,然后通过截取获得文件的后缀,也就是文件的类型 String originalFilename = file.getOriginalFilename(); //获取文件的类型 String fileType = originalFilename.substring(originalFilename.lastIndexOf(".")); //使用UUID工具 创建唯一名称,放置文件重名被覆盖,在拼接上上命令获取的文件类型 String fileName = UUID.randomUUID() + fileType; // 指定文件上传到 COS 上的路径,即对象键。最终文件会传到存储桶名字中的images文件夹下的fileName名字 String key = "xizang/" + fileName; // 创建上传Object的Metadata ObjectMetadata objectMetadata = new ObjectMetadata(); // - 使用输入流存储,需要设置请求长度 objectMetadata.setContentLength(inputStream.available()); // - 设置缓存 objectMetadata.setCacheControl("no-cache"); // - 设置Content-Type objectMetadata.setContentType(fileType); //上传文件 PutObjectResult putResult = getCosClient().putObject(bucketName, key, inputStream, objectMetadata); // 创建文件的网络访问路径 String url = rootSrc + key; //关闭 cosClient,并释放 HTTP 连接的后台管理线程 getCosClient().shutdown(); return url; } catch (Exception e) { e.printStackTrace(); // 发生IO异常、COS连接异常等,返回空 return null; } } } ruoyi-admin/src/main/resources/application-prod.yml
@@ -206,3 +206,10 @@ accessKeySecret: 0SRb6XGkciQDPWn2rYqbJtq2qRMDY8 signName: "四川金达通信工程" templateCode: "SMS_293985284" cos: client: accessKey: AKIDCF5EF2c0DE1e5JK8r4EGJF4mNsMgp26x secretKey: lLl184rUyFOOE0d5KNGC3kmfNsCWk4GU bucket: xzgttest-1305134071 bucketAddr: ap-nanjing rootSrc: https://cdn.hyhsbqgc.com/ ruoyi-admin/src/main/resources/application-test.yml
@@ -205,3 +205,10 @@ accessKeySecret: 0SRb6XGkciQDPWn2rYqbJtq2qRMDY8 signName: "四川金达通信工程" templateCode: "SMS_293985284" cos: client: accessKey: AKIDHVcchrvvtBiRJB25bHFFJc2Laq4NnHsY secretKey: pgUGwX4Z1SrAPXYk1PxgXVem2HlRJG9k bucketAddr: ap-nanjing bucket: huishou-1323682843 rootSrc: https://cdn.hyhsbqgc.com/ ruoyi-system/pom.xml
@@ -16,7 +16,11 @@ </description> <dependencies> <dependency> <groupId>com.qcloud</groupId> <artifactId>cos_api</artifactId> <version>5.6.227</version> </dependency> <!-- 通用工具--> <dependency> <groupId>com.ruoyi</groupId> ruoyi-system/src/main/java/com/ruoyi/system/dto/TContractDTO.java
New file @@ -0,0 +1,29 @@ package com.ruoyi.system.dto; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.system.model.TContract; import com.ruoyi.system.model.TTenant; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @ApiModel(value = "合同新增编辑DTO") public class TContractDTO extends TContract { @ApiModelProperty(value = "递增递减 1=递增 2=递减") private Integer increasingDecreasing; @ApiModelProperty(value = "递增递减形式 1=百分比 2=金额元") private Integer increasingDecreasingType; @ApiModelProperty(value = "数值") private BigDecimal numericalValue; @ApiModelProperty(value = "递增或递减时点") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime changeTime; } ruoyi-system/src/main/java/com/ruoyi/system/mapper/TContractMapper.java
@@ -1,7 +1,12 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.model.TContract; import com.ruoyi.system.query.TContractQuery; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> @@ -13,4 +18,5 @@ */ public interface TContractMapper extends BaseMapper<TContract> { List<TContract> contractList(@Param("req") TContractQuery query, @Param("pageInfo") PageInfo<TContract> pageInfo); } ruoyi-system/src/main/java/com/ruoyi/system/model/TContract.java
@@ -114,7 +114,7 @@ @TableField("party_two_phone") private String partyTwoPhone; @ApiModelProperty(value = "合同附件") @ApiModelProperty(value = "合同附件,多个逗号拼接") @TableField("contract_file") private String contractFile; @@ -122,7 +122,7 @@ @TableField("remark") private String remark; @ApiModelProperty(value = "状态 1=待审批 2=未签订 3=已签订") @ApiModelProperty(value = "状态 1=待提交 2=待审批 3=未签订 4=已签订") @TableField("status") private Integer status; ruoyi-system/src/main/java/com/ruoyi/system/model/TContractRentType.java
@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.annotation.TableField; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -47,5 +49,10 @@ @TableField("numerical_value") private BigDecimal numericalValue; @ApiModelProperty(value = "递增或递减时点") @TableField("change_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime changeTime; } ruoyi-system/src/main/java/com/ruoyi/system/model/THouse.java
@@ -87,7 +87,8 @@ @ApiModelProperty(value = "房号") @TableField("room_number") private String roomNumber; @ApiModelProperty(value = "租户类型 1月付 2季付 3年付") @ApiModelProperty(value = "住户类型 1月租 2季租 3年租") @TableField(exist = false) private String tenantType; private Integer tenantType; } ruoyi-system/src/main/java/com/ruoyi/system/query/TContractQuery.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.system.query; import com.ruoyi.common.core.domain.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "合同分页列表查询Query") public class TContractQuery extends BasePage { @ApiModelProperty(value = "乙方名称") private String partyTwoName; @ApiModelProperty(value = "合同编号") private String contractNumber; @ApiModelProperty(value = "合同名称") private Integer contractName; @ApiModelProperty(value = "合同状态 1=待提交 2=待审批 3=未签订 4=已签订") private Integer status; } ruoyi-system/src/main/java/com/ruoyi/system/service/TContractService.java
@@ -1,7 +1,9 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.model.TContract; import com.ruoyi.system.query.TContractQuery; /** * <p> @@ -13,4 +15,5 @@ */ public interface TContractService extends IService<TContract> { PageInfo<TContract> contractList(TContractQuery query); } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TContractServiceImpl.java
@@ -1,10 +1,15 @@ package com.ruoyi.system.service.impl; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.mapper.TContractMapper; import com.ruoyi.system.model.TContract; import com.ruoyi.system.model.TTenant; import com.ruoyi.system.query.TContractQuery; import com.ruoyi.system.service.TContractService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -17,4 +22,12 @@ @Service public class TContractServiceImpl extends ServiceImpl<TContractMapper, TContract> implements TContractService { @Override public PageInfo<TContract> contractList(TContractQuery query) { PageInfo<TContract> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); List<TContract> list = this.baseMapper.contractList(query,pageInfo); pageInfo.setRecords(list); return pageInfo; } } ruoyi-system/src/main/java/com/ruoyi/system/service/impl/THouseServiceImpl.java
@@ -1,7 +1,10 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.basic.PageInfo; import com.ruoyi.system.mapper.TContractMapper; import com.ruoyi.system.mapper.THouseMapper; import com.ruoyi.system.model.TContract; import com.ruoyi.system.model.THouse; import com.ruoyi.system.query.THouseQuery; import com.ruoyi.system.query.TUserHistoryQuery; @@ -10,6 +13,8 @@ import com.ruoyi.system.vo.HouseVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.List; /** @@ -22,11 +27,22 @@ */ @Service public class THouseServiceImpl extends ServiceImpl<THouseMapper, THouse> implements THouseService { @Resource private TContractMapper contractMapper; @Override public PageInfo<THouse> houseList(THouseQuery query) { PageInfo<THouse> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize()); List<THouse> list = this.baseMapper.houseList(query,pageInfo); List<TContract> tContracts = contractMapper.selectList(new LambdaQueryWrapper<TContract>() .eq(TContract::getStatus, 4) .le(TContract::getStartTime, LocalDateTime.now()) .ge(TContract::getEndTime, LocalDateTime.now())); for (THouse tHouse : list) { TContract tContract = tContracts.stream().filter(e -> e.getHouseId().equals(tHouse.getId())).findFirst().orElse(null); if (tContract!=null){ tHouse.setTenantType(tContract.getPayType()); } } pageInfo.setRecords(list); return pageInfo; } ruoyi-system/src/main/java/com/ruoyi/system/vo/TContractVO.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.system.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.system.model.TContract; import com.ruoyi.system.model.THouse; import io.swagger.annotations.Api; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @ApiModel(value = "合同详情页VO") public class TContractVO extends TContract { @ApiModelProperty(value = "递增递减 1=递增 2=递减") private Integer increasingDecreasing; @ApiModelProperty(value = "递增递减形式 1=百分比 2=金额元") private Integer increasingDecreasingType; @ApiModelProperty(value = "数值") private BigDecimal numericalValue; @ApiModelProperty(value = "递增或递减时点") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime changeTime; @ApiModelProperty(value = "房屋信息") private THouse house; } ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
@@ -38,5 +38,22 @@ <sql id="Base_Column_List"> id, contract_number, contract_name, start_time, end_time, total_rent, deposit, pay_type, first_pay_time, isIncreasing, isIncreasing_deposit, proportion, house_id, party_one_name, party_one_person, party_one_phone, tenant_id, party_two_name, party_two_person, party_two_phone, contract_file, remark, status, create_time, update_time, create_by, update_by, disabled </sql> <select id="contractList" resultType="com.ruoyi.system.model.TContract"> select t1.* from t_contract t1 <where> <if test="query.partyTwoName != null and query.partyTwoName != ''"> and t1.party_two_name like concat('%',#{query.partyTwoName},'%') </if> <if test="query.contractNumber != null and query.contractNumber != ''"> and t1.contract_number like concat('%',#{query.contractNumber},'%') </if> <if test="query.contractName != null and query.contractName != ''"> and t1.contract_name like concat('%',#{query.contractName},'%') </if> <if test="query.status != null"> and t1.status = #{query.status} </if> </where> </select> </mapper>