From 170800582ce66c770a56e69f6d8b44c38f0728bf Mon Sep 17 00:00:00 2001 From: 叶松 <2217086471@qq.com> Date: 星期一, 27 十一月 2023 22:29:21 +0800 Subject: [PATCH] 安全积分超市对接 --- xcx/robePages/safeManage/approveHidden.vue | 3 web/src/api/modules/safety.js | 39 ++++ web/src/views/SecureManage/NipCheck/components/ScoreDetails.vue | 251 +++++++++++++++++++++++---- web/src/views/SecureManage/NipCheck/NipTips.vue | 3 xcx/robePages/safeManage/checkHidden.vue | 2 web/src/views/SecureManage/NipCheck/components/ScoreMarket.vue | 220 +++++++++++++++++++++++ 6 files changed, 473 insertions(+), 45 deletions(-) diff --git a/web/src/api/modules/safety.js b/web/src/api/modules/safety.js index ad2c24f..2fa8af7 100644 --- a/web/src/api/modules/safety.js +++ b/web/src/api/modules/safety.js @@ -323,4 +323,43 @@ responseType: 'blob', data: params }), + + /** + * 安全积分超市模块 + */ + //查询安全积分超市列表 + searchMarketLists: (params) => + axios.post('/secure/integralAccount/selectPageList', params), + //添加或修改安全积分超市 + addUpdateMarketInfo: (params) => + axios.post('/secure/integralAccount/insertAndUpdate', params), + //删除安全积分超市 + deleteMarketInfo: (params) => + axios.get('/secure/integralAccount/delete',{params}), + //安全积分超市导出 + exportMarketFiles:params=> + axios({ + method: 'post', + url: '/secure/integralAccount/exportList', + responseType: 'blob', + data: params + }), + + /** + * 积分明细模块 + */ + //查询积分明细列表 + searchIntegralLists: (params) => + axios.post('/secure/integralAccount/selectSafeIntegralPageList', params), + //查询个人明细列表 + searchPersonLists: (params) => + axios.post('/secure/integralAccount/selectSafeIntegralInfo', params), + //积分明细导出 + exportIntegralFiles:params=> + axios({ + method: 'post', + url: '/secure/integralAccount/exportSafeIntegralInfo', + responseType: 'blob', + data: params + }), } \ No newline at end of file diff --git a/web/src/views/SecureManage/NipCheck/NipTips.vue b/web/src/views/SecureManage/NipCheck/NipTips.vue index 7753e63..21f07f7 100644 --- a/web/src/views/SecureManage/NipCheck/NipTips.vue +++ b/web/src/views/SecureManage/NipCheck/NipTips.vue @@ -135,6 +135,7 @@ total: 0, disabled:false, loading: false, + userId:null,//创建人 dataList: [], //举报隐患信息列表 positonOptions:[],//隐患地点 imageList:[], @@ -254,6 +255,7 @@ }, // 审核按钮 checkHidden(row) { + this.userId = row.createUser this.asyncTitle = true; this.imageList = [] this.asyncVisible = true; @@ -352,6 +354,7 @@ arrTitle.push({imgPath:item.name}) }) params.imgEntities = arrTitle + params.createUser = this.userId this.$api.Safety.checkHiddenInfo(params).then((res) => { if(res.statusMsg === 'ok') { this.asyncVisible = false; diff --git a/web/src/views/SecureManage/NipCheck/components/ScoreDetails.vue b/web/src/views/SecureManage/NipCheck/components/ScoreDetails.vue index 0a2e352..b4db379 100644 --- a/web/src/views/SecureManage/NipCheck/components/ScoreDetails.vue +++ b/web/src/views/SecureManage/NipCheck/components/ScoreDetails.vue @@ -2,36 +2,36 @@ <div class="main" style="height:89%"> <div class="main_header"> <div class="header_item"> - <span class="header_label">类型:</span> - <el-select v-model="search.type" clearable placeholder="请选择类型"> - <el-option - v-for="item in typeLists" - :key="item.value" - :label="item.label" - :value="item.value"> - </el-option> - </el-select> - </div> - <div class="header_item"> - <span class="header_label">时间范围:</span> - <el-date-picker - v-model="search.time" - type="daterange" - value-format="yyyy-MM-dd HH:mm:ss" - :default-time="['00:00:00','23:59:59']" - range-separator="-" - start-placeholder="起始时间" - end-placeholder="结束时间"> - </el-date-picker> - </div> + <span class="header_label">人员类型:</span> + <el-select v-model="search.userType" clearable placeholder="请选择人员类型" @change="changeType"> + <el-option + v-for="item in optionsType" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + <div class="header_item"> + <span class="header_label">人员姓名:</span> + <el-select v-model="search.userId" filterable clearable placeholder="请选择人员名称"> + <el-option + v-for="item in optionsUser" + :key="item.userId" + :label="item.realName" + :value="item.userId"> + </el-option> + </el-select> + </div> + <div class="header_item"> + <span class="header_label">累计积分范围:</span> + <el-input v-model="search.startIntegral" clearable placeholder="请输入"></el-input> + <el-input v-model="search.endIntegra" style="margin-left:15px" clearable placeholder="请输入"></el-input> + </div> <div class="header_item"> <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button> - <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('export')" @click="exportFiles">导出Excel</el-button> + <!-- <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('export')" @click="exportFiles">导出Excel</el-button> --> </div> - </div> - <div class="score_index"> - <div class="score_titles">积分:</div> - <div class="score_datas"><span>65</span>分</div> </div> <div class="main_content"> <el-table @@ -44,10 +44,20 @@ </template> </el-table-column> <el-table-column prop="createTime" label="时间" align="center" width="150"></el-table-column> - <el-table-column prop="dangerLocation" label="积分分值" align="center" ></el-table-column> - <el-table-column prop="dangerLocation" label="余额" align="center" ></el-table-column> - <el-table-column prop="dangerLocation" label="类型" align="center" ></el-table-column> - <el-table-column prop="title" label="说明" align="center" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="人员姓名" align="center" ></el-table-column> + <el-table-column prop="accumulateIntegral" label="累计积分" align="center" ></el-table-column> + <el-table-column prop="totalIntegral" label="当前积分" align="center" ></el-table-column> + <el-table-column prop="totalConsumption" label="总消耗" align="center" ></el-table-column> + <el-table-column prop="userType" label="人员类型" align="center" > + <template #default="{row}"> + <div>{{optionsType[row.userType-1]&&optionsType[row.userType - 1].label}}</div> + </template> + </el-table-column> + <el-table-column label="操作" align="center"> + <template #default="{ row }"> + <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">个人积分明细</el-button> + </template> + </el-table-column> </el-table> </div> <div class="main_footer"> @@ -62,27 +72,120 @@ :total="total"> </el-pagination> </div> + <!-- 个人积分超市明细 --> + <el-dialog + class="prop_dialog" + title="个人积分明细" + :close-on-click-modal="false" + :visible.sync="asyncVisible" + width="65%"> + <div> + <div class="main_header"> + <div class="header_item"> + <span class="header_label">类型:</span> + <el-select v-model="searchForm.type" clearable placeholder="请选择类型"> + <el-option + v-for="item in optionsFormType" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + <div class="header_item"> + <span class="header_label">时间范围:</span> + <el-date-picker + v-model="searchForm.time" + type="daterange" + value-format="yyyy-MM-dd HH:mm:ss" + :default-time="['00:00:00','23:59:59']" + range-separator="-" + start-placeholder="起始时间" + end-placeholder="结束时间"> + </el-date-picker> + </div> + <div class="header_item"> + <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchFormButtonInfo(true,userIds)">查询</el-button> + <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('export')" @click="exportFiles">导出Excel</el-button> + </div> + </div> + <div class="score_index"> + <div class="score_titles">积分:</div> + <div class="score_datas"><span>{{ruleNumber}}</span>分</div> + </div> + <div class="main_content" style="height:350px"> + <el-table + v-loading="loading" + :data="dataFormList" + height="100%"> + <el-table-column align="center" label="序号" width="60"> + <template #default="scope"> + <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span> + </template> + </el-table-column> + <el-table-column prop="createTime" label="时间" align="center" width="150"></el-table-column> + <el-table-column prop="integralWater" label="积分分值" align="center" ></el-table-column> + <el-table-column prop="balanc" label="余额" align="center" ></el-table-column> + <el-table-column prop="type" label="类型" align="center" > + <template #default="{row}"> + <div>{{optionsFormType[row.type-1]&&optionsFormType[row.type - 1].label}}</div> + </template> + </el-table-column> + <el-table-column prop="remark" label="说明" align="center" show-overflow-tooltip></el-table-column> + </el-table> + </div> + <div class="main_footer"> + <el-pagination + background + @current-change="changeFormPageNum" + @size-change="changeFormPageSize" + :current-page="pageFormNum" + :page-sizes="[10, 20, 50, 100]" + :page-size="pageFormSize" + layout="total, sizes, prev, pager, next, jumper" + :total="totalForm"> + </el-pagination> + </div> + </div> + </el-dialog> </div> </template> <script> import { buttonPinia } from '../../../../pinia/index'; -import { changeSize } from '../../../../plugins/public'; // 导入节流、动态切换组件尺寸方法 +import { changeSize,downFiles } from '../../../../plugins/public'; // 导入节流、动态切换组件尺寸方法 export default { data() { return { size: changeSize(), // 组件尺寸 pageNum: 1, pageSize: 10, + pageFormNum:1, + pageFormSize:10, + ruleNumber:null,//总积分数 + userIds:null,//人员id + totalForm:0, search:{},//查询条件 + optionsUser:[],//人员 + searchForm:{},//弹框中的查询条件 total: 0, disabled:false, loading: false, dataList: [], //积分明细信息列表 + dataFormList:[],//弹框中的列表 imageList:[], - asyncTitle: true, // 对话框title 新增:true 修改:false asyncVisible: false, // 添加 修改对话框 - typeLists:[ + optionsType:[ + { + label:'管理人员', + value:1 + }, + { + label:'劳务人员', + value:2 + }, + ], + optionsFormType:[ { label:'获取', value:1 @@ -91,7 +194,7 @@ label:'消耗', value:2 } - ] + ], } }, watch: { @@ -110,6 +213,17 @@ } }, methods: { + //通过修改人员类型获取对应的人员名称 + changeType(val){ + this.$set(this.search,'userId','') + this.$api.Engineer.getPersonsList({userType:val}).then(res=>{ + if(res.statusMsg === 'ok'){ + this.optionsUser = res.data + }else{ + this.$message.warning(res.statusMsg) + } + }) + }, // 查询按钮列表信息 searchButtonInfo(bol) { if(bol) { @@ -123,7 +237,7 @@ params.endTime = this.search.time&&this.search.time[1] delete params.time this.loading = true; - this.$api.Safety.searchHiddenLists(params).then((res) => { + this.$api.Safety.searchIntegralLists(params).then((res) => { if(res.statusMsg === 'ok') { this.total = res.data.total; this.dataList = res.data.list; @@ -131,8 +245,59 @@ this.loading = false; }) }, + //查询弹框中的列表 + searchFormButtonInfo(bol,userId){ + if(bol) { + this.pageFormNum = 1; + } + let params = Object.assign({},this.searchForm,{ + pageNum: this.pageFormNum, + pageSize: this.pageFormSize, + userId:userId + }) + params.startTime = this.searchForm.time&&this.searchForm.time[0] + params.endTime = this.searchForm.time&&this.searchForm.time[1] + delete params.time + this.loading = true; + this.$api.Safety.searchPersonLists(params).then((res) => { + if(res.statusMsg === 'ok') { + this.totalForm = res.data.data.total; + this.ruleNumber = res.data.integral + this.dataFormList = res.data.data.list; + } + this.loading = false; + }) + }, //导出excel - exportFiles(){}, + exportFiles(){ + let params = {} + params.startTime = this.search.time&&this.search.time[0] + params.endTime = this.search.time&&this.search.time[1] + delete params.time + this.functionLoading(); + this.$api.Safety.exportMarketFiles(params).then(res => { + downFiles(res, '积分明细信息', 'xls') + this.loadingView.close() + }) + .catch(() => { + this.loadingView.close(); + }) + }, + // 转圈圈 + functionLoading() { + this.loadingView = this.$loading({ + lock: true, + text: '请稍后...', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }); + }, + //个人积分明细弹框 + updateProp(row){ + this.userIds = row.userId + this.asyncVisible = true; + this.searchFormButtonInfo(true,row.userId) + }, // 判断按钮权限信息 showButton(str) { const pinia = buttonPinia(); @@ -147,7 +312,17 @@ changePageSize(size) { this.pageSize = size; this.searchButtonInfo(); - } + }, + //切换弹框页数 + changeFormPageNum(page){ + this.pageFormNum = page; + this.searchFormButtonInfo(); + }, + // 切换弹框每页条数 + changeFormPageSize(size) { + this.pageFormSize = size; + this.searchFormButtonInfo(); + }, } } </script> diff --git a/web/src/views/SecureManage/NipCheck/components/ScoreMarket.vue b/web/src/views/SecureManage/NipCheck/components/ScoreMarket.vue index 16d20ed..57960a2 100644 --- a/web/src/views/SecureManage/NipCheck/components/ScoreMarket.vue +++ b/web/src/views/SecureManage/NipCheck/components/ScoreMarket.vue @@ -1,6 +1,28 @@ <template> <div class="main" style="height:89%"> <div class="main_header"> + <div class="header_item"> + <span class="header_label">人员类型:</span> + <el-select v-model="search.userType" clearable placeholder="请选择人员类型" @change="changeType"> + <el-option + v-for="item in optionsType" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + <div class="header_item"> + <span class="header_label">人员姓名:</span> + <el-select v-model="search.userId" filterable clearable placeholder="请选择人员名称"> + <el-option + v-for="item in optionsUser" + :key="item.userId" + :label="item.realName" + :value="item.userId"> + </el-option> + </el-select> + </div> <div class="header_item"> <span class="header_label">时间范围:</span> <el-date-picker @@ -15,6 +37,7 @@ </div> <div class="header_item"> <el-button icon="el-icon-search" v-if="showButton('search')" @click="searchButtonInfo(true)">查询</el-button> + <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('insert')" @click="insertProp">新增</el-button> <el-button class="search_btn" icon="el-icon-plus" v-if="showButton('export')" @click="exportFiles">导出Excel</el-button> </div> </div> @@ -29,8 +52,19 @@ </template> </el-table-column> <el-table-column prop="createTime" label="时间" align="center" width="150"></el-table-column> - <el-table-column prop="dangerLocation" label="积分分值" align="center" ></el-table-column> - <el-table-column prop="title" label="说明" align="center" show-overflow-tooltip></el-table-column> + <el-table-column prop="realName" label="人员姓名" align="center" ></el-table-column> + <el-table-column prop="integralWater" label="积分分值" align="center" > + <template #default="{row}"> + -{{row.integralWater}} + </template> + </el-table-column> + <el-table-column prop="remark" label="说明" align="center" show-overflow-tooltip></el-table-column> + <el-table-column label="操作" align="center"> + <template #default="{ row }"> + <!-- <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="updateProp(row)">修改</el-button> --> + <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteInfo(row)">删除</el-button> + </template> + </el-table-column> </el-table> </div> <div class="main_footer"> @@ -45,12 +79,51 @@ :total="total"> </el-pagination> </div> + <el-dialog + class="prop_dialog" + :title="asyncTitle ? '新增' : '修改'" + :close-on-click-modal="false" + :visible.sync="asyncVisible" + width="35%"> + <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="auto" class="rule_form"> + <el-form-item label="类型:" prop="userType"> + <el-select v-model="ruleForm.userType" clearable placeholder="请选择人员类型" @change="changeType"> + <el-option + v-for="item in optionsType" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </el-form-item> + <el-form-item label="人员姓名:" prop="userId"> + <el-select v-model="ruleForm.userId" filterable clearable placeholder="请选择人员名称"> + <el-option + v-for="item in optionsUser" + :key="item.userId" + :label="item.realName" + :value="item.userId"> + </el-option> + </el-select> + </el-form-item> + <el-form-item label="扣除积分:" prop="integralWater"> + <el-input v-model="ruleForm.integralWater" :size="size" type="number" clearable placeholder="请输入扣除积分"></el-input> + </el-form-item> + <el-form-item label="说明:" prop="remark"> + <el-input v-model="ruleForm.remark" type="textarea" :rows="5" :size="size" clearable placeholder="请输入说明"></el-input> + </el-form-item> + </el-form> + <div slot="footer"> + <el-button @click="asyncVisible = false">取 消</el-button> + <el-button class="submit_btn" @click="asyncTitle ? submitInsert() : submitUpdate()">提 交</el-button> + </div> + </el-dialog> </div> </template> <script> import { buttonPinia } from '../../../../pinia/index'; -import { changeSize } from '../../../../plugins/public'; // 导入节流、动态切换组件尺寸方法 +import { changeSize,throttle,downFiles } from '../../../../plugins/public'; // 导入节流、动态切换组件尺寸方法 export default { data() { return { @@ -61,10 +134,44 @@ total: 0, disabled:false, loading: false, - dataList: [], //举报隐患信息列表 + dataList: [], //安全积分超市 + optionsUser:[],//所有人员 imageList:[], asyncTitle: true, // 对话框title 新增:true 修改:false asyncVisible: false, // 添加 修改对话框 + ruleForm: {}, // 按钮表单 + rules: { + userType: [{ + required: true, + message: '请选择人员类型', + trigger: 'change' + }], + userId: [{ + required: true, + message: '请选择人员姓名', + trigger: 'change' + }], + integralWater: [{ + required: true, + message: '请输入扣除积分', + trigger: 'blur' + }], + remark: [{ + required: true, + message: '请输入说明', + trigger: 'blur' + }], + }, + optionsType:[ + { + label:'劳务人员', + value:2 + }, + { + label:'管理人员', + value:1 + } + ] } }, watch: { @@ -83,6 +190,85 @@ } }, methods: { + //通过修改人员类型获取对应的人员名称 + changeType(val){ + this.$set(this.search,'userId','') + this.$set(this.ruleForm,'userId','') + this.$api.Engineer.getPersonsList({userType:val}).then(res=>{ + if(res.statusMsg === 'ok'){ + this.optionsUser = res.data + }else{ + this.$message.warning(res.statusMsg) + } + }) + }, + // 新增按钮信息 + insertProp() { + this.asyncTitle = true; + this.asyncVisible = true; + }, + // 修改按钮信息 + updateProp(row) { + this.asyncTitle = false; + this.asyncVisible = true; + this.ruleForm = row + }, + // 删除按钮信息 + deleteInfo(row) { + this.$confirm("该操作将删除该信息,是否继续删除?", "提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: "warning" + }) + .then(() => { + this.$api.Safety.deleteMarketInfo({id: row.id}) + .then(res => { + if(res.statusMsg === 'ok') { + this.searchButtonInfo(true); + this.$message.success("删除成功!"); + } else { + this.$message.warning(res.statusMsg); + } + }) + }) + .catch(() => { + this.$message.warning("您已取消"); + }) + }, + // 提交添加按钮信息 + submitInsert: throttle(function() { + this.$refs.ruleForm.validate((valid) => { + if(valid) { + const params = Object.assign({}, this.ruleForm); + this.$api.Safety.addUpdateMarketInfo(params).then((res) => { + if(res.statusMsg === 'ok') { + this.asyncVisible = false; + this.searchButtonInfo(true); + this.$message.success('添加成功!'); + } else { + this.$message.warning(res.statusMsg); + } + }) + } + }) + }, 3000), + // 提交修改按钮信息 + submitUpdate: throttle(function() { + this.$refs.ruleForm.validate((valid) => { + if(valid) { + const params = Object.assign({}, this.ruleForm); + this.$api.Safety.addUpdateMarketInfo(params).then((res) => { + if(res.statusMsg === 'ok') { + this.asyncVisible = false; + this.searchButtonInfo(true); + this.$message.success('修改成功!'); + } else { + this.$message.warning(res.statusMsg); + } + }) + } + }) + }, 3000), // 查询按钮列表信息 searchButtonInfo(bol) { if(bol) { @@ -96,7 +282,7 @@ params.endTime = this.search.time&&this.search.time[1] delete params.time this.loading = true; - this.$api.Safety.searchHiddenLists(params).then((res) => { + this.$api.Safety.searchMarketLists(params).then((res) => { if(res.statusMsg === 'ok') { this.total = res.data.total; this.dataList = res.data.list; @@ -105,7 +291,29 @@ }) }, //导出excel - exportFiles(){}, + exportFiles(){ + let params = {} + params.startTime = this.search.time&&this.search.time[0] + params.endTime = this.search.time&&this.search.time[1] + delete params.time + this.functionLoading(); + this.$api.Safety.exportMarketFiles(params).then(res => { + downFiles(res, '安全积分超市信息', 'xls') + this.loadingView.close() + }) + .catch(() => { + this.loadingView.close(); + }) + }, + // 转圈圈 + functionLoading() { + this.loadingView = this.$loading({ + lock: true, + text: '请稍后...', + spinner: 'el-icon-loading', + background: 'rgba(0, 0, 0, 0.7)' + }); + }, // 判断按钮权限信息 showButton(str) { const pinia = buttonPinia(); diff --git a/xcx/robePages/safeManage/approveHidden.vue b/xcx/robePages/safeManage/approveHidden.vue index ed7a181..dd28690 100644 --- a/xcx/robePages/safeManage/approveHidden.vue +++ b/xcx/robePages/safeManage/approveHidden.vue @@ -92,6 +92,7 @@ data(){ return{ hiddenBtn:0,//是否展示提交按钮 0:展示 + createUser:null,//创建人 checkShow:false,//展示隐患等级和积分值是否可修改 showLever: false,//隐患等级弹框显隐 leverColumns: [ @@ -132,6 +133,7 @@ }, onLoad(option) { this.hiddenBtn = option.status + this.createUser = option.createUser if(option.status==='0'){//0为审批页面、其他为详情页面 this.checkShow = false this.getDetailsInfo(option.id,0) @@ -175,6 +177,7 @@ const params = Object.assign({},this.hiddenDetails); params.level = this.formCheck.levelId params.integral = this.formCheck.integral + params.createUser = this.createUser this.$api.reboSystem.checkHiddenInfo(params).then((res) => { if(res.success) { uni.$u.toast("提交成功!"); diff --git a/xcx/robePages/safeManage/checkHidden.vue b/xcx/robePages/safeManage/checkHidden.vue index 82084ea..749ec7e 100644 --- a/xcx/robePages/safeManage/checkHidden.vue +++ b/xcx/robePages/safeManage/checkHidden.vue @@ -113,7 +113,7 @@ //跳转隐患审批或详情页面 goDetailsPage(val){ uni.navigateTo({ - url: `./approveHidden?id=${val.id}&status=${val.auditStatus}` + url: `./approveHidden?id=${val.id}&status=${val.auditStatus}&createUser=${val.createUser}` }) }, //查询列表 -- Gitblit v1.9.3