diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js
index cac52c34d..1945dbdca 100644
--- a/ruoyi-ui/src/utils/request.js
+++ b/ruoyi-ui/src/utils/request.js
@@ -1,74 +1,74 @@
-import axios from 'axios'
-import { Notification, MessageBox, Message } from 'element-ui'
-import store from '@/store'
-import { getToken } from '@/utils/auth'
-import errorCode from '@/utils/errorCode'
-
-axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
-// 创建axios实例
-const service = axios.create({
-  // axios中请求配置有baseURL选项,表示请求URL公共部分
-  baseURL: process.env.VUE_APP_BASE_API,
-  // 超时
-  timeout: 10000
-})
-// request拦截器
-service.interceptors.request.use(config => {
-  // 是否需要设置 token
-  const isToken = (config.headers || {}).isToken === false
-  if (getToken() && !isToken) {
-    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
-  }
-  return config
-}, error => {
-    console.log(error)
-    Promise.reject(error)
-})
-
-// 响应拦截器
-service.interceptors.response.use(res => {
-    // 未设置状态码则默认成功状态
-    const code = res.data.code || 200;
-    // 获取错误信息
-    const message = errorCode[code] || res.data.msg || errorCode['default']
-    if (code === 401) {
-      MessageBox.confirm(
-        '登录状态已过期,您可以继续留在该页面,或者重新登录',
-        '系统提示',
-        {
-          confirmButtonText: '重新登录',
-          cancelButtonText: '取消',
-          type: 'warning'
-        }
-      ).then(() => {
-        store.dispatch('LogOut').then(() => {
-          location.reload() // 为了重新实例化vue-router对象 避免bug
-        })
-      })
-    } else if (code === 500) {
-      Message({
-        message: message,
-        type: 'error'
-      })
-      return Promise.reject(new Error(message))
-    } else if (code !== 200) {
-      Notification.error({
-        title: message
-      })
-      return Promise.reject('error')
-    } else {
-      return res.data
-    }
-  },
-  error => {
-    console.log('err' + error)
-    Message({
-      message: error.message,
-      type: 'error',
-      duration: 5 * 1000
-    })
-    return Promise.reject(error)
-  }
-)
-
-export default service
+import axios from 'axios'
+import { Notification, MessageBox, Message } from 'element-ui'
+import store from '@/store'
+import { getToken } from '@/utils/auth'
+import errorCode from '@/utils/errorCode'
+
+axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
+// 创建axios实例
+const service = axios.create({
+  // axios中请求配置有baseURL选项,表示请求URL公共部分
+  baseURL: process.env.VUE_APP_BASE_API,
+  // 超时
+  timeout: 30 * 1000
+})
+// request拦截器
+service.interceptors.request.use(config => {
+  // 是否需要设置 token
+  const isToken = (config.headers || {}).isToken === false
+  if (getToken() && !isToken) {
+    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
+  }
+  return config
+}, error => {
+    console.log(error)
+    Promise.reject(error)
+})
+
+// 响应拦截器
+service.interceptors.response.use(res => {
+    // 未设置状态码则默认成功状态
+    const code = res.data.code || 200;
+    // 获取错误信息
+    const message = errorCode[code] || res.data.msg || errorCode['default']
+    if (code === 401) {
+      MessageBox.confirm(
+        '登录状态已过期,您可以继续留在该页面,或者重新登录',
+        '系统提示',
+        {
+          confirmButtonText: '重新登录',
+          cancelButtonText: '取消',
+          type: 'warning'
+        }
+      ).then(() => {
+        store.dispatch('LogOut').then(() => {
+          location.reload() // 为了重新实例化vue-router对象 避免bug
+        })
+      })
+    } else if (code === 500) {
+      Message({
+        message: message,
+        type: 'error'
+      })
+      return Promise.reject(new Error(message))
+    } else if (code !== 200) {
+      Notification.error({
+        title: message
+      })
+      return Promise.reject('error')
+    } else {
+      return res.data
+    }
+  },
+  error => {
+    console.log('err' + error)
+    Message({
+      message: error.message,
+      type: 'error',
+      duration: 5 * 1000
+    })
+    return Promise.reject(error)
+  }
+)
+
+export default service
diff --git a/ruoyi-ui/src/views/data/price/UltimateOfficeBasePrice.vue b/ruoyi-ui/src/views/data/price/UltimateOfficeBasePrice.vue
index 1ace6b2db..ba90017d8 100644
--- a/ruoyi-ui/src/views/data/price/UltimateOfficeBasePrice.vue
+++ b/ruoyi-ui/src/views/data/price/UltimateOfficeBasePrice.vue
@@ -42,16 +42,6 @@
     </el-form>
 
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:ultimate:edit']"
-        >修改</el-button>
-      </el-col>
       <el-col :span="1.5">
         <el-button
           type="warning"
