diff --git a/ruoyi-ui/src/api/data/ultimateOfficeBasePrice.js b/ruoyi-ui/src/api/data/ultimateOfficeBasePrice.js new file mode 100644 index 000000000..3518a1663 --- /dev/null +++ b/ruoyi-ui/src/api/data/ultimateOfficeBasePrice.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询【请填写功能名称】列表 +export function listUltimate(query) { + return request({ + url: '/data/compute/price/office/list', + method: 'get', + params: query + }) +} + +// 查询【请填写功能名称】详细 +export function getUltimate(id) { + return request({ + url: '/data/compute/price/office/' + id, + method: 'get' + }) +} + +// // 新增【请填写功能名称】 +// export function addUltimate(data) { +// return request({ +// url: '/data/compute/price/office', +// method: 'post', +// data: data +// }) +// } + +// 修改【请填写功能名称】 +export function updateUltimate(data) { + return request({ + url: '/data/compute/price/office', + method: 'put', + data: data + }) +} + +// // 删除【请填写功能名称】 +// export function delUltimate(id) { +// return request({ +// url: '/data/compute/price/office/' + id, +// method: 'delete' +// }) +// } + +// 导出【请填写功能名称】 +export function exportUltimate(query) { + return request({ + url: '/data/compute/price/office/export', + method: 'get', + params: query + }) +} diff --git a/ruoyi-ui/src/views/data/basis/basicInfoForm.vue b/ruoyi-ui/src/views/data/basis/basicInfoForm.vue new file mode 100644 index 000000000..757962c44 --- /dev/null +++ b/ruoyi-ui/src/views/data/basis/basicInfoForm.vue @@ -0,0 +1,61 @@ +<template> + <el-form ref="basicInfoForm" :model="info" :rules="rules" label-width="150px"> + <el-row> + <el-col :span="12"> + <el-form-item label="表名称" prop="tableName"> + <el-input placeholder="请输入仓库名称" v-model="info.tableName" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="表描述" prop="tableComment"> + <el-input placeholder="请输入" v-model="info.tableComment" /> + </el-form-item> + </el-col> + + <el-col :span="12"> + <el-form-item label="实体类名称" prop="className"> + <el-input placeholder="请输入" v-model="info.className" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="作者" prop="functionAuthor"> + <el-input placeholder="请输入" v-model="info.functionAuthor" /> + </el-form-item> + </el-col> + <el-col :span="24"> + <el-form-item label="备注" prop="remark"> + <el-input type="textarea" :rows="3" v-model="info.remark"></el-input> + </el-form-item> + </el-col> + </el-row> + </el-form> +</template> +<script> +export default { + name: "BasicInfoForm", + props: { + info: { + type: Object, + default: null + } + }, + data() { + return { + rules: { + tableName: [ + { required: true, message: "请输入表名称", trigger: "blur" } + ], + tableComment: [ + { required: true, message: "请输入表描述", trigger: "blur" } + ], + className: [ + { required: true, message: "请输入实体类名称", trigger: "blur" } + ], + functionAuthor: [ + { required: true, message: "请输入作者", trigger: "blur" } + ] + } + }; + } +}; +</script> diff --git a/ruoyi-ui/src/views/data/basis/editTable.vue b/ruoyi-ui/src/views/data/basis/editTable.vue new file mode 100644 index 000000000..425ffddb6 --- /dev/null +++ b/ruoyi-ui/src/views/data/basis/editTable.vue @@ -0,0 +1,217 @@ +<template> + <el-card> + <el-tabs v-model="activeName"> + <el-tab-pane label="基本信息" name="basic"> + <basic-info-form ref="basicInfo" :info="info" /> + </el-tab-pane> + <el-tab-pane label="字段信息" name="cloum"> + <el-table ref="dragTable" :data="cloumns" row-key="columnId" :max-height="tableHeight"> + <el-table-column label="序号" type="index" min-width="5%" class-name="allowDrag" /> + <el-table-column + label="字段列名" + prop="columnName" + min-width="10%" + :show-overflow-tooltip="true" + /> + <el-table-column label="字段描述" min-width="10%"> + <template slot-scope="scope"> + <el-input v-model="scope.row.columnComment"></el-input> + </template> + </el-table-column> + <el-table-column + label="物理类型" + prop="columnType" + min-width="10%" + :show-overflow-tooltip="true" + /> + <el-table-column label="Java类型" min-width="11%"> + <template slot-scope="scope"> + <el-select v-model="scope.row.javaType"> + <el-option label="Long" value="Long" /> + <el-option label="String" value="String" /> + <el-option label="Integer" value="Integer" /> + <el-option label="Double" value="Double" /> + <el-option label="BigDecimal" value="BigDecimal" /> + <el-option label="Date" value="Date" /> + </el-select> + </template> + </el-table-column> + <el-table-column label="java属性" min-width="10%"> + <template slot-scope="scope"> + <el-input v-model="scope.row.javaField"></el-input> + </template> + </el-table-column> + + <el-table-column label="插入" min-width="5%"> + <template slot-scope="scope"> + <el-checkbox true-label="1" v-model="scope.row.isInsert"></el-checkbox> + </template> + </el-table-column> + <el-table-column label="编辑" min-width="5%"> + <template slot-scope="scope"> + <el-checkbox true-label="1" v-model="scope.row.isEdit"></el-checkbox> + </template> + </el-table-column> + <el-table-column label="列表" min-width="5%"> + <template slot-scope="scope"> + <el-checkbox true-label="1" v-model="scope.row.isList"></el-checkbox> + </template> + </el-table-column> + <el-table-column label="查询" min-width="5%"> + <template slot-scope="scope"> + <el-checkbox true-label="1" v-model="scope.row.isQuery"></el-checkbox> + </template> + </el-table-column> + <el-table-column label="查询方式" min-width="10%"> + <template slot-scope="scope"> + <el-select v-model="scope.row.queryType"> + <el-option label="=" value="EQ" /> + <el-option label="!=" value="NE" /> + <el-option label=">" value="GT" /> + <el-option label=">=" value="GTE" /> + <el-option label="<" value="LT" /> + <el-option label="<=" value="LTE" /> + <el-option label="LIKE" value="LIKE" /> + <el-option label="BETWEEN" value="BETWEEN" /> + </el-select> + </template> + </el-table-column> + <el-table-column label="必填" min-width="5%"> + <template slot-scope="scope"> + <el-checkbox true-label="1" v-model="scope.row.isRequired"></el-checkbox> + </template> + </el-table-column> + <el-table-column label="显示类型" min-width="12%"> + <template slot-scope="scope"> + <el-select v-model="scope.row.htmlType"> + <el-option label="文本框" value="input" /> + <el-option label="文本域" value="textarea" /> + <el-option label="下拉框" value="select" /> + <el-option label="单选框" value="radio" /> + <el-option label="复选框" value="checkbox" /> + <el-option label="日期控件" value="datetime" /> + </el-select> + </template> + </el-table-column> + <el-table-column label="字典类型" min-width="12%"> + <template slot-scope="scope"> + <el-select v-model="scope.row.dictType" clearable filterable placeholder="请选择"> + <el-option + v-for="dict in dictOptions" + :key="dict.dictType" + :label="dict.dictName" + :value="dict.dictType"> + <span style="float: left">{{ dict.dictName }}</span> + <span style="float: right; color: #8492a6; font-size: 13px">{{ dict.dictType }}</span> + </el-option> + </el-select> + </template> + </el-table-column> + </el-table> + </el-tab-pane> + <el-tab-pane label="生成信息" name="genInfo"> + <gen-info-form ref="genInfo" :info="info" /> + </el-tab-pane> + </el-tabs> + <el-form label-width="100px"> + <el-form-item style="text-align: center;margin-left:-100px;margin-top:10px;"> + <el-button type="primary" @click="submitForm()">提交</el-button> + <el-button @click="close()">返回</el-button> + </el-form-item> + </el-form> + </el-card> +</template> +<script> +import { getGenTable, updateGenTable } from "@/api/tool/gen"; +import { optionselect as getDictOptionselect } from "@/api/system/dict/type"; +import basicInfoForm from "./basicInfoForm"; +import genInfoForm from "./genInfoForm"; +import Sortable from 'sortablejs' +export default { + name: "GenEdit", + components: { + basicInfoForm, + genInfoForm + }, + data() { + return { + // 选中选项卡的 name + activeName: "cloum", + // 表格的高度 + tableHeight: document.documentElement.scrollHeight - 245 + "px", + // 表列信息 + cloumns: [], + // 字典信息 + dictOptions: [], + // 表详细信息 + info: {} + }; + }, + beforeCreate() { + const { tableId } = this.$route.query; + if (tableId) { + // 获取表详细信息 + getGenTable(tableId).then(res => { + this.cloumns = res.data.rows; + this.info = res.data.info; + }); + /** 查询字典下拉列表 */ + getDictOptionselect().then(response => { + this.dictOptions = response.data; + }); + } + }, + methods: { + /** 提交按钮 */ + submitForm() { + const basicForm = this.$refs.basicInfo.$refs.basicInfoForm; + const genForm = this.$refs.genInfo.$refs.genInfoForm; + Promise.all([basicForm, genForm].map(this.getFormPromise)).then(res => { + const validateResult = res.every(item => !!item); + if (validateResult) { + const genTable = Object.assign({}, basicForm.model, genForm.model); + genTable.columns = this.cloumns; + genTable.params = { + treeCode: genTable.treeCode, + treeName: genTable.treeName, + treeParentCode: genTable.treeParentCode + }; + updateGenTable(genTable).then(res => { + this.msgSuccess(res.msg); + if (res.code === 200) { + this.close(); + } + }); + } else { + this.msgError("表单校验未通过,请重新检查提交内容"); + } + }); + }, + getFormPromise(form) { + return new Promise(resolve => { + form.validate(res => { + resolve(res); + }); + }); + }, + /** 关闭按钮 */ + close() { + this.$store.dispatch("tagsView/delView", this.$route); + this.$router.push({ path: "/tool/gen", query: { t: Date.now()}}) + } + }, + mounted() { + const el = this.$refs.dragTable.$el.querySelectorAll(".el-table__body-wrapper > table > tbody")[0]; + const sortable = Sortable.create(el, { + handle: ".allowDrag", + onEnd: evt => { + const targetRow = this.cloumns.splice(evt.oldIndex, 1)[0]; + this.cloumns.splice(evt.newIndex, 0, targetRow); + for (let index in this.cloumns) { + this.cloumns[index].sort = parseInt(index) + 1; + } + } + }); + } +}; +</script> diff --git a/ruoyi-ui/src/views/data/basis/genInfoForm.vue b/ruoyi-ui/src/views/data/basis/genInfoForm.vue new file mode 100644 index 000000000..9cb3139e4 --- /dev/null +++ b/ruoyi-ui/src/views/data/basis/genInfoForm.vue @@ -0,0 +1,154 @@ +<template> + <el-form ref="genInfoForm" :model="info" :rules="rules" label-width="150px"> + <el-row> + <el-col :span="12"> + <el-form-item prop="tplCategory"> + <span slot="label">生成模板</span> + <el-select v-model="info.tplCategory"> + <el-option label="单表(增删改查)" value="crud" /> + <el-option label="树表(增删改查)" value="tree"/> + </el-select> + </el-form-item> + </el-col> + + <el-col :span="12"> + <el-form-item prop="packageName"> + <span slot="label"> + 生成包路径 + <el-tooltip content="生成在哪个java包下,例如 com.ruoyi.system" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-input v-model="info.packageName" /> + </el-form-item> + </el-col> + + <el-col :span="12"> + <el-form-item prop="moduleName"> + <span slot="label"> + 生成模块名 + <el-tooltip content="可理解为子系统名,例如 system" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-input v-model="info.moduleName" /> + </el-form-item> + </el-col> + + <el-col :span="12"> + <el-form-item prop="businessName"> + <span slot="label"> + 生成业务名 + <el-tooltip content="可理解为功能英文名,例如 user" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-input v-model="info.businessName" /> + </el-form-item> + </el-col> + + <el-col :span="12"> + <el-form-item prop="functionName"> + <span slot="label"> + 生成功能名 + <el-tooltip content="用作类描述,例如 用户" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-input v-model="info.functionName" /> + </el-form-item> + </el-col> + </el-row> + + <el-row v-show="info.tplCategory == 'tree'"> + <h4 class="form-header">其他信息</h4> + <el-col :span="12"> + <el-form-item> + <span slot="label"> + 树编码字段 + <el-tooltip content="树显示的编码字段名, 如:dept_id" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-select v-model="info.treeCode" placeholder="请选择"> + <el-option + v-for="column in info.columns" + :key="column.columnName" + :label="column.columnName + ':' + column.columnComment" + :value="column.columnName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item> + <span slot="label"> + 树父编码字段 + <el-tooltip content="树显示的父编码字段名, 如:parent_Id" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-select v-model="info.treeParentCode" placeholder="请选择"> + <el-option + v-for="column in info.columns" + :key="column.columnName" + :label="column.columnName + ':' + column.columnComment" + :value="column.columnName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item> + <span slot="label"> + 树名称字段 + <el-tooltip content="树节点的显示名称字段名, 如:dept_name" placement="top"> + <i class="el-icon-question"></i> + </el-tooltip> + </span> + <el-select v-model="info.treeName" placeholder="请选择"> + <el-option + v-for="column in info.columns" + :key="column.columnName" + :label="column.columnName + ':' + column.columnComment" + :value="column.columnName" + ></el-option> + </el-select> + </el-form-item> + </el-col> + </el-row> + </el-form> +</template> +<script> +export default { + name: "BasicInfoForm", + props: { + info: { + type: Object, + default: null + } + }, + data() { + return { + rules: { + tplCategory: [ + { required: true, message: "请选择生成模板", trigger: "blur" } + ], + packageName: [ + { required: true, message: "请输入生成包路径", trigger: "blur" } + ], + moduleName: [ + { required: true, message: "请输入生成模块名", trigger: "blur" } + ], + businessName: [ + { required: true, message: "请输入生成业务名", trigger: "blur" } + ], + functionName: [ + { required: true, message: "请输入生成功能名", trigger: "blur" } + ] + } + }; + }, + created() {} +}; +</script> diff --git a/ruoyi-ui/src/views/data/basis/importTable.vue b/ruoyi-ui/src/views/data/basis/importTable.vue new file mode 100644 index 000000000..a2a8a4dfd --- /dev/null +++ b/ruoyi-ui/src/views/data/basis/importTable.vue @@ -0,0 +1,117 @@ +<template> + <!-- 导入表 --> + <el-dialog title="导入表" :visible.sync="visible" width="800px" top="5vh" append-to-body> + <el-form :model="queryParams" ref="queryForm" :inline="true"> + <el-form-item label="表名称" prop="tableName"> + <el-input + v-model="queryParams.tableName" + placeholder="请输入表名称" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="表描述" prop="tableComment"> + <el-input + v-model="queryParams.tableComment" + placeholder="请输入表描述" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + <el-row> + <el-table @row-click="clickRow" ref="table" :data="dbTableList" @selection-change="handleSelectionChange" height="260px"> + <el-table-column type="selection" width="55"></el-table-column> + <el-table-column prop="tableName" label="表名称"></el-table-column> + <el-table-column prop="tableComment" label="表描述"></el-table-column> + <el-table-column prop="createTime" label="创建时间"></el-table-column> + <el-table-column prop="updateTime" label="更新时间"></el-table-column> + </el-table> + <pagination + v-show="total>0" + :total="total" + :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" + @pagination="getList" + /> + </el-row> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="handleImportTable">确 定</el-button> + <el-button @click="visible = false">取 消</el-button> + </div> + </el-dialog> +</template> + +<script> +import { listDbTable, importTable } from "@/api/tool/gen"; +export default { + data() { + return { + // 遮罩层 + visible: false, + // 选中数组值 + tables: [], + // 总条数 + total: 0, + // 表数据 + dbTableList: [], + // 查询参数 + queryParams: { + pageNum: 1, + pageSize: 10, + tableName: undefined, + tableComment: undefined + } + }; + }, + methods: { + // 显示弹框 + show() { + this.getList(); + this.visible = true; + }, + clickRow(row) { + this.$refs.table.toggleRowSelection(row); + }, + // 多选框选中数据 + handleSelectionChange(selection) { + this.tables = selection.map(item => item.tableName); + }, + // 查询表数据 + getList() { + listDbTable(this.queryParams).then(res => { + if (res.code === 200) { + this.dbTableList = res.rows; + this.total = res.total; + } + }); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.pageNum = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + /** 导入按钮操作 */ + handleImportTable() { + importTable({ tables: this.tables.join(",") }).then(res => { + this.msgSuccess(res.msg); + if (res.code === 200) { + this.visible = false; + this.$emit("ok"); + } + }); + } + } +}; +</script> diff --git a/ruoyi-ui/src/views/data/basis/index.vue b/ruoyi-ui/src/views/data/basis/index.vue new file mode 100644 index 000000000..233e15613 --- /dev/null +++ b/ruoyi-ui/src/views/data/basis/index.vue @@ -0,0 +1,291 @@ +<template> + <div class="app-container"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="表名称" prop="tableName"> + <el-input + v-model="queryParams.tableName" + placeholder="请输入表名称" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="表描述" prop="tableComment"> + <el-input + v-model="queryParams.tableComment" + placeholder="请输入表描述" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="创建时间"> + <el-date-picker + v-model="dateRange" + size="small" + style="width: 240px" + value-format="yyyy-MM-dd" + type="daterange" + range-separator="-" + start-placeholder="开始日期" + end-placeholder="结束日期" + ></el-date-picker> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-download" + size="mini" + @click="handleGenTable" + v-hasPermi="['tool:gen:code']" + >生成</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="info" + icon="el-icon-upload" + size="mini" + @click="openImportTable" + v-hasPermi="['tool:gen:import']" + >导入</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleEditTable" + v-hasPermi="['tool:gen:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['tool:gen:remove']" + >删除</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="tableList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55"></el-table-column> + <el-table-column label="序号" type="index" width="50" align="center"> + <template slot-scope="scope"> + <span>{{(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1}}</span> + </template> + </el-table-column> + <el-table-column + label="表名称" + align="center" + prop="tableName" + :show-overflow-tooltip="true" + width="130" + /> + <el-table-column + label="表描述" + align="center" + prop="tableComment" + :show-overflow-tooltip="true" + width="130" + /> + <el-table-column + label="实体" + align="center" + prop="className" + :show-overflow-tooltip="true" + width="130" + /> + <el-table-column label="创建时间" align="center" prop="createTime" width="160" /> + <el-table-column label="更新时间" align="center" prop="updateTime" width="160" /> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button + type="text" + size="small" + icon="el-icon-view" + @click="handlePreview(scope.row)" + v-hasPermi="['tool:gen:preview']" + >预览</el-button> + <el-button + type="text" + size="small" + icon="el-icon-edit" + @click="handleEditTable(scope.row)" + v-hasPermi="['tool:gen:edit']" + >编辑</el-button> + <el-button + type="text" + size="small" + icon="el-icon-delete" + @click="handleDelete(scope.row)" + v-hasPermi="['tool:gen:remove']" + >删除</el-button> + <el-button + type="text" + size="small" + icon="el-icon-download" + @click="handleGenTable(scope.row)" + v-hasPermi="['tool:gen:code']" + >生成代码</el-button> + </template> + </el-table-column> + </el-table> + <pagination + v-show="total>0" + :total="total" + :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" + @pagination="getList" + /> + <!-- 预览界面 --> + <el-dialog :title="preview.title" :visible.sync="preview.open" width="80%" top="5vh" append-to-body> + <el-tabs v-model="preview.activeName"> + <el-tab-pane + v-for="(value, key) in preview.data" + :label="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))" + :name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))" + :key="key" + > + <pre>{{ value }}</pre> + </el-tab-pane> + </el-tabs> + </el-dialog> + <import-table ref="import" @ok="handleQuery" /> + </div> +</template> + +<script> +import { listTable, previewTable, delTable } from "@/api/tool/gen"; +import importTable from "./importTable"; +import { downLoadZip } from "@/utils/zipdownload"; +export default { + name: "Gen", + components: { importTable }, + data() { + return { + // 遮罩层 + loading: true, + // 唯一标识符 + uniqueId: "", + // 选中数组 + ids: [], + // 选中表数组 + tableNames: [], + // 非单个禁用 + single: true, + // 非多个禁用 + multiple: true, + // 总条数 + total: 0, + // 表数据 + tableList: [], + // 日期范围 + dateRange: "", + // 查询参数 + queryParams: { + pageNum: 1, + pageSize: 10, + tableName: undefined, + tableComment: undefined + }, + // 预览参数 + preview: { + open: false, + title: "代码预览", + data: {}, + activeName: "domain.java" + } + }; + }, + created() { + this.getList(); + }, + activated() { + const time = this.$route.query.t; + if (time != null && time != this.uniqueId) { + this.uniqueId = time; + this.resetQuery(); + } + }, + methods: { + /** 查询表集合 */ + getList() { + this.loading = true; + listTable(this.addDateRange(this.queryParams, this.dateRange)).then(response => { + this.tableList = response.rows; + this.total = response.total; + this.loading = false; + } + ); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.pageNum = 1; + this.getList(); + }, + /** 生成代码操作 */ + handleGenTable(row) { + const tableNames = row.tableName || this.tableNames; + if (tableNames == "") { + this.msgError("请选择要生成的数据"); + return; + } + downLoadZip("/tool/gen/batchGenCode?tables=" + tableNames, "ruoyi"); + }, + /** 打开导入表弹窗 */ + openImportTable() { + this.$refs.import.show(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + /** 预览按钮 */ + handlePreview(row) { + previewTable(row.tableId).then(response => { + this.preview.data = response.data; + this.preview.open = true; + }); + }, + // 多选框选中数据 + handleSelectionChange(selection) { + this.ids = selection.map(item => item.tableId); + this.tableNames = selection.map(item => item.tableName); + this.single = selection.length != 1; + this.multiple = !selection.length; + }, + /** 修改按钮操作 */ + handleEditTable(row) { + const tableId = row.tableId || this.ids[0]; + this.$router.push({ path: "/gen/edit", query: { tableId: tableId } }); + }, + /** 删除按钮操作 */ + handleDelete(row) { + const tableIds = row.tableId || this.ids; + this.$confirm('是否确认删除表编号为"' + tableIds + '"的数据项?', "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }).then(function() { + return delTable(tableIds); + }).then(() => { + this.getList(); + this.msgSuccess("删除成功"); + }).catch(function() {}); + } + } +}; +</script> \ No newline at end of file diff --git a/ruoyi-ui/src/views/data/cases/OriginalOfficeOpeningCase.vue b/ruoyi-ui/src/views/data/cases/OriginalOfficeOpeningCase.vue new file mode 100644 index 000000000..8f08d8516 --- /dev/null +++ b/ruoyi-ui/src/views/data/cases/OriginalOfficeOpeningCase.vue @@ -0,0 +1,150 @@ +<template> + <div class="app-container"> + <el-form :model="queryParams" ref="queryForm" :inline="true"> + <el-form-item label="案例年月" prop="yearMonth"> + <el-input + v-model="queryParams.yearMonth" + placeholder="请输入案例年月" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="案例小区名称" prop="name"> + <el-input + v-model="queryParams.name" + placeholder="请输入案例小区名称" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="案例小区地址" prop="address"> + <el-input + v-model="queryParams.address" + placeholder="请输入案例小区地址" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + + <el-table + v-loading="loading" + :data="list.slice((pageNum-1)*pageSize,pageNum*pageSize)" + style="width: 100%;" + > + <el-table-column label="序号" type="index" align="center"> + <template slot-scope="scope"> + <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span> + </template> + </el-table-column> + <el-table-column label="会话编号" align="center" prop="tokenId" :show-overflow-tooltip="true" /> + <el-table-column label="登录名称" align="center" prop="userName" :show-overflow-tooltip="true" /> + <el-table-column label="部门名称" align="center" prop="deptName" /> + <el-table-column label="主机" align="center" prop="ipaddr" :show-overflow-tooltip="true" /> + <el-table-column label="登录地点" align="center" prop="loginLocation" /> + <el-table-column label="浏览器" align="center" prop="browser" /> + <el-table-column label="操作系统" align="center" prop="os" /> + <el-table-column label="登录时间" align="center" prop="loginTime" width="180"> + <template slot-scope="scope"> + <span>{{ parseTime(scope.row.loginTime) }}</span> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template slot-scope="scope"> + <el-button + size="mini" + type="text" + icon="el-icon-delete" + @click="handleForceLogout(scope.row)" + v-hasPermi="['monitor:online:forceLogout']" + >强退</el-button> + </template> + </el-table-column> + </el-table> + + <pagination v-show="total>0" :total="total" :page.sync="pageNum" :limit.sync="pageSize" /> + </div> +</template> + +<script> +import { list, forceLogout } from "@/api/monitor/online"; + +export default { + name: "Online", + data() { + return { + // 遮罩层 + loading: true, + // 总条数 + total: 0, + // 表格数据 + list: [], + pageNum: 1, + pageSize: 10, + // 查询参数 + queryParams: { + yearMonth: undefined, + name: undefined, + address: undefined, + // 租售状态 + saleOrRent: undefined, + countyName: undefined, + ipaddr: undefined, + userName: undefined + } + }; + }, + created() { + this.getList(); + }, + methods: { + /** 查询登录日志列表 */ + getList() { + this.loading = true; + list(this.queryParams).then(response => { + this.list = response.rows; + this.total = response.total; + this.loading = false; + }); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.pageNum = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + /** 强退按钮操作 */ + handleForceLogout(row) { + this.$confirm( + '是否确认强退名称为"' + row.userName + '"的数据项?', + "警告", + { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + } + ) + .then(function() { + return forceLogout(row.tokenId); + }) + .then(() => { + this.getList(); + this.msgSuccess("强退成功"); + }) + .catch(function() {}); + } + } +}; +</script> + diff --git a/ruoyi-ui/src/views/data/cases/UltimateOfficeBasePrice.vue b/ruoyi-ui/src/views/data/cases/UltimateOfficeBasePrice.vue new file mode 100644 index 000000000..ce2f40e67 --- /dev/null +++ b/ruoyi-ui/src/views/data/cases/UltimateOfficeBasePrice.vue @@ -0,0 +1,405 @@ +<template> + <div class="app-container"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="100px"> + <el-form-item label="年月" prop="yearMonth" clearable> + <el-date-picker + v-model="queryParams.yearMonth" + format="yyyyMM" + type="month" + placeholder="选择年月" + @keyup.enter.native="handleQuery" + ></el-date-picker> + </el-form-item> + <el-form-item label="联城小区ID" prop="communityId" clearable> + <el-input + v-model="queryParams.communityId" + placeholder="请输入案例小区名称" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="联城楼栋ID" prop="buildingId" clearable> + <el-input + v-model="queryParams.buildingId" + placeholder="请输入联城楼栋ID" + clearable + size="small" + @keyup.enter.native="handleQuery" + /> + </el-form-item> + <el-form-item label="状态"> + <el-select v-model="queryParams.status" clearable> + <el-option label="正常" value="1"></el-option> + <el-option label="失效" value="0"></el-option> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> + </el-form-item> + </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" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:user:export']" + >导出</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="info" + icon="el-icon-upload2" + size="mini" + @click="handleImport" + v-hasPermi="['system:user:import']" + >导入</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="ultimateList" @selection-change="handleSelectionChange"> + <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="主力基价" align="center" prop="mainPrice" /> + <el-table-column label="主力租金" align="center" prop="mainPriceRent" /> + <el-table-column label="主力基价涨跌幅" align="center" prop="mainPricePst" /> + <el-table-column label="主力租金涨跌幅" align="center" prop="mainPriceRentPst" /> + <el-table-column label="主力基价类型" align="center" prop="mainPriceType" /> + <el-table-column label="主力租金类型" align="center" prop="mainPriceRentType" /> + <el-table-column label="状态" align="center" prop="status" :formatter="statusFormatter" /> + <el-table-column + label="标准楼栋" + align="center" + prop="standardBuilding" + :formatter="yesOrNotFormatter" + /> + <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"> + <template slot-scope="scope"> + <el-button + size="mini" + type="text" + icon="el-icon-edit" + @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> + + <pagination + v-show="total>0" + :total="total" + :page.sync="queryParams.pageNum" + :limit.sync="queryParams.pageSize" + @pagination="getList" + /> + + <!-- 添加或修改办公基价对话框 --> + <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body> + <el-form ref="form" :model="form" :rules="rules" 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-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="楼栋ID"> + <el-input v-model="form.buildingId" disabled="true" 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> + </el-col> + <el-col :span="12"> + <el-form-item label="主力租金(元/月·㎡)"> + <el-input v-model="form.mainPriceRent" /> + </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-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="主力租金涨跌幅"> + <el-input v-model="form.mainPriceRentPst" /> + </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-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="主力租金类型"> + <el-input v-model="form.mainPriceRentType" /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </el-dialog> + + <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body> + <el-upload + ref="upload" + :limit="1" + accept=".xlsx, .xls" + :headers="upload.headers" + :action="upload.url + '?updateSupport=' + upload.updateSupport" + :disabled="upload.isUploading" + :on-progress="handleFileUploadProgress" + :on-success="handleFileSuccess" + :auto-upload="false" + drag + > + <i class="el-icon-upload"></i> + <div class="el-upload__text"> + 将文件拖到此处,或 + <em>点击上传</em> + </div> + <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div> + </el-upload> + <div slot="footer" class="dialog-footer"> + <el-button type="primary" @click="submitFileForm">确 定</el-button> + <el-button @click="upload.open = false">取 消</el-button> + </div> + </el-dialog> + </div> +</template> + +<script> +import { getToken } from "@/utils/auth"; +import { + listUltimate, + getUltimate, + updateUltimate, + exportUltimate +} from "@/api/data/ultimateOfficeBasePrice"; + +export default { + name: "Ultimate", + data() { + return { + // 遮罩层 + loading: true, + // 选中数组 + ids: [], + // 非单个禁用 + single: true, + // 非多个禁用 + multiple: true, + // 总条数 + total: 0, + // 办公基价表格数据 + ultimateList: [], + // 弹出层标题 + title: "", + // 是否显示弹出层 + open: false, + // 查询参数 + queryParams: { + yearMonth: undefined, + communityId: undefined, + buildingId: undefined, + pageNum: 1, + pageSize: 10 + }, + statusOptions: [ + { value: 1, text: "正常" }, + { value: 1, text: "失效" } + ], + upload: { + // 是否显示弹出层(用户导入) + open: false, + // 弹出层标题(用户导入) + title: "", + // 是否禁用上传 + isUploading: false, + // 设置上传的请求头部 + headers: { Authorization: "Bearer " + getToken() }, + // 上传的地址 + url: + process.env.VUE_APP_BASE_API + "/data/compute/price/office/importData" + }, + // 表单参数 + form: {}, + // 表单校验 + rules: {} + }; + }, + created() { + this.getList(); + }, + methods: { + yesOrNotFormatter: function(row, column, cellValue, index) { + if (cellValue) return "是"; + return "否"; + }, + statusFormatter: function(row, column, cellValue, index) { + if (cellValue) return "正常"; + return "失效"; + }, + dateFormatter: function(row, column, cellValue, index) { + if (cellValue) { + return cellValue.substring(0, 10); + } + return ""; + }, + /** 查询办公基价列表 */ + getList() { + this.loading = true; + listUltimate(this.queryParams).then(response => { + this.ultimateList = response.rows; + this.total = response.total; + this.loading = false; + }); + }, + // 取消按钮 + cancel() { + this.open = false; + this.reset(); + }, + // 表单重置 + reset() { + this.form = { + id: undefined + }; + this.resetForm("form"); + }, + /** 搜索按钮操作 */ + handleQuery() { + this.queryParams.pageNum = 1; + this.getList(); + }, + /** 重置按钮操作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + // 多选框选中数据 + handleSelectionChange(selection) { + this.ids = selection.map(item => item.id); + this.single = selection.length != 1; + this.multiple = !selection.length; + }, + /** 新增按钮操作 */ + // handleAdd() { + // this.reset(); + // this.open = true; + // this.title = "添加办公基价"; + // }, + /** 修改按钮操作 */ + handleUpdate(row) { + this.reset(); + const id = row.id || this.ids; + getUltimate(id).then(response => { + this.form = response.data; + this.open = true; + this.title = "修改办公基价"; + }); + }, + /** 提交按钮 */ + submitForm: function() { + this.$refs["form"].validate(valid => { + if (valid) { + if (this.form.id != undefined) { + updateUltimate(this.form).then(response => { + if (response.code === 200) { + this.msgSuccess("修改成功"); + this.open = false; + this.getList(); + } else { + this.msgError(response.msg); + } + }); + } else { + addUltimate(this.form).then(response => { + if (response.code === 200) { + this.msgSuccess("新增成功"); + this.open = false; + this.getList(); + } else { + this.msgError(response.msg); + } + }); + } + } + }); + }, + /** 导出按钮操作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm("是否确认导出所有办公基价数据项?", "警告", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + .then(function() { + return exportUltimate(queryParams); + }) + .then(response => { + this.download(response.msg); + }) + .catch(function() {}); + }, + handleImport() { + this.upload.title = "办公基价导入"; + this.upload.open = true; + }, + // 文件上传中处理 + handleFileUploadProgress(event, file, fileList) { + this.upload.isUploading = true; + }, + // 文件上传成功处理 + handleFileSuccess(response, file, fileList) { + this.upload.open = false; + this.upload.isUploading = false; + this.$refs.upload.clearFiles(); + this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true }); + this.getList(); + }, + // 提交上传文件 + submitFileForm() { + this.$refs.upload.submit(); + } + } +}; +</script> diff --git a/ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java index e7acc9270..c36474715 100644 --- a/ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/ruoyi/src/main/java/com/ruoyi/RuoYiApplication.java @@ -1,6 +1,7 @@ package com.ruoyi; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; +import com.github.pagehelper.autoconfigure.PageHelperAutoConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @@ -10,11 +11,10 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; * * @author ruoyi */ -@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class }) -public class RuoYiApplication -{ - public static void main(String[] args) - { +@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class, + PageHelperAutoConfiguration.class}) +public class RuoYiApplication { + public static void main(String[] args) { System.setProperty("spring.devtools.restart.enabled", "false"); SpringApplication.run(RuoYiApplication.class, args); System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" + diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java index b78e53e10..f66debc9d 100644 --- a/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -7,6 +7,8 @@ import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Date; + +import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.poi.ss.usermodel.DateUtil; @@ -17,12 +19,11 @@ import com.ruoyi.common.utils.DateUtils; /** * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. - * + * * @author ruoyi */ @SuppressWarnings("rawtypes") -public class ReflectUtils -{ +public class ReflectUtils { private static final String SETTER_PREFIX = "set"; private static final String GETTER_PREFIX = "get"; @@ -36,13 +37,11 @@ public class ReflectUtils * 支持多级,如:对象名.对象名.方法 */ @SuppressWarnings("unchecked") - public static <E> E invokeGetter(Object obj, String propertyName) - { + public static <E> E invokeGetter(Object obj, String propertyName) { Object object = obj; - for (String name : StringUtils.split(propertyName, ".")) - { + for (String name : StringUtils.split(propertyName, ".")) { String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); - object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{}); } return (E) object; } @@ -51,21 +50,16 @@ public class ReflectUtils * 调用Setter方法, 仅匹配方法名。 * 支持多级,如:对象名.对象名.方法 */ - public static <E> void invokeSetter(Object obj, String propertyName, E value) - { + public static <E> void invokeSetter(Object obj, String propertyName, E value) { Object object = obj; String[] names = StringUtils.split(propertyName, "."); - for (int i = 0; i < names.length; i++) - { - if (i < names.length - 1) - { + for (int i = 0; i < names.length; i++) { + if (i < names.length - 1) { String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); - object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); - } - else - { + object = invokeMethod(object, getterMethodName, new Class[]{}, new Object[]{}); + } else { String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); - invokeMethodByName(object, setterMethodName, new Object[] { value }); + invokeMethodByName(object, setterMethodName, new Object[]{value}); } } } @@ -74,21 +68,16 @@ public class ReflectUtils * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. */ @SuppressWarnings("unchecked") - public static <E> E getFieldValue(final Object obj, final String fieldName) - { + public static <E> E getFieldValue(final Object obj, final String fieldName) { Field field = getAccessibleField(obj, fieldName); - if (field == null) - { + if (field == null) { logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); return null; } E result = null; - try - { + try { result = (E) field.get(obj); - } - catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { logger.error("不可能抛出的异常{}", e.getMessage()); } return result; @@ -97,21 +86,16 @@ public class ReflectUtils /** * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. */ - public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) - { + public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) { Field field = getAccessibleField(obj, fieldName); - if (field == null) - { + if (field == null) { // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); return; } - try - { + try { field.set(obj, value); - } - catch (IllegalAccessException e) - { + } catch (IllegalAccessException e) { logger.error("不可能抛出的异常: {}", e.getMessage()); } } @@ -123,24 +107,18 @@ public class ReflectUtils */ @SuppressWarnings("unchecked") public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes, - final Object[] args) - { - if (obj == null || methodName == null) - { + final Object[] args) { + if (obj == null || methodName == null) { return null; } Method method = getAccessibleMethod(obj, methodName, parameterTypes); - if (method == null) - { + if (method == null) { logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); return null; } - try - { + try { return (E) method.invoke(obj, args); - } - catch (Exception e) - { + } catch (Exception e) { String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; throw convertReflectionExceptionToUnchecked(msg, e); } @@ -152,64 +130,51 @@ public class ReflectUtils * 只匹配函数名,如果有多个同名函数调用第一个。 */ @SuppressWarnings("unchecked") - public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args) - { + public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args) { Method method = getAccessibleMethodByName(obj, methodName, args.length); - if (method == null) - { + if (method == null) { // 如果为空不报错,直接返回空。 logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); return null; } - try - { + try { // 类型转换(将参数数据类型转换为目标方法参数类型) Class<?>[] cs = method.getParameterTypes(); - for (int i = 0; i < cs.length; i++) - { - if (args[i] != null && !args[i].getClass().equals(cs[i])) - { - if (cs[i] == String.class) - { + for (int i = 0; i < cs.length; i++) { + if (args[i] != null && !args[i].getClass().equals(cs[i])) { + if (cs[i] == String.class) { args[i] = Convert.toStr(args[i]); - if (StringUtils.endsWith((String) args[i], ".0")) - { + if (StringUtils.endsWith((String) args[i], ".0")) { args[i] = StringUtils.substringBefore((String) args[i], ".0"); } - } - else if (cs[i] == Integer.class) - { + } else if (cs[i] == Integer.class) { args[i] = Convert.toInt(args[i]); - } - else if (cs[i] == Long.class) - { + } else if (cs[i] == Long.class) { args[i] = Convert.toLong(args[i]); - } - else if (cs[i] == Double.class) - { + } else if (cs[i] == Double.class) { args[i] = Convert.toDouble(args[i]); - } - else if (cs[i] == Float.class) - { + } else if (cs[i] == Float.class) { args[i] = Convert.toFloat(args[i]); - } - else if (cs[i] == Date.class) - { - if (args[i] instanceof String) - { + } else if (cs[i] == Date.class) { + if (args[i] instanceof String) { args[i] = DateUtils.parseDate(args[i]); - } - else - { + } else { args[i] = DateUtil.getJavaDate((Double) args[i]); } + } else if (cs[i] == Boolean.class) { + if (null != args[i]) { + String cellValue = args[i].toString().toLowerCase(); + if ("true".equals(cellValue)) { + args[i] = true; + } else if ("false".equals(cellValue)) { + args[i] = false; + } + } } } } return (E) method.invoke(obj, args); - } - catch (Exception e) - { + } catch (Exception e) { String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; throw convertReflectionExceptionToUnchecked(msg, e); } @@ -219,24 +184,19 @@ public class ReflectUtils * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. * 如向上转型到Object仍无法找到, 返回null. */ - public static Field getAccessibleField(final Object obj, final String fieldName) - { + public static Field getAccessibleField(final Object obj, final String fieldName) { // 为空不报错。直接返回 null - if (obj == null) - { + if (obj == null) { return null; } Validate.notBlank(fieldName, "fieldName can't be blank"); - for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) - { - try - { + for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = + superClass.getSuperclass()) { + try { Field field = superClass.getDeclaredField(fieldName); makeAccessible(field); return field; - } - catch (NoSuchFieldException e) - { + } catch (NoSuchFieldException e) { continue; } } @@ -250,24 +210,19 @@ public class ReflectUtils * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) */ public static Method getAccessibleMethod(final Object obj, final String methodName, - final Class<?>... parameterTypes) - { + final Class<?>... parameterTypes) { // 为空不报错。直接返回 null - if (obj == null) - { + if (obj == null) { return null; } Validate.notBlank(methodName, "methodName can't be blank"); - for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) - { - try - { + for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = + searchType.getSuperclass()) { + try { Method method = searchType.getDeclaredMethod(methodName, parameterTypes); makeAccessible(method); return method; - } - catch (NoSuchMethodException e) - { + } catch (NoSuchMethodException e) { continue; } } @@ -280,21 +235,17 @@ public class ReflectUtils * 只匹配函数名。 * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) */ - public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) - { + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) { // 为空不报错。直接返回 null - if (obj == null) - { + if (obj == null) { return null; } Validate.notBlank(methodName, "methodName can't be blank"); - for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) - { + for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = + searchType.getSuperclass()) { Method[] methods = searchType.getDeclaredMethods(); - for (Method method : methods) - { - if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) - { + for (Method method : methods) { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) { makeAccessible(method); return method; } @@ -306,11 +257,9 @@ public class ReflectUtils /** * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 */ - public static void makeAccessible(Method method) - { + public static void makeAccessible(Method method) { if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) - && !method.isAccessible()) - { + && !method.isAccessible()) { method.setAccessible(true); } } @@ -318,11 +267,9 @@ public class ReflectUtils /** * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 */ - public static void makeAccessible(Field field) - { + public static void makeAccessible(Field field) { if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) - || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) - { + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) { field.setAccessible(true); } } @@ -332,8 +279,7 @@ public class ReflectUtils * 如无法找到, 返回Object.class. */ @SuppressWarnings("unchecked") - public static <T> Class<T> getClassGenricType(final Class clazz) - { + public static <T> Class<T> getClassGenricType(final Class clazz) { return getClassGenricType(clazz, 0); } @@ -341,26 +287,22 @@ public class ReflectUtils * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. * 如无法找到, 返回Object.class. */ - public static Class getClassGenricType(final Class clazz, final int index) - { + public static Class getClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); - if (!(genType instanceof ParameterizedType)) - { + if (!(genType instanceof ParameterizedType)) { logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); - if (index >= params.length || index < 0) - { + if (index >= params.length || index < 0) { logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } - if (!(params[index] instanceof Class)) - { + if (!(params[index] instanceof Class)) { logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } @@ -368,18 +310,14 @@ public class ReflectUtils return (Class) params[index]; } - public static Class<?> getUserClass(Object instance) - { - if (instance == null) - { + public static Class<?> getUserClass(Object instance) { + if (instance == null) { throw new RuntimeException("Instance must not be null"); } Class clazz = instance.getClass(); - if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) - { + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) { Class<?> superClass = clazz.getSuperclass(); - if (superClass != null && !Object.class.equals(superClass)) - { + if (superClass != null && !Object.class.equals(superClass)) { return superClass; } } @@ -390,15 +328,11 @@ public class ReflectUtils /** * 将反射时的checked exception转换为unchecked exception. */ - public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) - { + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) { if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException - || e instanceof NoSuchMethodException) - { + || e instanceof NoSuchMethodException) { return new IllegalArgumentException(msg, e); - } - else if (e instanceof InvocationTargetException) - { + } else if (e instanceof InvocationTargetException) { return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); } return new RuntimeException(msg, e); diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java index 345f48063..5050f9576 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/DruidConfig.java @@ -21,7 +21,6 @@ import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatPropertie import com.alibaba.druid.util.Utils; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.framework.aspectj.lang.enums.DataSourceType; -import com.ruoyi.framework.config.properties.DruidProperties; import com.ruoyi.framework.datasource.DynamicDataSource; /** diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java index ae6e02fd3..fe74bc073 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/properties/DruidProperties.java @@ -1,77 +1,77 @@ -package com.ruoyi.framework.config.properties; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import com.alibaba.druid.pool.DruidDataSource; - -/** - * druid 配置属性 - * - * @author ruoyi - */ -@Configuration -public class DruidProperties -{ - @Value("${spring.datasource.druid.initialSize}") - private int initialSize; - - @Value("${spring.datasource.druid.minIdle}") - private int minIdle; - - @Value("${spring.datasource.druid.maxActive}") - private int maxActive; - - @Value("${spring.datasource.druid.maxWait}") - private int maxWait; - - @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") - private int timeBetweenEvictionRunsMillis; - - @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") - private int minEvictableIdleTimeMillis; - - @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") - private int maxEvictableIdleTimeMillis; - - @Value("${spring.datasource.druid.validationQuery}") - private String validationQuery; - - @Value("${spring.datasource.druid.testWhileIdle}") - private boolean testWhileIdle; - - @Value("${spring.datasource.druid.testOnBorrow}") - private boolean testOnBorrow; - - @Value("${spring.datasource.druid.testOnReturn}") - private boolean testOnReturn; - - public DruidDataSource dataSource(DruidDataSource datasource) - { - /** 配置初始化大小、最小、最大 */ - datasource.setInitialSize(initialSize); - datasource.setMaxActive(maxActive); - datasource.setMinIdle(minIdle); - - /** 配置获取连接等待超时的时间 */ - datasource.setMaxWait(maxWait); - - /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ - datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); - - /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ - datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); - datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); - - /** - * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 - */ - datasource.setValidationQuery(validationQuery); - /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ - datasource.setTestWhileIdle(testWhileIdle); - /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ - datasource.setTestOnBorrow(testOnBorrow); - /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ - datasource.setTestOnReturn(testOnReturn); - return datasource; - } -} +//package com.ruoyi.framework.config.properties; +// +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Configuration; +//import com.alibaba.druid.pool.DruidDataSource; +// +///** +// * druid 配置属性 +// * +// * @author ruoyi +// */ +//@Configuration +//public class DruidProperties +//{ +// @Value("${spring.datasource.druid.initialSize}") +// private int initialSize; +// +// @Value("${spring.datasource.druid.minIdle}") +// private int minIdle; +// +// @Value("${spring.datasource.druid.maxActive}") +// private int maxActive; +// +// @Value("${spring.datasource.druid.maxWait}") +// private int maxWait; +// +// @Value("${spring.datasource.druid.timeBetweenEvictionRunsMillis}") +// private int timeBetweenEvictionRunsMillis; +// +// @Value("${spring.datasource.druid.minEvictableIdleTimeMillis}") +// private int minEvictableIdleTimeMillis; +// +// @Value("${spring.datasource.druid.maxEvictableIdleTimeMillis}") +// private int maxEvictableIdleTimeMillis; +// +// @Value("${spring.datasource.druid.validationQuery}") +// private String validationQuery; +// +// @Value("${spring.datasource.druid.testWhileIdle}") +// private boolean testWhileIdle; +// +// @Value("${spring.datasource.druid.testOnBorrow}") +// private boolean testOnBorrow; +// +// @Value("${spring.datasource.druid.testOnReturn}") +// private boolean testOnReturn; +// +// public DruidDataSource dataSource(DruidDataSource datasource) +// { +// /** 配置初始化大小、最小、最大 */ +// datasource.setInitialSize(initialSize); +// datasource.setMaxActive(maxActive); +// datasource.setMinIdle(minIdle); +// +// /** 配置获取连接等待超时的时间 */ +// datasource.setMaxWait(maxWait); +// +// /** 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ +// datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); +// +// /** 配置一个连接在池中最小、最大生存的时间,单位是毫秒 */ +// datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); +// datasource.setMaxEvictableIdleTimeMillis(maxEvictableIdleTimeMillis); +// +// /** +// * 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 +// */ +// datasource.setValidationQuery(validationQuery); +// /** 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 */ +// datasource.setTestWhileIdle(testWhileIdle); +// /** 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ +// datasource.setTestOnBorrow(testOnBorrow); +// /** 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 */ +// datasource.setTestOnReturn(testOnReturn); +// return datasource; +// } +//} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourcePagerDialectConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourcePagerDialectConfig.java new file mode 100644 index 000000000..408738ab3 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/datasource/DynamicDataSourcePagerDialectConfig.java @@ -0,0 +1,76 @@ +//package com.ruoyi.framework.datasource; +// +// +//import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider; +//import com.baomidou.dynamic.datasource.provider.YmlDynamicDataSourceProvider; +//import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration; +//import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidDynamicDataSourceConfiguration; +//import com.github.pagehelper.PageInterceptor; +//import org.apache.ibatis.plugin.Interceptor; +//import org.apache.ibatis.session.SqlSessionFactory; +//import org.mybatis.spring.SqlSessionFactoryBean; +//import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.beans.factory.annotation.Qualifier; +//import org.springframework.boot.autoconfigure.AutoConfigureAfter; +//import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +//import javax.annotation.PostConstruct; +//import javax.sql.DataSource; +//import java.util.List; +//import java.util.Properties; +// +//@Configuration +//@ConditionalOnBean(SqlSessionFactory.class) +////@AutoConfigureAfter(MybatisAutoConfiguration.class) +//@AutoConfigureAfter(DynamicDataSourceAutoConfiguration.class) +//public class DynamicDataSourcePagerDialectConfig { +// @Autowired +// private List<SqlSessionFactory> sqlSessionFactoryList; +//// @Autowired +//// private DynamicDataSourceProvider dynamicDataSourceProvider; +// +// @PostConstruct +// public void addPageInterceptor() { +// +// sqlSessionFactoryList.forEach(x->{ +// System.out.println(""); +// }); +// +//// dynamicDataSourceProvider.loadDataSources().forEach((k, v) -> { +//// PageInterceptor interceptor = new PageInterceptor(); +//// Properties properties = new Properties(); +//// +//// }); +// +// //先把一般方式配置的属性放进去 +//// properties.putAll(pageHelperProperties()); +// //在把特殊配置放进去,由于close-conn 利用上面方式时,属性名就是 close-conn 而不是 closeConn,所以需要额外的一步 +//// properties.putAll(this.properties.getProperties()); +//// interceptor.setProperties(properties); +//// for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) { +//// sqlSessionFactory.getConfiguration().addInterceptor(interceptor); +//// } +// } +// +//// @Bean(name = "mssqlSessionFactory") +//// public SqlSessionFactory mssqlSessionFactory(@Qualifier("mssqlDataSource") DataSource dataSource) +//// throws Exception { +//// final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); +//// //分页插件 +//// Interceptor interceptor = new PageInterceptor(); +//// Properties properties = new Properties(); +//// //数据库 +//// properties.setProperty("helperDialect", "sqlserver2012"); +//// //是否分页合理化 +//// properties.setProperty("reasonable", "false"); +//// +//// interceptor.setProperties(properties); +//// +//// sessionFactory.setPlugins(new Interceptor[] {interceptor}); +//// sessionFactory.setDataSource(dataSource); +//// return sessionFactory.getObject(); +//// } +//} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/web/controller/BaseController.java b/ruoyi/src/main/java/com/ruoyi/framework/web/controller/BaseController.java index cb9b7d0c5..f46935b3b 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/web/controller/BaseController.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/web/controller/BaseController.java @@ -1,86 +1,88 @@ -package com.ruoyi.framework.web.controller; - -import java.beans.PropertyEditorSupport; -import java.util.Date; -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.web.bind.WebDataBinder; -import org.springframework.web.bind.annotation.InitBinder; -import com.github.pagehelper.PageHelper; -import com.github.pagehelper.PageInfo; -import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.common.utils.sql.SqlUtil; -import com.ruoyi.framework.web.domain.AjaxResult; -import com.ruoyi.framework.web.page.PageDomain; -import com.ruoyi.framework.web.page.TableDataInfo; -import com.ruoyi.framework.web.page.TableSupport; - -/** - * web层通用数据处理 - * - * @author ruoyi - */ -public class BaseController -{ - protected final Logger logger = LoggerFactory.getLogger(BaseController.class); - - /** - * 将前台传递过来的日期格式的字符串,自动转化为Date类型 - */ - @InitBinder - public void initBinder(WebDataBinder binder) - { - // Date 类型转换 - binder.registerCustomEditor(Date.class, new PropertyEditorSupport() - { - @Override - public void setAsText(String text) - { - setValue(DateUtils.parseDate(text)); - } - }); - } - - /** - * 设置请求分页数据 - */ - protected void startPage() - { - PageDomain pageDomain = TableSupport.buildPageRequest(); - Integer pageNum = pageDomain.getPageNum(); - Integer pageSize = pageDomain.getPageSize(); - if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) - { - String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); - PageHelper.startPage(pageNum, pageSize, orderBy); - } - } - - /** - * 响应请求分页数据 - */ - @SuppressWarnings({ "rawtypes", "unchecked" }) - protected TableDataInfo getDataTable(List<?> list) - { - TableDataInfo rspData = new TableDataInfo(); - rspData.setCode(HttpStatus.SUCCESS); - rspData.setMsg("查询成功"); - rspData.setRows(list); - rspData.setTotal(new PageInfo(list).getTotal()); - return rspData; - } - - /** - * 响应返回结果 - * - * @param rows 影响行数 - * @return 操作结果 - */ - protected AjaxResult toAjax(int rows) - { - return rows > 0 ? AjaxResult.success() : AjaxResult.error(); - } -} +package com.ruoyi.framework.web.controller; + +import java.beans.PropertyEditorSupport; +import java.util.Date; +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sql.SqlUtil; +import com.ruoyi.framework.web.domain.AjaxResult; +import com.ruoyi.framework.web.page.PageDomain; +import com.ruoyi.framework.web.page.TableDataInfo; +import com.ruoyi.framework.web.page.TableSupport; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +public class BaseController { + protected final Logger logger = LoggerFactory.getLogger(BaseController.class); + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + setValue(DateUtils.parseDate(text)); + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + PageHelper.startPage(pageNum, pageSize, orderBy); + } + } + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + protected TableDataInfo getDataTable(List<?> list) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } + + protected TableDataInfo getDataTable(List<?> list, int total) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(HttpStatus.SUCCESS); + rspData.setMsg("查询成功"); + rspData.setRows(list); + rspData.setTotal(total); + return rspData; + } + + /** + * 响应返回结果 + * + * @param rows 影响行数 + * @return 操作结果 + */ + protected AjaxResult toAjax(int rows) { + return rows > 0 ? AjaxResult.success() : AjaxResult.error(); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/cases/controller/CasesController.java b/ruoyi/src/main/java/com/ruoyi/project/data/cases/controller/CasesController.java new file mode 100644 index 000000000..8d2ce9b4f --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/cases/controller/CasesController.java @@ -0,0 +1,32 @@ +package com.ruoyi.project.data.cases.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/data/cases") +public class CasesController { + + /** + * 原始办公挂牌案例 + */ + public void originalOfficeOpeningCase() { + + } + + /** + * 原始住宅销售挂牌案例 + */ + public void originalResidenceSalesOpeningCase(){ + + } + + /** + * 原始住宅销售挂牌案例 + */ + public void originalResidenceSalesClosingCase(){ + + } + + +} diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/controller/OfficeBasePriceUltimateController.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/controller/OfficeBasePriceUltimateController.java new file mode 100644 index 000000000..aa1a78248 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/controller/OfficeBasePriceUltimateController.java @@ -0,0 +1,115 @@ +package com.ruoyi.project.data.price.compute.controller; + +import java.util.List; + +import com.ruoyi.common.utils.ServletUtils; +import com.ruoyi.framework.security.LoginUser; +import com.ruoyi.framework.security.service.TokenService; +import com.ruoyi.framework.web.page.TableSupport; +import com.ruoyi.project.data.price.compute.domain.OfficeBasePriceUltimate; +import com.ruoyi.project.data.price.compute.service.IOfficeBasePriceUltimateService; +import com.ruoyi.project.system.domain.SysUser; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.framework.aspectj.lang.annotation.Log; +import com.ruoyi.framework.aspectj.lang.enums.BusinessType; +import com.ruoyi.framework.web.controller.BaseController; +import com.ruoyi.framework.web.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.web.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * 【请填写功能名称】Controller + * + * @author ruoyi + * @date 2020-05-20 + */ +@RestController +@RequestMapping("/data/compute/price/office") +public class OfficeBasePriceUltimateController extends BaseController { + @Autowired + private IOfficeBasePriceUltimateService officeBasePriceUltimateService; + @Autowired + private TokenService tokenService; + + /** + * 查询【请填写功能名称】列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:list')") + @GetMapping("/list") + public TableDataInfo list(OfficeBasePriceUltimate officeBasePriceUltimate) { + int pageIndex = ServletUtils.getParameterToInt(TableSupport.PAGE_NUM); + int pageSize = ServletUtils.getParameterToInt(TableSupport.PAGE_SIZE); + officeBasePriceUltimate.setPageIndex(pageIndex <= 1 ? 0 : (pageIndex - 1) * pageSize); + officeBasePriceUltimate.setPageSize(pageSize); + List<OfficeBasePriceUltimate> list = + officeBasePriceUltimateService.selectOfficeBasePriceUltimateList(officeBasePriceUltimate); + int total = officeBasePriceUltimateService.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate); + return getDataTable(list, total); + } + + + /** + * 获取【请填写功能名称】详细信息 + */ + @PreAuthorize("@ss.hasPermi('system:user:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) { + return AjaxResult.success(officeBasePriceUltimateService.selectOfficeBasePriceUltimateById(id)); + } + + /** + * 修改【请填写功能名称】 + */ + @PreAuthorize("@ss.hasPermi('system:user:edit')") + @Log(title = "办公基价", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody OfficeBasePriceUltimate officeBasePriceUltimate) { + return toAjax(officeBasePriceUltimateService.updateOfficeBasePriceUltimate(officeBasePriceUltimate)); + } + + /** + * 导出【请填写功能名称】列表 + */ + @PreAuthorize("@ss.hasPermi('system:user:export')") + @Log(title = "办公基价", businessType = BusinessType.EXPORT) + @GetMapping("/export") + public AjaxResult export(OfficeBasePriceUltimate officeBasePriceUltimate) { + int total = officeBasePriceUltimateService.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate); + officeBasePriceUltimate.setPageIndex(0); + officeBasePriceUltimate.setPageSize(total); + List<OfficeBasePriceUltimate> list = + officeBasePriceUltimateService.selectOfficeBasePriceUltimateList(officeBasePriceUltimate); + ExcelUtil<OfficeBasePriceUltimate> util = new ExcelUtil<OfficeBasePriceUltimate>(OfficeBasePriceUltimate.class); + return util.exportExcel(list, "办公基价"); + } + + /** + * 办公基价导入 + * @param file + * @return + * @throws Exception + */ + @Log(title = "办公基价", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('system:user:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file) throws Exception { + ExcelUtil<OfficeBasePriceUltimate> util = new ExcelUtil<>(OfficeBasePriceUltimate.class); + List<OfficeBasePriceUltimate> officeBasePriceUltimates = util.importExcel(file.getInputStream()); + LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); + String operName = loginUser.getUsername(); + String message = officeBasePriceUltimateService.batchImport(officeBasePriceUltimates, operName); + return AjaxResult.success(message); + } + +} + diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/domain/OfficeBasePriceUltimate.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/domain/OfficeBasePriceUltimate.java new file mode 100644 index 000000000..b61716073 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/domain/OfficeBasePriceUltimate.java @@ -0,0 +1,178 @@ +package com.ruoyi.project.data.price.compute.domain; + +import com.alibaba.fastjson.annotation.JSONField; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.web.domain.BaseEntity; + +import java.util.Date; + +/** + * 【请填写功能名称】对象 office_base_price_ultimate + * + * @author ruoyi + * @date 2020-05-20 + */ +public class OfficeBasePriceUltimate extends BaseEntity { + + private Integer pageIndex; + private Integer pageSize; + + @Excel(name = "ID") + private String id; + @JSONField(serialize = false) + private Integer yearMonth; + @Excel(name = "楼栋ID") + private String buildingId; + @Excel(name = "小区ID") + private String communityId; + @Excel(name = "主力基价") + private String mainPrice; + @Excel(name = "主力租金") + private String mainPriceRent; + @Excel(name = "主力基价涨跌幅") + private String mainPricePst; + @Excel(name = "主力租金涨跌幅") + private String mainPriceRentPst; + @Excel(name = "主力基价类型") + private String mainPriceType; + @Excel(name = "主力租金类型") + private String mainPriceRentType; + @Excel(name = "更新日期") + private Date updateDate; + @Excel(name = "状态") + private Boolean status; + @Excel(name = "是否标准楼栋") + private Boolean isStandardBuilding; + @Excel(name = "更改价格说明") + private String adjustPriceComment; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Integer getYearMonth() { + return yearMonth; + } + + public void setYearMonth(Integer yearMonth) { + this.yearMonth = yearMonth; + } + + public String getBuildingId() { + return buildingId; + } + + public void setBuildingId(String buildingId) { + this.buildingId = buildingId; + } + + public String getCommunityId() { + return communityId; + } + + public void setCommunityId(String communityId) { + this.communityId = communityId; + } + + public String getMainPrice() { + return mainPrice; + } + + public void setMainPrice(String mainPrice) { + this.mainPrice = mainPrice; + } + + public String getMainPriceRent() { + return mainPriceRent; + } + + public void setMainPriceRent(String mainPriceRent) { + this.mainPriceRent = mainPriceRent; + } + + public String getMainPricePst() { + return mainPricePst; + } + + public void setMainPricePst(String mainPricePst) { + this.mainPricePst = mainPricePst; + } + + public String getMainPriceRentPst() { + return mainPriceRentPst; + } + + public void setMainPriceRentPst(String mainPriceRentPst) { + this.mainPriceRentPst = mainPriceRentPst; + } + + public String getMainPriceType() { + return mainPriceType; + } + + public void setMainPriceType(String mainPriceType) { + this.mainPriceType = mainPriceType; + } + + public String getMainPriceRentType() { + return mainPriceRentType; + } + + public void setMainPriceRentType(String mainPriceRentType) { + this.mainPriceRentType = mainPriceRentType; + } + + public Date getUpdateDate() { + return updateDate; + } + + public void setUpdateDate(Date updateDate) { + this.updateDate = updateDate; + } + + public Boolean getStatus() { + return status; + } + + public void setStatus(Boolean status) { + this.status = status; + } + + public Boolean getStandardBuilding() { + return isStandardBuilding; + } + + public void setStandardBuilding(Boolean standardBuilding) { + isStandardBuilding = standardBuilding; + } + + public String getAdjustPriceComment() { + return adjustPriceComment; + } + + public void setAdjustPriceComment(String adjustPriceComment) { + this.adjustPriceComment = adjustPriceComment; + } + + public Integer getPageIndex() { + return pageIndex; + } + + public void setPageIndex(Integer pageIndex) { + this.pageIndex = pageIndex; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/mapper/OfficeBasePriceUltimateMapper.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/mapper/OfficeBasePriceUltimateMapper.java new file mode 100644 index 000000000..1d5eb5a68 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/mapper/OfficeBasePriceUltimateMapper.java @@ -0,0 +1,46 @@ +package com.ruoyi.project.data.price.compute.mapper; + +import java.util.List; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.ruoyi.project.data.price.compute.domain.OfficeBasePriceUltimate; + +/** + * 【请填写功能名称】Mapper接口 + * + * @author ruoyi + * @date 2020-05-20 + */ +@DS("teemlink") +public interface OfficeBasePriceUltimateMapper +{ + + /** + * + * @param id + * @return + */ + OfficeBasePriceUltimate selectOfficeBasePriceUltimateById(String id); + + /** + * 查询【请填写功能名称】列表 + * + * @param officeBasePriceUltimate 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + List<OfficeBasePriceUltimate> selectOfficeBasePriceUltimateList(OfficeBasePriceUltimate officeBasePriceUltimate); + + /** + * 求和 + * @param officeBasePriceUltimate + * @return + */ + Integer selectOfficeBasePriceUltimateListCount(OfficeBasePriceUltimate officeBasePriceUltimate); + + /** + * 更新 + * @param officeBasePriceUltimate + * @return + */ + int updateOfficeBasePriceUltimate(OfficeBasePriceUltimate officeBasePriceUltimate); +} diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/service/IOfficeBasePriceUltimateService.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/service/IOfficeBasePriceUltimateService.java new file mode 100644 index 000000000..39735e046 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/service/IOfficeBasePriceUltimateService.java @@ -0,0 +1,41 @@ +package com.ruoyi.project.data.price.compute.service; + +import com.ruoyi.project.data.price.compute.domain.OfficeBasePriceUltimate; +import com.ruoyi.project.system.domain.SysUser; + +import java.util.List; + +/** + * 【请填写功能名称】Service接口 + * + * @author ruoyi + * @date 2020-05-20 + */ +public interface IOfficeBasePriceUltimateService { + + /** + * 查询【请填写功能名称】列表 + * + * @param officeBasePriceUltimate 【请填写功能名称】 + * @return 【请填写功能名称】集合 + */ + List<OfficeBasePriceUltimate> selectOfficeBasePriceUltimateList(OfficeBasePriceUltimate officeBasePriceUltimate); + + int selectOfficeBasePriceUltimateListCount(OfficeBasePriceUltimate officeBasePriceUltimate); + + + OfficeBasePriceUltimate selectOfficeBasePriceUltimateById(String id); + + int updateOfficeBasePriceUltimate(OfficeBasePriceUltimate officeBasePriceUltimate); + + /** + * + * @param officeBasePriceUltimates + * @param operName + * @return + */ + String batchImport(List<OfficeBasePriceUltimate> officeBasePriceUltimates,String operName); + +} + + diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/service/impl/OfficeBasePriceUltimateServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/service/impl/OfficeBasePriceUltimateServiceImpl.java new file mode 100644 index 000000000..97e25a946 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/compute/service/impl/OfficeBasePriceUltimateServiceImpl.java @@ -0,0 +1,104 @@ +package com.ruoyi.project.data.price.compute.service.impl; + +import java.util.List; + +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.project.data.price.compute.domain.OfficeBasePriceUltimate; +import com.ruoyi.project.data.price.compute.mapper.OfficeBasePriceUltimateMapper; +import com.ruoyi.project.data.price.compute.service.IOfficeBasePriceUltimateService; +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.stereotype.Service; + +/** + * 【请填写功能名称】Service业务层处理 + * + * @author ruoyi + * @date 2020-05-20 + */ +@Service + +public class OfficeBasePriceUltimateServiceImpl implements IOfficeBasePriceUltimateService { + + private static final Logger log = LoggerFactory.getLogger(SysUserServiceImpl.class); + + @Autowired + private OfficeBasePriceUltimateMapper officeBasePriceUltimateMapper; + + /** + * 查询【请填写功能名称】列表 + * + * @param officeBasePriceUltimate 【请填写功能名称】 + * @return 【请填写功能名称】 + */ + @Override + public List<OfficeBasePriceUltimate> selectOfficeBasePriceUltimateList(OfficeBasePriceUltimate officeBasePriceUltimate) { + return officeBasePriceUltimateMapper.selectOfficeBasePriceUltimateList(officeBasePriceUltimate); + } + + @Override + public int selectOfficeBasePriceUltimateListCount(OfficeBasePriceUltimate officeBasePriceUltimate) { + return officeBasePriceUltimateMapper.selectOfficeBasePriceUltimateListCount(officeBasePriceUltimate); + } + + @Override + public OfficeBasePriceUltimate selectOfficeBasePriceUltimateById(String id) { + return officeBasePriceUltimateMapper.selectOfficeBasePriceUltimateById(id); + } + + @Override + public int updateOfficeBasePriceUltimate(OfficeBasePriceUltimate officeBasePriceUltimate) { + return officeBasePriceUltimateMapper.updateOfficeBasePriceUltimate(officeBasePriceUltimate); + } + + @Override + public String batchImport(List<OfficeBasePriceUltimate> officeBasePriceUltimates, String operName) { + if (StringUtils.isNull(officeBasePriceUltimates) || officeBasePriceUltimates.size() == 0) + { + throw new CustomException("导入办公数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + for (OfficeBasePriceUltimate officeBasePriceUltimate : officeBasePriceUltimates) + { + try + { + // 验证是否存在这个用户 + OfficeBasePriceUltimate officeBasePriceUltimateInDb = officeBasePriceUltimateMapper.selectOfficeBasePriceUltimateById(officeBasePriceUltimate.getId()); + if (StringUtils.isNotNull(officeBasePriceUltimateInDb)) + { + this.updateOfficeBasePriceUltimate(officeBasePriceUltimate); + successNum++; + successMsg.append("<br/>" + successNum + "、ID= " + officeBasePriceUltimate.getId() + " 更新成功"); + } + else + { + failureNum++; + failureMsg.append("<br/>" + failureNum + "、ID= " + officeBasePriceUltimate.getId() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "<br/>" + failureNum + "、ID= " + officeBasePriceUltimate.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(); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/project/data/price/release/controller/HomeController.java b/ruoyi/src/main/java/com/ruoyi/project/data/price/release/controller/HomeController.java new file mode 100644 index 000000000..3511f8dc1 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/project/data/price/release/controller/HomeController.java @@ -0,0 +1,4 @@ +package com.ruoyi.project.data.price.release.controller; + +public class HomeController { +} diff --git a/ruoyi/src/main/resources/application-druid.yml b/ruoyi/src/main/resources/application-druid.yml index afe137964..9d44d990e 100644 --- a/ruoyi/src/main/resources/application-druid.yml +++ b/ruoyi/src/main/resources/application-druid.yml @@ -27,7 +27,7 @@ spring: # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 - validationQuery: SELECT 1 FROM DUAL + validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false @@ -43,7 +43,7 @@ spring: wall: config: multi-statement-allow: true - + primary: master datasource: # 主库数据源 master: @@ -52,12 +52,12 @@ spring: username: root password: LOLm2dI2UQF#RxOf # 从库数据源 - slave: - # 从数据源开关/默认关闭 - enabled: false - url: - username: - password: +# slave: +# # 从数据源开关/默认关闭 +# enabled: false +# url: +# username: +# password: teemlink: driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://172.16.30.233:1433;DatabaseName=obpm_LianCheng_Data diff --git a/ruoyi/src/main/resources/mybatis/data/OfficeBasePriceUltimateMapper.xml b/ruoyi/src/main/resources/mybatis/data/OfficeBasePriceUltimateMapper.xml new file mode 100644 index 000000000..fb34bf0de --- /dev/null +++ b/ruoyi/src/main/resources/mybatis/data/OfficeBasePriceUltimateMapper.xml @@ -0,0 +1,96 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!DOCTYPE mapper + PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ruoyi.project.data.price.compute.mapper.OfficeBasePriceUltimateMapper"> + + <resultMap type="com.ruoyi.project.data.price.compute.domain.OfficeBasePriceUltimate" + id="OfficeBasePriceUltimateResult"> + <result property="id" column="id"/> + <result property="yearMonth" column="ITEM_YEARMONTH"/> + <result property="buildingId" column="ITEM_BUILDINGID_P"/> + <result property="communityId" column="ITEM_PROJECTID_P"/> + <result property="mainPrice" column="ITEM_MAINPRICE"/> + <result property="mainPriceRent" column="ITEM_MAINPRICERENT"/> + <result property="mainPricePst" column="ITEM_MAINPRICEPST"/> + <result property="mainPriceRentPst" column="ITEM_MAINPRICERENTPST"/> + <result property="mainPriceType" column="ITEM_MAINPRICETYPE"/> + <result property="mainPriceRentType" column="ITEM_MAINPRICERENTTYPE"/> + <result property="updateDate" column="ITEM_MODIFYDATE"/> + <result property="status" column="ITEM_STATUS"/> + <result property="isStandardBuilding" column="ITEM_BUILDINGSTD"/> + <result property="adjustPriceComment" column="ITEM_ADJEVD"/> + </resultMap> + + <sql id="selectOfficeBasePriceUltimateVo"> + select ITEM_YEARMONTH,ITEM_BUILDINGID,ITEM_UNIFIEDID,ITEM_PROJECTID,ITEM_BUILDINGID_P,ITEM_PROJECTID_P,ITEM_MAINPRICE,ITEM_MAINPRICERENT,ITEM_MAINPRICEPST,ITEM_MAINPRICERENTPST,ITEM_MAINPRICETYPE,ITEM_MAINPRICERENTTYPE,ITEM_MODIFYDATE,ITEM_STATUS,ITEM_BUILDINGSTD,ITEM_ADJEVD,ID from TLK_计价办公核准基价 + </sql> + + <select id="selectOfficeBasePriceUltimateListCount" parameterType="OfficeBasePriceUltimate" resultType="int"> + select count(1) from TLK_计价办公核准基价 + <where> + <if test="yearMonth != null"> + AND ITEM_YEARMONTH = #{yearMonth} + </if> + <if test="communityId != null"> + AND ITEM_PROJECTID_P = #{communityId} + </if> + <if test="buildingId != null"> + AND ITEM_BUILDINGID_P = #{buildingId} + </if> + <if test="status != null"> + AND ITEM_STATUS = #{status} + </if> + </where> + </select> + + <select id="selectOfficeBasePriceUltimateList" parameterType="OfficeBasePriceUltimate" + resultMap="OfficeBasePriceUltimateResult"> + <include refid="selectOfficeBasePriceUltimateVo"/> + <where> + <if test="yearMonth != null"> + AND ITEM_YEARMONTH = #{yearMonth} + </if> + <if test="communityId != null"> + AND ITEM_PROJECTID_P = #{communityId} + </if> + <if test="buildingId != null"> + AND ITEM_BUILDINGID_P = #{buildingId} + </if> + </where> + order by ITEM_YEARMONTH DESC,ID DESC OFFSET #{pageIndex} rows fetch next #{pageSize} rows only; + </select> + + <select id="selectOfficeBasePriceUltimateById" parameterType="String" resultMap="OfficeBasePriceUltimateResult"> + <include refid="selectOfficeBasePriceUltimateVo"/> + where id = #{id} + </select> + + <!-- <insert id="insertOfficeBasePriceUltimate" parameterType="OfficeBasePriceUltimate" useGeneratedKeys="true"--> + <!-- keyProperty="id">--> + <!-- insert into office_base_price_ultimate--> + <!-- <trim prefix="(" suffix=")" suffixOverrides=",">--> + <!-- </trim>--> + <!-- <trim prefix="values (" suffix=")" suffixOverrides=",">--> + <!-- </trim>--> + <!-- </insert>--> + + <update id="updateOfficeBasePriceUltimate" parameterType="OfficeBasePriceUltimate"> + update TLK_计价办公核准基价 set ITEM_YEARMONTH=ITEM_YEARMONTH + <trim prefix="SET" suffixOverrides=","> + </trim> + where id = #{id} + </update> + + <!-- <delete id="deleteOfficeBasePriceUltimateById" parameterType="Integer">--> + <!-- delete from office_base_price_ultimate where id = #{id}--> + <!-- </delete>--> + + <!-- <delete id="deleteOfficeBasePriceUltimateByIds" parameterType="String">--> + <!-- delete from office_base_price_ultimate where id in--> + <!-- <foreach item="id" collection="array" open="(" separator="," close=")">--> + <!-- #{id}--> + <!-- </foreach>--> + <!-- </delete>--> + +</mapper> \ No newline at end of file