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,11 +1,6 @@
package com.ruoyi.common.utils.file; package com.ruoyi.common.utils.file;
import java.io.File; import java.io.*;
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 java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -14,60 +9,44 @@ import javax.servlet.http.HttpServletRequest;
* *
* @author ruoyi * @author ruoyi
*/ */
public class FileUtils public class FileUtils {
{ private static final int SIZE = 2048;
public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
/** /**
* 输出指定文件的byte数组 * 输出指定文件的byte数组
* *
* @param filePath 文件路径 * @param filePath 文件路径
* @param os 输出流 * @param os 输出流
* @return * @return
*/ */
public static void writeBytes(String filePath, OutputStream os) throws IOException public static void writeBytes(String filePath, OutputStream os) throws IOException {
{
FileInputStream fis = null; FileInputStream fis = null;
try try {
{
File file = new File(filePath); File file = new File(filePath);
if (!file.exists()) if (!file.exists()) {
{
throw new FileNotFoundException(filePath); throw new FileNotFoundException(filePath);
} }
fis = new FileInputStream(file); fis = new FileInputStream(file);
byte[] b = new byte[1024]; byte[] b = new byte[SIZE];
int length; int length;
while ((length = fis.read(b)) > 0) while ((length = fis.read(b)) > 0) {
{
os.write(b, 0, length); os.write(b, 0, length);
} }
} } catch (IOException e) {
catch (IOException e)
{
throw e; throw e;
} } finally {
finally if (os != null) {
{ try {
if (os != null)
{
try
{
os.close(); os.close();
} } catch (IOException e1) {
catch (IOException e1)
{
e1.printStackTrace(); e1.printStackTrace();
} }
} }
if (fis != null) if (fis != null) {
{ try {
try
{
fis.close(); fis.close();
} } catch (IOException e1) {
catch (IOException e1)
{
e1.printStackTrace(); e1.printStackTrace();
} }
} }
@ -80,13 +59,11 @@ public class FileUtils
* @param filePath 文件 * @param filePath 文件
* @return * @return
*/ */
public static boolean deleteFile(String filePath) public static boolean deleteFile(String filePath) {
{
boolean flag = false; boolean flag = false;
File file = new File(filePath); File file = new File(filePath);
// 路径为文件且不为空则进行删除 // 路径为文件且不为空则进行删除
if (file.isFile() && file.exists()) if (file.isFile() && file.exists()) {
{
file.delete(); file.delete();
flag = true; flag = true;
} }
@ -99,44 +76,71 @@ public class FileUtils
* @param filename 文件名称 * @param filename 文件名称
* @return true 正常 false 非法 * @return true 正常 false 非法
*/ */
public static boolean isValidFilename(String filename) public static boolean isValidFilename(String filename) {
{
return filename.matches(FILENAME_PATTERN); return filename.matches(FILENAME_PATTERN);
} }
/** /**
* 下载文件名重新编码 * 下载文件名重新编码
* *
* @param request 请求对象 * @param request 请求对象
* @param fileName 文件名 * @param fileName 文件名
* @return 编码后的文件名 * @return 编码后的文件名
*/ */
public static String setFileDownloadHeader(HttpServletRequest request, String fileName) public static String setFileDownloadHeader(HttpServletRequest request, String fileName)
throws UnsupportedEncodingException throws UnsupportedEncodingException {
{
final String agent = request.getHeader("USER-AGENT"); final String agent = request.getHeader("USER-AGENT");
String filename = fileName; String filename = fileName;
if (agent.contains("MSIE")) if (agent.contains("MSIE")) {
{
// IE浏览器 // IE浏览器
filename = URLEncoder.encode(filename, "utf-8"); filename = URLEncoder.encode(filename, "utf-8");
filename = filename.replace("+", " "); filename = filename.replace("+", " ");
} } else if (agent.contains("Firefox")) {
else if (agent.contains("Firefox"))
{
// 火狐浏览器 // 火狐浏览器
filename = new String(fileName.getBytes(), "ISO8859-1"); filename = new String(fileName.getBytes(), "ISO8859-1");
} } else if (agent.contains("Chrome")) {
else if (agent.contains("Chrome"))
{
// google浏览器 // google浏览器
filename = URLEncoder.encode(filename, "utf-8"); filename = URLEncoder.encode(filename, "utf-8");
} } else {
else
{
// 其它浏览器 // 其它浏览器
filename = URLEncoder.encode(filename, "utf-8"); filename = URLEncoder.encode(filename, "utf-8");
} }
return filename; 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); int pageSize = ServletUtils.getParameterToInt(TableSupport.PAGE_SIZE);
officeBasePriceUltimate.setPageIndex(pageIndex <= 1 ? 0 : (pageIndex - 1) * pageSize); officeBasePriceUltimate.setPageIndex(pageIndex <= 1 ? 0 : (pageIndex - 1) * pageSize);
officeBasePriceUltimate.setPageSize(pageSize); officeBasePriceUltimate.setPageSize(pageSize);
int total = officeBasePriceUltimateService.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate);
List<UltimateOfficeBasePrice> list = List<UltimateOfficeBasePrice> list =
officeBasePriceUltimateService.selectOfficeBasePriceUltimateList(officeBasePriceUltimate); officeBasePriceUltimateService.selectOfficeBasePriceUltimateList(officeBasePriceUltimate);
int total = officeBasePriceUltimateService.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate);
return getDataTable(list, total); 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.common.VueSelectModel;
import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel; import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel;
import com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice; import com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice;
import org.apache.ibatis.annotations.Param;
/** /**
* 办公基价Mapper接口 * 办公基价Mapper接口
@ -60,7 +61,15 @@ public interface UltimateOfficeBasePriceMapper {
* @param officeBasePriceModifyModel * @param officeBasePriceModifyModel
* @return * @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); 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; package com.ruoyi.project.data.price.service.impl;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Calendar; import java.util.*;
import java.util.List;
import java.util.Objects;
import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.exception.CustomException;
import com.ruoyi.common.utils.StringUtils; 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.common.VueSelectModel;
import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel; import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel;
import com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice; 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.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; 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.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
/** /**
* 办公基价Service业务层处理 * 办公基价Service业务层处理
@ -31,6 +36,9 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
@Autowired @Autowired
private UltimateOfficeBasePriceMapper officeBasePriceUltimateMapper; private UltimateOfficeBasePriceMapper officeBasePriceUltimateMapper;
@Autowired
private UVConfig uvConfig;
private static Integer getLastYearMonth(Integer yearMonth) { private static Integer getLastYearMonth(Integer yearMonth) {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
@ -68,47 +76,22 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
if (StringUtils.isNull(officeBasePriceUltimates) || officeBasePriceUltimates.size() == 0) { if (StringUtils.isNull(officeBasePriceUltimates) || officeBasePriceUltimates.size() == 0) {
throw new CustomException("导入办公数据不能为空!"); throw new CustomException("导入办公数据不能为空!");
} }
int successNum = 0; int successNum = officeBasePriceUltimates.size();
int failureNum = 0; int failureNum = 0;
int insertNum = 0;
StringBuilder successMsg = new StringBuilder(); StringBuilder successMsg = new StringBuilder();
StringBuilder failureMsg = new StringBuilder(); StringBuilder failureMsg = new StringBuilder();
Integer lastYearMonth = getLastYearMonth(yearMonth); Integer lastYearMonth = getLastYearMonth(yearMonth);
// 批量插入 // 批量插入
officeBasePriceUltimates.stream().parallel().forEach(inputModel -> {
inputModel.setYearMonth(yearMonth);
officeBasePriceUltimateMapper.insertArtificialOfficeBasePrice(inputModel);
});
for (UltimateOfficeBasePrice inputModel : officeBasePriceUltimates) { RestTemplate restTemplate = new RestTemplate();
try { String url = String.format(uvConfig.getAitificialOfficeBasePriceUrl(), yearMonth, lastYearMonth);
inputModel.setYearMonth(yearMonth); UVResponse<Integer> affectCount = restTemplate.getForObject(url, UVResponse.class);
officeBasePriceUltimateMapper.insertArtificialOfficeBasePrice(inputModel); successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,修改数据:" + affectCount.getData() + "");
// 验证是否存在这个用户
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 + " 条,数据如下:");
}
return successMsg.toString(); return successMsg.toString();
} }
@ -147,19 +130,21 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
* @param currentUltimateOfficeBasePrice * @param currentUltimateOfficeBasePrice
* @param lastUltimateOfficeBasePrice * @param lastUltimateOfficeBasePrice
*/ */
private void updateBasePrice(UltimateOfficeBasePrice inputModel, public void updateBasePrice(UltimateOfficeBasePrice inputModel,
UltimateOfficeBasePrice currentUltimateOfficeBasePrice, UltimateOfficeBasePrice currentUltimateOfficeBasePrice,
UltimateOfficeBasePrice lastUltimateOfficeBasePrice) { UltimateOfficeBasePrice lastUltimateOfficeBasePrice) {
OfficeBasePriceModifyModel officeBasePriceModifyModel = compareYearMonth(inputModel, OfficeBasePriceModifyModel officeBasePriceModifyModel = compareYearMonth(inputModel,
currentUltimateOfficeBasePrice, lastUltimateOfficeBasePrice); currentUltimateOfficeBasePrice, lastUltimateOfficeBasePrice);
if (null != officeBasePriceModifyModel) { if (null != officeBasePriceModifyModel) {
officeBasePriceUltimateMapper.updateBasePrice(officeBasePriceModifyModel); officeBasePriceUltimateMapper.updateBasePriceStatus(officeBasePriceModifyModel);
officeBasePriceUltimateMapper.updateBasePriceCopyNew(officeBasePriceModifyModel);
} }
officeBasePriceModifyModel = compareLastYearMonth(inputModel, lastUltimateOfficeBasePrice); officeBasePriceModifyModel = compareLastYearMonth(inputModel, lastUltimateOfficeBasePrice);
if (null != officeBasePriceModifyModel) { if (null != officeBasePriceModifyModel) {
officeBasePriceUltimateMapper.updateBasePrice(officeBasePriceModifyModel); officeBasePriceUltimateMapper.updateBasePriceStatus(officeBasePriceModifyModel);
officeBasePriceUltimateMapper.updateBasePriceCopyNew(officeBasePriceModifyModel);
} }
} }

View File

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

View File

@ -107,7 +107,7 @@
<if test="status != null"> <if test="status != null">
AND a.STATUS = #{status} AND a.STATUS = #{status}
</if> </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>
<select id="getById" resultMap="OfficeBasePriceUltimateResult"> <select id="getById" resultMap="OfficeBasePriceUltimateResult">
@ -120,7 +120,18 @@
<!-- 更新基价 --> <!-- 更新基价 -->
<update id="updateBasePrice" parameterType="com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel"> <update id="updateBasePrice" parameterType="com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel">
update ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} set Status=0 where id=#{id}; 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 ,UnifiedID
,ProjectID ,ProjectID
,BuildingID_P ,BuildingID_P
@ -151,7 +162,7 @@
,BuildingStd ,BuildingStd
,#{comment} ,#{comment}
from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} where id=#{id}; from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} where id=#{id};
</update> </insert>
<!-- 获取表名 --> <!-- 获取表名 -->
<select id="getYearMonthList" resultType="com.ruoyi.project.common.VueSelectModel"> <select id="getYearMonthList" resultType="com.ruoyi.project.common.VueSelectModel">