@@ -72,11 +62,11 @@
       </el-col>
     </el-row>
 
-    <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
+    <el-table v-loading="loading" :data="dataList">
+      <!-- <el-table-column type="selection" width="55" align="center" /> -->
       <el-table-column label="年月" align="center" prop="yearMonth" />
-      <el-table-column label="小区ID" align="center" prop="communityId" />
-      <el-table-column label="楼栋ID" align="center" prop="buildingId" />
+      <el-table-column label="小区ID" align="center" prop="communityId" width="110" />
+      <el-table-column label="楼栋ID" align="center" prop="buildingId" width="110" />
       <el-table-column label="项目名称" align="center" prop="communityName" />
       <el-table-column label="办公项目地址" align="center" prop="communityAddress" />
       <el-table-column label="楼栋地址" align="center" prop="buildingAddress" />
@@ -104,7 +94,12 @@
       />
       <el-table-column label="价格更改说明" align="center" prop="adjustPriceComment" />
       <el-table-column label="更新日期" align="center" prop="updateDate" :formatter="dateFormatter" />
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+      <el-table-column
+        label="操作"
+        align="center"
+        class-name="small-padding fixed-width"
+        fixed="right"
+      >
         <template slot-scope="scope">
           <el-button
             size="mini"
@@ -113,13 +108,6 @@
             @click="handleUpdate(scope.row)"
             v-hasPermi="['system:user:edit']"
           >修改</el-button>
-          <!-- <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-delete"
-            @click="handleDelete(scope.row)"
-            v-hasPermi="['system:user:remove']"
-          >删除</el-button>-->
         </template>
       </el-table-column>
     </el-table>
@@ -134,52 +122,149 @@
 
     <!-- 添加或修改办公基价对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="160px">
+      <el-form ref="form" :model="form" :rules="updateRules" label-width="160px">
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="小区ID">
-              <el-input v-model="form.communityId" disabled="true" readonly />
+              <el-input v-model="form.communityId" disabled readonly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="楼栋ID">
-              <el-input v-model="form.buildingId" disabled="true" readonly />
+              <el-input v-model="form.buildingId" disabled readonly />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
-            <el-form-item label="主力基价(元/㎡)">
-              <el-input v-model="form.mainPrice" />
+            <el-form-item label="项目名称">
+              <el-input v-model="form.communityName" disabled readonly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="主力租金(元/月·㎡)">
-              <el-input v-model="form.mainPriceRent" />
+            <el-form-item label="办公项目地址">
+              <el-input v-model="form.communityAddress" disabled readonly />
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row :gutter="20">
+          <!-- <el-col :span="24">
+            <el-form-item label="楼栋地址">
+              <el-input v-model="form.buildingAddress" disabled readonly />
+            </el-form-item>
+          </el-col>-->
+          <el-col :span="24">
+            <el-form-item label="楼栋地址">
+              <el-input v-model="form.complexRegion" disabled readonly />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="建成年代">
+              <el-input v-model="form.year" disabled readonly />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="年份修正系数">
+              <el-input v-model="form.yearCoefficient" disabled readonly />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="平均面积">
+              <el-input v-model="form.avgArea" disabled readonly />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="面积修正系数">
+              <el-input v-model="form.areaCoefficient" disabled readonly />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="地上层数/总层数">
+              <el-input v-model="form.complexFloorInfo" disabled readonly />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="办公分类-办公等级">
+              <el-input v-model="form.complexOfficeInfo" disabled readonly />
+            </el-form-item>
+          </el-col>
+        </el-row>
+
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="主力基价涨跌幅">
-              <el-input v-model="form.mainPricePst" />
+              <el-input v-model="form.mainPricePst" disabled readonly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="主力租金涨跌幅">
-              <el-input v-model="form.mainPriceRentPst" />
+              <el-input v-model="form.mainPriceRentPst" disabled readonly />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="主力基价类型">
-              <el-input v-model="form.mainPriceType" />
+              <el-input v-model="form.mainPriceType" disabled readonly />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="主力租金类型">
-              <el-input v-model="form.mainPriceRentType" />
+              <el-input v-model="form.mainPriceRentType" disabled readonly />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="基价楼栋系数">
+              <el-input v-model="form.buildingCoefficient" disabled readonly />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="是否标准楼栋">
+              <el-input
+                v-model="form.standardBuilding"
+                disabled
+                readonly
+                :formatter="yesOrNotFormatter"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="主力基价(上期)" prop="mainPrice_1">
+              <el-input v-model="form.mainPrice_1" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="主力租金(上期)" prop="mainPriceRent_1">
+              <el-input v-model="form.mainPriceRent_1" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="主力基价(元/㎡)" prop="mainPrice">
+              <el-input v-model="form.mainPrice" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="主力租金(元/月·㎡)" prop="mainPriceRent">
+              <el-input v-model="form.mainPriceRent" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="更改价格说明">
+              <el-input v-model="form.adjustPriceComment" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -190,7 +275,13 @@
       </div>
     </el-dialog>
 
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
+    <el-dialog
+      :title="upload.title"
+      :visible.sync="upload.open"
+      width="80%"
+      top="10vh"
+      append-to-body
+    >
       <el-upload
         ref="upload"
         :limit="1"
