1. 办公基价作价

This commit is contained in:
purple 2020-06-08 13:31:05 +08:00
parent 555c840303
commit 645c661478
8 changed files with 278 additions and 189 deletions

View File

@ -1,142 +1,146 @@
package com.ruoyi.common.utils.file;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
/**
* 文件处理工具类
*
* @author ruoyi
*/
public class FileUtils
{
public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
/**
* 输出指定文件的byte数组
*
* @param filePath 文件路径
* @param os 输出流
* @return
*/
public static void writeBytes(String filePath, OutputStream os) throws IOException
{
FileInputStream fis = null;
try
{
File file = new File(filePath);
if (!file.exists())
{
throw new FileNotFoundException(filePath);
}
fis = new FileInputStream(file);
byte[] b = new byte[1024];
int length;
while ((length = fis.read(b)) > 0)
{
os.write(b, 0, length);
}
}
catch (IOException e)
{
throw e;
}
finally
{
if (os != null)
{
try
{
os.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
if (fis != null)
{
try
{
fis.close();
}
catch (IOException e1)
{
e1.printStackTrace();
}
}
}
}
/**
* 删除文件
*
* @param filePath 文件
* @return
*/
public static boolean deleteFile(String filePath)
{
boolean flag = false;
File file = new File(filePath);
// 路径为文件且不为空则进行删除
if (file.isFile() && file.exists())
{
file.delete();
flag = true;
}
return flag;
}
/**
* 文件名称验证
*
* @param filename 文件名称
* @return true 正常 false 非法
*/
public static boolean isValidFilename(String filename)
{
return filename.matches(FILENAME_PATTERN);
}
/**
* 下载文件名重新编码
*
* @param request 请求对象
* @param fileName 文件名
* @return 编码后的文件名
*/
public static String setFileDownloadHeader(HttpServletRequest request, String fileName)
throws UnsupportedEncodingException
{
final String agent = request.getHeader("USER-AGENT");
String filename = fileName;
if (agent.contains("MSIE"))
{
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
}
else if (agent.contains("Firefox"))
{
// 火狐浏览器
filename = new String(fileName.getBytes(), "ISO8859-1");
}
else if (agent.contains("Chrome"))
{
// google浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
else
{
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
}
package com.ruoyi.common.utils.file;
import java.io.*;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
/**
* 文件处理工具类
*
* @author ruoyi
*/
public class FileUtils {
private static final int SIZE = 2048;
public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
/**
* 输出指定文件的byte数组
*
* @param filePath 文件路径
* @param os 输出流
* @return
*/
public static void writeBytes(String filePath, OutputStream os) throws IOException {
FileInputStream fis = null;
try {
File file = new File(filePath);
if (!file.exists()) {
throw new FileNotFoundException(filePath);
}
fis = new FileInputStream(file);
byte[] b = new byte[SIZE];
int length;
while ((length = fis.read(b)) > 0) {
os.write(b, 0, length);
}
} catch (IOException e) {
throw e;
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
/**
* 删除文件
*
* @param filePath 文件
* @return
*/
public static boolean deleteFile(String filePath) {
boolean flag = false;
File file = new File(filePath);
// 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) {
file.delete();
flag = true;
}
return flag;
}
/**
* 文件名称验证
*
* @param filename 文件名称
* @return true 正常 false 非法
*/
public static boolean isValidFilename(String filename) {
return filename.matches(FILENAME_PATTERN);
}
/**
* 下载文件名重新编码
*
* @param request 请求对象
* @param fileName 文件名
* @return 编码后的文件名
*/
public static String setFileDownloadHeader(HttpServletRequest request, String fileName)
throws UnsupportedEncodingException {
final String agent = request.getHeader("USER-AGENT");
String filename = fileName;
if (agent.contains("MSIE")) {
// IE浏览器
filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
filename = new String(fileName.getBytes(), "ISO8859-1");
} else if (agent.contains("Chrome")) {
// google浏览器
filename = URLEncoder.encode(filename, "utf-8");
} else {
// 其它浏览器
filename = URLEncoder.encode(filename, "utf-8");
}
return filename;
}
/**
* 读取文本文件
*
* @param fileName
* @return
*/
public static String readFile(String fileName) {
InputStream is = null;
try {
is = Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName);
StringBuffer stringBuffer = new StringBuffer();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), SIZE);
char[] buf = new char[SIZE];
int numRead = 0;
while ((numRead = reader.read(buf)) != -1) {
String readData = String.valueOf(buf, 0, numRead);
stringBuffer.append(readData);
buf = new char[SIZE];
}
reader.close();
return stringBuffer.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
}

View File

@ -0,0 +1,37 @@
package com.ruoyi.framework.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 读取项目相关配置
*
* @author ruoyi
*/
@Component
@ConfigurationProperties(prefix = "uv")
public class UVConfig {
/**
* 项目名称
*/
private String dataUrl;
private String aitificialOfficeBasePriceUrl;
public String getDataUrl() {
return dataUrl;
}
public void setDataUrl(String dataUrl) {
this.dataUrl = dataUrl;
}
public String getAitificialOfficeBasePriceUrl() {
return getDataUrl() + aitificialOfficeBasePriceUrl;
}
public void setAitificialOfficeBasePriceUrl(String aitificialOfficeBasePriceUrl) {
this.aitificialOfficeBasePriceUrl = aitificialOfficeBasePriceUrl;
}
}

View File

@ -0,0 +1,32 @@
package com.ruoyi.project.common;
public class UVResponse<T> {
private int code;
private String message;
private T data;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}

View File

@ -50,9 +50,9 @@ public class UltimateOfficeBasePriceController extends BaseController {
int pageSize = ServletUtils.getParameterToInt(TableSupport.PAGE_SIZE);
officeBasePriceUltimate.setPageIndex(pageIndex <= 1 ? 0 : (pageIndex - 1) * pageSize);
officeBasePriceUltimate.setPageSize(pageSize);
int total = officeBasePriceUltimateService.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate);
List<UltimateOfficeBasePrice> list =
officeBasePriceUltimateService.selectOfficeBasePriceUltimateList(officeBasePriceUltimate);
int total = officeBasePriceUltimateService.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate);
return getDataTable(list, total);
}

View File

@ -7,6 +7,7 @@ import com.baomidou.dynamic.datasource.annotation.DS;
import com.ruoyi.project.common.VueSelectModel;
import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel;
import com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice;
import org.apache.ibatis.annotations.Param;
/**
* 办公基价Mapper接口
@ -60,7 +61,15 @@ public interface UltimateOfficeBasePriceMapper {
* @param officeBasePriceModifyModel
* @return
*/
int updateBasePrice(OfficeBasePriceModifyModel officeBasePriceModifyModel);
int updateBasePriceStatus(OfficeBasePriceModifyModel officeBasePriceModifyModel);
/**
* 更新当前基价
*
* @param officeBasePriceModifyModel
* @return
*/
int updateBasePriceCopyNew(OfficeBasePriceModifyModel officeBasePriceModifyModel);
/**
* 年月
@ -77,4 +86,12 @@ public interface UltimateOfficeBasePriceMapper {
*/
int insertArtificialOfficeBasePrice(UltimateOfficeBasePrice ultimateOfficeBasePrice);
/**
* 批量插入人工修正办公基价
*
* @param ultimateOfficeBasePrices
* @return
*/
int batchInsertArtificialOfficeBase(@Param("yearMonth") Integer yearMonth,
@Param("list") List<UltimateOfficeBasePrice> ultimateOfficeBasePrices);
}

View File

@ -1,12 +1,13 @@
package com.ruoyi.project.data.price.service.impl;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.List;
import java.util.Objects;
import java.util.*;
import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.framework.config.UVConfig;
import com.ruoyi.project.common.UVResponse;
import com.ruoyi.project.common.VueSelectModel;
import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel;
import com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice;
@ -16,7 +17,11 @@ import com.ruoyi.project.system.service.impl.SysUserServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
/**
* 办公基价Service业务层处理
@ -31,6 +36,9 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
@Autowired
private UltimateOfficeBasePriceMapper officeBasePriceUltimateMapper;
@Autowired
private UVConfig uvConfig;
private static Integer getLastYearMonth(Integer yearMonth) {
Calendar calendar = Calendar.getInstance();
@ -68,47 +76,22 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
if (StringUtils.isNull(officeBasePriceUltimates) || officeBasePriceUltimates.size() == 0) {
throw new CustomException("导入办公数据不能为空!");
}
int successNum = 0;
int successNum = officeBasePriceUltimates.size();
int failureNum = 0;
int insertNum = 0;
StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder();
Integer lastYearMonth = getLastYearMonth(yearMonth);
// 批量插入
officeBasePriceUltimates.stream().parallel().forEach(inputModel -> {
inputModel.setYearMonth(yearMonth);
officeBasePriceUltimateMapper.insertArtificialOfficeBasePrice(inputModel);
});
for (UltimateOfficeBasePrice inputModel : officeBasePriceUltimates) {
try {
inputModel.setYearMonth(yearMonth);
officeBasePriceUltimateMapper.insertArtificialOfficeBasePrice(inputModel);
// 验证是否存在这个用户
UltimateOfficeBasePrice currentUltimateOfficeBasePrice =
officeBasePriceUltimateMapper.getById(yearMonth, lastYearMonth,
inputModel.getId());
UltimateOfficeBasePrice lastUltimateOfficeBasePrice =
officeBasePriceUltimateMapper.getByBuildingId(lastYearMonth,
inputModel.getBuildingId());
if (StringUtils.isNotNull(currentUltimateOfficeBasePrice)) {
updateBasePrice(inputModel, currentUltimateOfficeBasePrice, lastUltimateOfficeBasePrice);
successNum++;
successMsg.append("<br/>" + successNum + "、ID= " + inputModel.getId() + " 更新成功");
} else {
failureNum++;
failureMsg.append("<br/>" + failureNum + "、ID= " + inputModel.getId() + " 失败");
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、ID= " + inputModel.getId() + " 导入失败:";
failureMsg.append(msg + e.getMessage());
log.error(msg, e);
}
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new CustomException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
RestTemplate restTemplate = new RestTemplate();
String url = String.format(uvConfig.getAitificialOfficeBasePriceUrl(), yearMonth, lastYearMonth);
UVResponse<Integer> affectCount = restTemplate.getForObject(url, UVResponse.class);
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,修改数据:" + affectCount.getData() + "");
return successMsg.toString();
}
@ -147,19 +130,21 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
* @param currentUltimateOfficeBasePrice
* @param lastUltimateOfficeBasePrice
*/
private void updateBasePrice(UltimateOfficeBasePrice inputModel,
UltimateOfficeBasePrice currentUltimateOfficeBasePrice,
UltimateOfficeBasePrice lastUltimateOfficeBasePrice) {
public void updateBasePrice(UltimateOfficeBasePrice inputModel,
UltimateOfficeBasePrice currentUltimateOfficeBasePrice,
UltimateOfficeBasePrice lastUltimateOfficeBasePrice) {
OfficeBasePriceModifyModel officeBasePriceModifyModel = compareYearMonth(inputModel,
currentUltimateOfficeBasePrice, lastUltimateOfficeBasePrice);
if (null != officeBasePriceModifyModel) {
officeBasePriceUltimateMapper.updateBasePrice(officeBasePriceModifyModel);
officeBasePriceUltimateMapper.updateBasePriceStatus(officeBasePriceModifyModel);
officeBasePriceUltimateMapper.updateBasePriceCopyNew(officeBasePriceModifyModel);
}
officeBasePriceModifyModel = compareLastYearMonth(inputModel, lastUltimateOfficeBasePrice);
if (null != officeBasePriceModifyModel) {
officeBasePriceUltimateMapper.updateBasePrice(officeBasePriceModifyModel);
officeBasePriceUltimateMapper.updateBasePriceStatus(officeBasePriceModifyModel);
officeBasePriceUltimateMapper.updateBasePriceCopyNew(officeBasePriceModifyModel);
}
}

View File

@ -12,6 +12,9 @@ ruoyi:
profile: D:/ruoyi/uploadPath
# 获取ip地址开关
addressEnabled: false
uv:
dataUrl: http://172.16.30.74:9500/api
aitificialOfficeBasePriceUrl: /price/office/artificial?yearMonth=%d&lastYearMonth=%d
# 开发环境配置
server:

View File

@ -107,7 +107,7 @@
<if test="status != null">
AND a.STATUS = #{status}
</if>
order by a.BUILDINGID_P ASC,a.ID DESC OFFSET #{pageIndex} rows fetch next #{pageSize} rows only;
order by a.ModifyDate DESC,a.BUILDINGID_P ASC OFFSET #{pageIndex} rows fetch next #{pageSize} rows only;
</select>
<select id="getById" resultMap="OfficeBasePriceUltimateResult">
@ -120,7 +120,18 @@
<!-- 更新基价 -->
<update id="updateBasePrice" parameterType="com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel">
update ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} set Status=0 where id=#{id};
insert into ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth}(BuildingID
</update>
<insert id="batchInsertArtificialOfficeBase" >
insert into
dbo.DWA_PROJECTBASEPRICE_OFFICE_MANU_${yearMonth}(ID,BuildingID,ProjectID,County,"Loop",Block,ProjectAddr,ProjectName,Year,AvgArea,TotalFloorSum,UpperFloorSum,OfficeClass,Grade,MainPrice_1,MainPriceRent_1,MainPrice,MainPriceRent,ModifyDate)
values
<foreach collection="list" item="item" separator="," >
(#{item.id},#{item.buildingId},#{item.communityId},#{item.countyName},#{item.loopName},#{item.blockName},#{item.communityAddress},#{item.communityName},#{item.year},#{item.avgArea},#{item.totalFloorSum},#{item.upperFloorSum},#{item.officeClass},#{item.officeLevel},#{item.mainPrice_1},#{item.mainPriceRent_1},#{item.mainPrice},#{item.mainPriceRent},getdate())
</foreach>
</insert>
<!-- 更新基价 -->
<insert id="updateBasePriceCopyNew" parameterType="com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel">
insert into ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth}(BuildingID
,UnifiedID
,ProjectID
,BuildingID_P
@ -151,7 +162,7 @@
,BuildingStd
,#{comment}
from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} where id=#{id};
</update>
</insert>
<!-- 获取表名 -->
<select id="getYearMonthList" resultType="com.ruoyi.project.common.VueSelectModel">