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">