@@ -241,6 +332,19 @@ export default {
         callback();
       }
     };
+    var checkPrice = (rule, value, callback) => {
+      if (!value) {
+        callback(new Error("请输入价格"));
+      } else if (value === "" || isNaN(parseFloat(value))) {
+        callback(new Error("请输入价格"));
+      } else {
+        if (value <= 0) {
+          callback(new Error("请输入合理价格"));
+        } else {
+          callback();
+        }
+      }
+    };
 
     return {
       // 遮罩层
@@ -254,7 +358,7 @@ export default {
       // 总条数
       total: 0,
       // 办公基价表格数据
-      ultimateList: [],
+      dataList: [],
       // 弹出层标题
       title: "",
       // 是否显示弹出层
@@ -293,6 +397,28 @@ export default {
           { validator: checkYearMonth, trigger: "blur" },
           { validator: checkYearMonth, trigger: "change" }
         ]
+      },
+      updateRules: {
+        yearMonth: [
+          { validator: checkYearMonth, trigger: "blur" },
+          { validator: checkYearMonth, trigger: "change" }
+        ],
+        mainPrice: [
+          { validator: checkPrice, trigger: "blur" },
+          { validator: checkPrice, trigger: "change" }
+        ],
+        mainPriceRent: [
+          { validator: checkPrice, trigger: "blur" },
+          { validator: checkPrice, trigger: "change" }
+        ],
+        mainPrice_1: [
+          { validator: checkPrice, trigger: "blur" },
+          { validator: checkPrice, trigger: "change" }
+        ],
+        mainPriceRent_1: [
+          { validator: checkPrice, trigger: "blur" },
+          { validator: checkPrice, trigger: "change" }
+        ]
       }
     };
   },
