From 645c6614787249c3d4d1cce4e4cebd6d854f19be Mon Sep 17 00:00:00 2001 From: purple <purple_lihe@163.com> Date: Mon, 8 Jun 2020 13:31:05 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=8A=9E=E5=85=AC=E5=9F=BA=E4=BB=B7?= =?UTF-8?q?=E4=BD=9C=E4=BB=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/utils/file/FileUtils.java | 288 +++++++++--------- .../com/ruoyi/framework/config/UVConfig.java | 37 +++ .../com/ruoyi/project/common/UVResponse.java | 32 ++ .../UltimateOfficeBasePriceController.java | 2 +- .../mapper/UltimateOfficeBasePriceMapper.java | 19 +- .../UltimateOfficeBasePriceServiceImpl.java | 69 ++--- ruoyi/src/main/resources/application.yml | 3 + .../data/UltimateOfficeBasePriceMapper.xml | 17 +- 8 files changed, 278 insertions(+), 189 deletions(-) create mode 100644 ruoyi/src/main/java/com/ruoyi/framework/config/UVConfig.java create mode 100644 ruoyi/src/main/java/com/ruoyi/project/common/UVResponse.java diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java index 03f5aa2a2..d9bac41bd 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/file/FileUtils.java @@ -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; + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/UVConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/UVConfig.java new file mode 100644 index 000000000..46e41715d --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/UVConfig.java @@ -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; + } +} \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/project/common/UVResponse.java b/ruoyi/src/main/java/com/ruoyi/project/common/UVResponse.java new file mode 100644 index 000000000..3fea8cd3e --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/common/UVResponse.java @@ -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; + } +} \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/controller/UltimateOfficeBasePriceController.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/controller/UltimateOfficeBasePriceController.java index 88cbf72cf..3ec2ca53d 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/data/price/controller/UltimateOfficeBasePriceController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/controller/UltimateOfficeBasePriceController.java @@ -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); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/mapper/UltimateOfficeBasePriceMapper.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/mapper/UltimateOfficeBasePriceMapper.java index 632698975..a58806852 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/data/price/mapper/UltimateOfficeBasePriceMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/mapper/UltimateOfficeBasePriceMapper.java @@ -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); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/service/impl/UltimateOfficeBasePriceServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/service/impl/UltimateOfficeBasePriceServiceImpl.java index b6a33f9f2..6d6d14b1a 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/data/price/service/impl/UltimateOfficeBasePriceServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/service/impl/UltimateOfficeBasePriceServiceImpl.java @@ -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); } } diff --git a/ruoyi/src/main/resources/application.yml b/ruoyi/src/main/resources/application.yml index 9b86af7eb..eb9b6d7c1 100644 --- a/ruoyi/src/main/resources/application.yml +++ b/ruoyi/src/main/resources/application.yml @@ -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: diff --git a/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml b/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml index 73a9ee659..a74b7ef75 100644 --- a/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml +++ b/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml @@ -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">