@@ -375,7 +501,25 @@ export default {
       this.reset();
       const id = row.id || this.ids;
       const yearMonth = row.yearMonth;
+      console.log(yearMonth);
       getById(yearMonth, id).then(response => {
+        // 复合信息
+        response.data.complexRegion =
+          response.data.countyName +
+          "-" +
+          response.data.blockName +
+          "-" +
+          response.data.loopName +
+          "-" +
+          response.data.streetName +
+          "-" +
+          response.data.buildingAddress;
+        // 办公信息
+        response.data.complexOfficeInfo =
+          response.data.officeClass + "-" + response.data.officeLevel;
+        // 层数信息
+        response.data.complexFloorInfo =
+          response.data.upperFloorSum + "-" + response.data.totalFloorSum;
         this.form = response.data;
         this.open = true;
         this.title = "修改办公基价";
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 83d4facdd..65754dd0b 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
@@ -76,15 +76,15 @@ public class UltimateOfficeBasePriceController extends BaseController {
         return AjaxResult.success(officeBasePriceUltimateService.getById(yearMonth, id));
     }
 
-//    /**
-//     * 修改办公基价
-//     */
-//    @PreAuthorize("@ss.hasPermi('system:user:edit')")
-//    @Log(title = "办公基价", businessType = BusinessType.UPDATE)
-//    @PutMapping
-//    public AjaxResult edit(@RequestBody UltimateOfficeBasePrice officeBasePriceUltimate) {
-//        return toAjax(officeBasePriceUltimateService.updateOfficeBasePriceUltimate(officeBasePriceUltimate));
-//    }
+    /**
+     * 修改办公基价
+     */
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
+    @Log(title = "办公基价", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody UltimateOfficeBasePrice officeBasePriceUltimate) {
+        return toAjax(officeBasePriceUltimateService.update(officeBasePriceUltimate));
+    }
 
     /**
      * 导出办公基价列表
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/OfficeBasePriceModifyModel.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/OfficeBasePriceModifyModel.java
new file mode 100644
index 000000000..d19611b28
--- /dev/null
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/OfficeBasePriceModifyModel.java
@@ -0,0 +1,67 @@
+package com.ruoyi.project.data.price.domain;
+
+import java.math.BigDecimal;
+
+public class OfficeBasePriceModifyModel {
+    private Integer id;
+    private Integer yearMonth;
+    private BigDecimal mainPrice;
+    private BigDecimal mainPricePst;
+    private BigDecimal mainPriceRent;
+    private BigDecimal mainPriceRentPst;
+    private String comment;
+
+    public OfficeBasePriceModifyModel(Integer id, Integer yearMonth) {
+        this.id = id;
+        this.yearMonth = yearMonth;
+    }
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public Integer getYearMonth() {
+        return yearMonth;
+    }
+
+    public BigDecimal getMainPrice() {
+        return mainPrice;
+    }
+
+    public void setMainPrice(BigDecimal mainPrice) {
+        this.mainPrice = mainPrice;
+    }
+
+    public BigDecimal getMainPricePst() {
+        return mainPricePst;
+    }
+
+    public void setMainPricePst(BigDecimal mainPricePst) {
+        this.mainPricePst = mainPricePst;
+    }
+
+    public BigDecimal getMainPriceRent() {
+        return mainPriceRent;
+    }
+
+    public void setMainPriceRent(BigDecimal mainPriceRent) {
+        this.mainPriceRent = mainPriceRent;
+    }
+
+    public BigDecimal getMainPriceRentPst() {
+        return mainPriceRentPst;
+    }
+
+    public void setMainPriceRentPst(BigDecimal mainPriceRentPst) {
+        this.mainPriceRentPst = mainPriceRentPst;
+    }
+
+    public String getComment() {
+        return comment;
+    }
+
+    public void setComment(String comment) {
+        this.comment = comment;
+    }
+}
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/UltimateOfficeBasePrice.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/UltimateOfficeBasePrice.java
index 0cfa793d0..a6d320125 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/UltimateOfficeBasePrice.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/domain/UltimateOfficeBasePrice.java
@@ -34,13 +34,13 @@ public class UltimateOfficeBasePrice extends BaseEntity {
     private String communityAddress;
     @Excel(name = "楼栋地址")
     private String buildingAddress;
-    @Excel(name = "楼栋地址")
+    @Excel(name = "区域")
     private String countyName;
-    @Excel(name = "板块地址")
+    @Excel(name = "板块")
     private String blockName;
-    @Excel(name = "街道地址")
+    @Excel(name = "街道")
     private String streetName;
-    @Excel(name = "环线地址")
+    @Excel(name = "环线")
     private String loopName;
     @Excel(name = "建成年代")
     private Integer year;
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 a5019875f..949d7ff77 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
@@ -5,6 +5,7 @@ import java.util.List;
 
 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;
 
 /**
@@ -21,7 +22,14 @@ public interface UltimateOfficeBasePriceMapper {
      * @param id
      * @return
      */
-    UltimateOfficeBasePrice getById(Integer yearMonth, Integer id);
+    UltimateOfficeBasePrice getById(Integer yearMonth, Integer lastYearMonth, Integer id);
+
+    /**
+     * @param yearMonth
+     * @param id
+     * @return
+     */
+    UltimateOfficeBasePrice getByRouteId(Integer yearMonth, Integer id);
 
     /**
      * @param yearMonth
@@ -47,16 +55,12 @@ public interface UltimateOfficeBasePriceMapper {
     Integer getCount(UltimateOfficeBasePrice officeBasePriceUltimate);
 
     /**
-     * 更新
+     * 更新当期基价
      *
-     * @param yearMonth
-     * @param id
-     * @param mainPrice
-     * @param mainPriceRent
+     * @param officeBasePriceModifyModel
      * @return
      */
-    int update(Integer yearMonth, Integer lastYearMonth, int id, BigDecimal mainPrice, BigDecimal mainPriceRent);
-
+    int updateBasePrice(OfficeBasePriceModifyModel officeBasePriceModifyModel);
 
     /**
      * 年月
@@ -65,13 +69,4 @@ public interface UltimateOfficeBasePriceMapper {
      */
     List<VueSelectModel> getYearMonthList();
 
-    /**
-     * 更新
-     *
-     * @param yearMonth
-     * @param id
-     * @return
-     */
-    int copyCreate(Integer yearMonth, Integer id);
-
 }
diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/service/IUltimateOfficeBasePriceService.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/service/IUltimateOfficeBasePriceService.java
index 80b7b4ba4..c90dae07e 100644
--- a/ruoyi/src/main/java/com/ruoyi/project/data/price/service/IUltimateOfficeBasePriceService.java
+++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/service/IUltimateOfficeBasePriceService.java
@@ -24,29 +24,27 @@ public interface IUltimateOfficeBasePriceService {
     int selectOfficeBasePriceUltimateListCount(UltimateOfficeBasePrice officeBasePriceUltimate);
 
     /**
-     *
      * @param id
      * @return
      */
     UltimateOfficeBasePrice getById(Integer yearMonth, Integer id);
 
-//    /**
-//     *
-//     * @param officeBasePriceUltimate
-//     * @return
-//     */
-//    int updateOfficeBasePriceUltimate(UltimateOfficeBasePrice officeBasePriceUltimate);
+    /**
+     * 可能修改当期的价格、也可能修改往期
+     *
+     * @param officeBasePriceUltimate
+     * @return
+     */
+    int update(UltimateOfficeBasePrice officeBasePriceUltimate);
 
     /**
-     *
      * @param officeBasePriceUltimates
      * @param operName
      * @return
      */
-    String batchImport(Integer yearMonth, List<UltimateOfficeBasePrice> officeBasePriceUltimates,String operName);
+    String batchImport(Integer yearMonth, List<UltimateOfficeBasePrice> officeBasePriceUltimates, String operName);
 
     /**
-     *
      * @return
      */
     List<VueSelectModel> getYearMonthList();
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 d51187bb7..20f8f27ed 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
@@ -7,6 +7,7 @@ import java.util.List;
 import com.ruoyi.common.exception.CustomException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.project.common.VueSelectModel;
+import com.ruoyi.project.data.price.domain.OfficeBasePriceModifyModel;
 import com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice;
 import com.ruoyi.project.data.price.mapper.UltimateOfficeBasePriceMapper;
 import com.ruoyi.project.data.price.service.IUltimateOfficeBasePriceService;
@@ -56,7 +57,8 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
 
     @Override
     public UltimateOfficeBasePrice getById(Integer yearMonth, Integer id) {
-        return officeBasePriceUltimateMapper.getById(yearMonth, id);
+        Integer lastYearMonth = getLastYearMonth(yearMonth);
+        return officeBasePriceUltimateMapper.getById(yearMonth, lastYearMonth, id);
     }
 
     @Override
@@ -72,32 +74,29 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
         StringBuilder failureMsg = new StringBuilder();
         Integer lastYearMonth = getLastYearMonth(yearMonth);
 
-        for (UltimateOfficeBasePrice officeBasePriceUltimate : officeBasePriceUltimates) {
+        for (UltimateOfficeBasePrice inputModel : officeBasePriceUltimates) {
             try {
                 // 验证是否存在这个用户
-                UltimateOfficeBasePrice officeBasePriceUltimateInDb =
-                        officeBasePriceUltimateMapper.getById(yearMonth, officeBasePriceUltimate.getId());
+                UltimateOfficeBasePrice currentUltimateOfficeBasePrice =
+                        officeBasePriceUltimateMapper.getById(yearMonth, lastYearMonth,
+                                inputModel.getId());
                 UltimateOfficeBasePrice lastUltimateOfficeBasePrice =
                         officeBasePriceUltimateMapper.getByBuildingId(lastYearMonth,
-                                officeBasePriceUltimate.getBuildingId());
-                if (!StringUtils.isNotNull(officeBasePriceUltimateInDb)) {
-                    if (officeBasePriceUltimateInDb.getMainPrice().subtract(officeBasePriceUltimate.getMainPrice()).compareTo(BigDecimal.ZERO) != 0
-                            || officeBasePriceUltimateInDb.getMainPriceRent().subtract(officeBasePriceUltimate.getMainPriceRent()).compareTo(BigDecimal.ZERO) != 0) {
-                        int id = officeBasePriceUltimateMapper.copyCreate(yearMonth, officeBasePriceUltimate.getId());
-
-                        officeBasePriceUltimateMapper.update(yearMonth, lastYearMonth, id,
-                                officeBasePriceUltimate.getMainPrice(),
-                                officeBasePriceUltimate.getMainPriceRent());
+                                inputModel.getBuildingId());
+                if (!StringUtils.isNotNull(currentUltimateOfficeBasePrice)) {
+                    if (currentUltimateOfficeBasePrice.getMainPrice().subtract(inputModel.getMainPrice()).compareTo(BigDecimal.ZERO) != 0
+                            || currentUltimateOfficeBasePrice.getMainPriceRent().subtract(inputModel.getMainPriceRent()).compareTo(BigDecimal.ZERO) != 0) {
+                        updateBasePrice(inputModel, currentUltimateOfficeBasePrice, lastUltimateOfficeBasePrice);
                         successNum++;
-                        successMsg.append("<br/>" + successNum + "、ID= " + officeBasePriceUltimate.getId() + " 更新成功");
+                        successMsg.append("<br/>" + successNum + "、ID= " + inputModel.getId() + " 更新成功");
                     }
                 } else {
                     failureNum++;
-                    failureMsg.append("<br/>" + failureNum + "、ID= " + officeBasePriceUltimate.getId() + " 失败");
+                    failureMsg.append("<br/>" + failureNum + "、ID= " + inputModel.getId() + " 失败");
                 }
             } catch (Exception e) {
                 failureNum++;
-                String msg = "<br/>" + failureNum + "、ID= " + officeBasePriceUltimate.getId() + " 导入失败:";
+                String msg = "<br/>" + failureNum + "、ID= " + inputModel.getId() + " 导入失败:";
                 failureMsg.append(msg + e.getMessage());
                 log.error(msg, e);
             }
@@ -115,4 +114,78 @@ public class UltimateOfficeBasePriceServiceImpl implements IUltimateOfficeBasePr
     public List<VueSelectModel> getYearMonthList() {
         return officeBasePriceUltimateMapper.getYearMonthList();
     }
+
+    /**
+     * 更新
+     *
+     * @param officeBasePriceUltimate
+     * @return
+     */
+    @Override
+    public int update(UltimateOfficeBasePrice officeBasePriceUltimate) {
+        // 当期价格
+        Integer lastYearMonth = getLastYearMonth(officeBasePriceUltimate.getYearMonth());
+        UltimateOfficeBasePrice ultimateOfficeBasePrice =
+                officeBasePriceUltimateMapper.getByRouteId(officeBasePriceUltimate.getYearMonth(),
+                        officeBasePriceUltimate.getId());
+        // 上期价格
+        UltimateOfficeBasePrice lastUltimateOfficeBasePrice =
+                officeBasePriceUltimateMapper.getByBuildingId(lastYearMonth,
+                        officeBasePriceUltimate.getBuildingId());
+
+        updateBasePrice(officeBasePriceUltimate, ultimateOfficeBasePrice, lastUltimateOfficeBasePrice);
+
+        return 1;
+    }
+
+    /**
+     * 基价更新
+     *
+     * @param inputModel
+     * @param currentUltimateOfficeBasePrice
+     * @param lastUltimateOfficeBasePrice
+     */
+    private void updateBasePrice(UltimateOfficeBasePrice inputModel,
+                                 UltimateOfficeBasePrice currentUltimateOfficeBasePrice,
+                                 UltimateOfficeBasePrice lastUltimateOfficeBasePrice) {
+        // 上期价格比较
+        if (StringUtils.isNotNull(lastUltimateOfficeBasePrice) &&
+                StringUtils.isNotNull(lastUltimateOfficeBasePrice.getMainPrice()) &&
+                StringUtils.isNotNull(lastUltimateOfficeBasePrice.getMainPriceRent()) &&
+                (lastUltimateOfficeBasePrice.getMainPrice().compareTo(inputModel.getMainPrice_1()) != 0 ||
+                        lastUltimateOfficeBasePrice.getMainPriceRent().compareTo(inputModel.getMainPriceRent_1()) != 0)) {
+            OfficeBasePriceModifyModel officeBasePriceModifyModel =
+                    new OfficeBasePriceModifyModel(lastUltimateOfficeBasePrice.getId(),
+                            lastUltimateOfficeBasePrice.getYearMonth());
+            officeBasePriceModifyModel.setMainPrice(inputModel.getMainPrice_1());
+            officeBasePriceModifyModel.setMainPricePst(lastUltimateOfficeBasePrice.getMainPricePst());
+            officeBasePriceModifyModel.setMainPriceRent(inputModel.getMainPriceRent_1());
+            officeBasePriceModifyModel.setMainPriceRentPst(lastUltimateOfficeBasePrice.getMainPriceRentPst());
+            // 上期价格
+            officeBasePriceUltimateMapper.updateBasePrice(officeBasePriceModifyModel);
+        }
+
+        // 本期价格比较
+        if (StringUtils.isNotNull(currentUltimateOfficeBasePrice) &&
+                StringUtils.isNotNull(currentUltimateOfficeBasePrice.getMainPrice()) &&
+                StringUtils.isNotNull(currentUltimateOfficeBasePrice.getMainPriceRent()) &&
+                (currentUltimateOfficeBasePrice.getMainPrice().compareTo(inputModel.getMainPrice()) != 0 ||
+                        currentUltimateOfficeBasePrice.getMainPriceRent().compareTo(inputModel.getMainPriceRent()) != 0)) {
+            OfficeBasePriceModifyModel officeBasePriceModifyModel = new OfficeBasePriceModifyModel(inputModel.getId()
+                    , inputModel.getYearMonth());
+            officeBasePriceModifyModel.setMainPrice(inputModel.getMainPrice());
+            BigDecimal mainPricePst =
+                    inputModel.getMainPrice().divide(lastUltimateOfficeBasePrice.getMainPrice(), 4);
+            officeBasePriceModifyModel.setMainPricePst(mainPricePst);
+            officeBasePriceModifyModel.setMainPriceRent(inputModel.getMainPriceRent());
+            BigDecimal mainPriceRentPst =
+                    inputModel.getMainPriceRent().divide(lastUltimateOfficeBasePrice.getMainPriceRent(),
+                            4);
+            officeBasePriceModifyModel.setMainPriceRentPst(mainPriceRentPst);
+            if(StringUtils.isNotNull(inputModel.getAdjustPriceComment()))
+                officeBasePriceModifyModel.setComment(inputModel.getAdjustPriceComment());
+            // 上期价格
+            officeBasePriceUltimateMapper.updateBasePrice(officeBasePriceModifyModel);
+        }
+    }
 }
diff --git a/ruoyi/src/main/resources/application-druid.yml b/ruoyi/src/main/resources/application-druid.yml
index b9a63c229..6f4d33ff9 100644
--- a/ruoyi/src/main/resources/application-druid.yml
+++ b/ruoyi/src/main/resources/application-druid.yml
@@ -33,16 +33,13 @@ spring:
                 testOnReturn: false
                 webStatFilter:
                     enabled: true
-                filter:
-                    stat:
-                        enabled: true
-                        # 慢SQL记录
-                        log-slow-sql: true
-                        slow-sql-millis: 1000
-                        merge-sql: true
-                    wall:
-                        config:
-                            multi-statement-allow: true
+                filters: stat,wall
+                wall:
+                    multiStatementAllow: true
+                stat:
+                    log-slow-sql: true
+                    slow-sql-millis: 1000
+                    merge-sql: true
             primary: master
             datasource:
                 # 主库数据源
diff --git a/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml b/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml
index 6b7c998ec..3ba502bd8 100644
--- a/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml
+++ b/ruoyi/src/main/resources/mybatis/data/UltimateOfficeBasePriceMapper.xml
@@ -23,7 +23,6 @@
         <result property="areaCoefficient" column="AreaCoff"/>
         <result property="yearCoefficient" column="YearCoff"/>
         <result property="buildingCoefficient" column="BuildingCoff"/>
-
         <result property="communityName" column="ProjectName"/>
         <result property="communityAddress" column="ProjectAddr"/>
         <result property="buildingAddress" column="BuildingAddr"/>
@@ -41,7 +40,7 @@
         <result property="mainPriceRent_1" column="mainPriceRent_1"/>
     </resultMap>
 
-    <sql id="selectOfficeBasePriceUltimateVo">
+    <sql id="getById">
         SELECT a.ID
                 ,a.BuildingID_P
                 ,a.ProjectID_P
@@ -77,68 +76,81 @@
         FROM ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} a
         left join DIM_OFFICE_PROJECT_BUILDING_201909 b on a.BuildingID_P=b.BuildingID_P
         left join ODS_OFFICE_BUILDING_PRICE_INFO_${lastYearMonth} c on a.BuildingID_P = c.BuildingID_P
-        WHERE b.EffDate <![CDATA[ <= ]]> getdate() AND b.ExpirDate <![CDATA[ > ]]> getdate() AND A.STATUS=1 AND
-        c.Status=1
+        WHERE b.EffDate <![CDATA[ <= ]]> getdate() AND b.ExpirDate <![CDATA[ > ]]> getdate() AND c.Status=1
     </sql>
 
     <select id="getCount" parameterType="com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice" resultType="int">
         select count(1) FROM ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} a
         left join DIM_OFFICE_PROJECT_BUILDING_201909 b on a.BuildingID_P=b.BuildingID_P
         left join ODS_OFFICE_BUILDING_PRICE_INFO_${lastYearMonth} c on a.BuildingID_P = c.BuildingID_P
-        WHERE b.EffDate <![CDATA[ <= ]]> getdate() AND b.ExpirDate <![CDATA[ > ]]> getdate() AND A.STATUS=1 AND
-        c.Status=1
-        <where>
-            <if test="communityId != null">
-               AND a.PROJECTID_P = #{communityId}
-            </if>
-            <if test="buildingId != null">
-                AND a.BUILDINGID_P = #{buildingId}
-            </if>
-            <if test="status != null">
-                AND a.STATUS = #{status}
-            </if>
-        </where>
+        WHERE b.EffDate <![CDATA[ <= ]]> getdate() AND b.ExpirDate <![CDATA[ > ]]> getdate() AND c.Status=1
+        <if test="communityId != null">
+           AND a.PROJECTID_P = #{communityId}
+        </if>
+        <if test="buildingId != null">
+            AND a.BUILDINGID_P = #{buildingId}
+        </if>
+        <if test="status != null">
+            AND a.STATUS = #{status}
+        </if>
     </select>
 
     <select id="getList" parameterType="com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice"
             resultMap="OfficeBasePriceUltimateResult">
-        <include refid="selectOfficeBasePriceUltimateVo"/>
-        <where>
-            <if test="communityId != null">
-               AND a.PROJECTID_P = #{communityId}
-            </if>
-            <if test="buildingId != null">
-                AND a.BUILDINGID_P = #{buildingId}
-            </if>
-            <if test="status != null">
-                AND a.STATUS = #{status}
-            </if>
-        </where>
+        <include refid="getById"/>
+        <if test="communityId != null">
+           AND a.PROJECTID_P = #{communityId}
+        </if>
+        <if test="buildingId != null">
+            AND a.BUILDINGID_P = #{buildingId}
+        </if>
+        <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;
     </select>
 
-    <select id="getById" parameterType="String" resultMap="OfficeBasePriceUltimateResult">
-        <include refid="selectOfficeBasePriceUltimateVo"/>
-        where id = #{id}
+    <select id="getById" resultMap="OfficeBasePriceUltimateResult">
+        <include refid="getById"/>
+        <if test="id != null">
+            AND a.id=#{id}
+        </if>
     </select>
 
-    <insert id="copyCreate">
-        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
-            SELECT LAST_INSERT_ID()
-        </selectKey>
-        insert into
-        dbo.ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth}(BuildingID,UnifiedID,ProjectID,BuildingID_P,ProjectID_P,MainPrice,MainPriceRent,MainPricePst,MainPriceRentPst,MainPriceType,MainPriceRentType,ModifyDate,Status,BuildingStd,AdjEvd)
-        select BuildingID,UnifiedID,ProjectID,BuildingID_P,ProjectID_P,MainPrice,MainPriceRent,MainPricePst,MainPriceRentPst,MainPriceType,MainPriceRentType,ModifyDate,0,BuildingStd,AdjEvd
-        from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth}
-        where id=#{id}
-    </insert>
-    <!-- 更新 -->
-    <update id="update">
-        update a set ModifyDate=getdate(), mainPrice=#{mainPrice}, mainPriceRent=#{mainPriceRent},
-        mainPricePst = #{mainPrice} * 1.0 / b.mainPrice, mainPriceRentPst = #{mainPriceRentPst} * 1.0 / b.mainPriceRentPst
-        from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} a join ODS_OFFICE_BUILDING_PRICE_INFO_${lastYearMonth} b on
-        a.BuildingID_p=b.BuildingID_P
-        where a.Status=1 and b.Status=1 and a.id=#{id}
+    <!-- 更新基价 -->
+    <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
+              ,UnifiedID
+              ,ProjectID
+              ,BuildingID_P
+              ,ProjectID_P
+              ,MainPrice
+              ,MainPriceRent
+              ,MainPricePst
+              ,MainPriceRentPst
+              ,MainPriceType
+              ,MainPriceRentType
+              ,ModifyDate
+              ,Status
+              ,BuildingStd
+              ,AdjEvd)
+          select BuildingID
+              ,UnifiedID
+              ,ProjectID
+              ,BuildingID_P
+              ,ProjectID_P
+              ,#{mainPrice}
+              ,#{mainPriceRent}
+              ,#{mainPricePst}
+              ,#{mainPriceRentPst}
+              ,MainPriceType
+              ,MainPriceRentType
+              ,getdate()
+              ,1
+              ,BuildingStd
+              ,#{comment}
+            from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth} where id=#{id};
     </update>
 
     <!-- 获取表名   -->
@@ -149,9 +161,39 @@
         order by cast(right(name,6) as int) desc
     </select>
     <!--    -->
-    <select id="getByBuildingId" resultType="com.ruoyi.project.data.price.controller.UltimateOfficeBasePriceController">
-        select id,MainPrice,MainPriceRent
+    <select id="getByBuildingId" resultType="com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice">
+        select ID
+              ,BuildingID_P as buildingId
+              ,ProjectID_P as communityId
+              ,MainPrice as mainPrice
+              ,MainPriceRent as mainPriceRent
+              ,MainPricePst as mainPricePst
+              ,MainPriceRentPst as mainPriceRentPst
+              ,MainPriceType as mainPriceType
+              ,MainPriceRentType as mainPriceRentType
+              ,Status as status
+              ,BuildingStd as isStandardBuilding
+              ,AdjEvd as adjustPriceComment
+              ,${yearMonth} as yearMonth
         from ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth}
-        where BuildingID_P=#{buildingI}
+        where BuildingID_P=#{buildingId} AND status= 1
+    </select>
+    <!-- 查询价格 -->
+    <select id="getByRouteId" resultType="com.ruoyi.project.data.price.domain.UltimateOfficeBasePrice">
+        SELECT ID
+              ,BuildingID_P as buildingId
+              ,ProjectID_P as communityId
+              ,MainPrice as mainPrice
+              ,MainPriceRent as mainPriceRent
+              ,MainPricePst as mainPricePst
+              ,MainPriceRentPst as mainPriceRentPst
+              ,MainPriceType as mainPriceType
+              ,MainPriceRentType as mainPriceRentType
+              ,Status as status
+              ,BuildingStd as isStandardBuilding
+              ,AdjEvd as adjustPriceComment
+              ,${yearMonth} as yearMonth
+        FROM dbo.ODS_OFFICE_BUILDING_PRICE_INFO_${yearMonth}
+        WHERE ID=#{id}
     </select>
 </mapper>
\ No newline at end of file