Kaynağa Gözat

TASK 44818 河南0702JW需求后台开发-四议表决模块后台-补充二维码

rongxin_dev
yangfuda 6 gün önce
ebeveyn
işleme
358154e68c
5 değiştirilmiş dosya ile 477 ekleme ve 0 silme
  1. +16
    -0
      src/api/sunVillage_info/fixedAssets.js
  2. +2
    -0
      src/permission.js
  3. +18
    -0
      src/router/index.js
  4. +226
    -0
      src/views/sunVillage_info/special_vote.vue
  5. +215
    -0
      src/views/sunVillage_info/special_vote_detail.vue

+ 16
- 0
src/api/sunVillage_info/fixedAssets.js Dosyayı Görüntüle

@@ -1371,6 +1371,22 @@ export function specialPublicityDetail(query) {
params: query
})
}
// 查询四议表决详情
export function specialPublicityVote(query) {
return request({
url: '/open/villageAffairs/public/specialVote',
method: 'get',
params: query
})
}
// 新增表决记录
export function votedetailAdd(data) {
return request({
url: '/open/villageAffairs/public/votedetailAdd',
method: 'post',
data: data
})
}

// 查询四议两公开列表
export function addReadCount(query) {


+ 2
- 0
src/permission.js Dosyayı Görüntüle

@@ -153,6 +153,8 @@ const whiteList = [
'/sunVillage_info/list_special',
'/sunVillage_info/list_special_detail',
'/sunVillage_info/list_special_detail_vote',
'/sunVillage_info/special_vote',
'/sunVillage_info/special_vote_detail',
'/sunVillage_info/list_finance_new',
'/sunVillage_info/list_finance_new_detail',



+ 18
- 0
src/router/index.js Dosyayı Görüntüle

@@ -3524,6 +3524,24 @@ export const constantRoutes = [
},
component: (resolve) => require(['@/views/sunVillage_info/list_special_edit'], resolve)
},
{ ////阳光村务(新)-- 四议表决
path: '/sunVillage_info/special_vote',
name: 'sunVillageInfoSpecialVote',
meta: {
title: '四议表决',
hidden: true,
},
component: (resolve) => require(['@/views/sunVillage_info/special_vote'], resolve)
},
{ ////阳光村务(新)-- 四议表决
path: '/sunVillage_info/special_vote_detail',
name: 'sunVillageInfoSpecialVoteDetail',
meta: {
title: '四议表决',
hidden: true,
},
component: (resolve) => require(['@/views/sunVillage_info/special_vote_detail'], resolve)
},
{ ////阳光村务(新)-- 一张图公开
path: '/sunVillage_info/list_contract_detail',
name: 'sunVillageInfoListContractDetail',


+ 226
- 0
src/views/sunVillage_info/special_vote.vue Dosyayı Görüntüle

@@ -0,0 +1,226 @@
<template>
<div class="home_wrapper">
<div
class="header_main"
:style="`background-image:url(${require('@/assets/images/sunVillage_info/list_head.png')})`"
>
四议表决
</div>

<van-form ref="formData" :readonly="true">
<div class="list_main">
<van-field name="itemName" :value="form.itemName" label="事项名称" input-align="right" :border="false" />
<van-field label="事项内容" :border="false" />
<div class="contentBox" v-html="form.itemContent"></div>
<van-field name="voteType" :value="form.voteType" label="事项节点" label-width="auto" input-align="right" :border="false" />
<van-field name="voteStatus" :value="form.voteStatus" label="事项状态" label-width="auto" input-align="right" :border="false" />
</div>
<div class="list_main">
<div style="display: flex;justify-content: space-between;">
<span style="font-size: 14px;font-weight: bold;margin-left: 5px;">表决情况</span>
<span style="font-size: 14px;margin-left: 15px;">{{form.itemAt}}</span>
</div>
<div style="text-align: right;width: 100%;">
<span style="font-size: 14px;margin-left: 10px;color: #1AC46F">{{voteNum1}}人同意</span>
<span style="font-size: 14px;margin-left: 10px;color: #FF5500">{{voteNum2}}人不同意</span>
<span style="font-size: 14px;margin-left: 10px;color: #999999">{{voteNum3}}人弃权</span>
</div>
<div style="color: #1AC46F;font-size: 14px;margin-left: 10px;margin-top: 10px;">
同意:{{vote1}}
</div>
<div style="color: #v;font-size: 14px;margin-left: 10px;margin-top: 10px;">
不同意:{{vote2}}
</div>
<div style="color: #999999;font-size: 14px;margin-left: 10px;margin-top: 10px;">
弃权:{{vote3}}
</div>
</div>
<div v-if="showHasVote" style="margin: 16px auto;display: flex;justify-content: space-evenly;padding: 0 25px">
<van-button round block type="primary" :to="{name:'sunVillageInfoSpecialVoteDetail', query: {id:form.id}}"
style="border: 0;background-image: linear-gradient(to right, #48CBFC , #2D6DF6);">我要表决</van-button>
</div>
</van-form>
</div>
</template>
<script>
import CommonUpload from "@/components/form/CommonUpload.vue";
import {specialPublicityVote, updateSpecialPublicityCount, addReadCount} from "@/api/sunVillage_info/fixedAssets";
import Cookies from "js-cookie";
export default {
name: "otherOpenDetail",
components: {CommonUpload},
data() {
return {
form: {},
id:'',
title: '综合公开',
vote1: '无',
vote2: '无',
vote3: '无',
voteNum1: 0,
voteNum2: 0,
voteNum3: 0,
showBtn:true,
showHasVote:true,
queryParams:{
bookId:'',
id:'',
deptId:''
},
voteTypeOptions:[],
voteStatusOptions:[],
};
},
created() {
this.otherType = this.$route.query.type;
this.type = this.$route.query.type;
this.queryParams.bookId = this.$route.query.bookId;
this.queryParams.deptId = Cookies.get('deptId');
this.queryParams.id = this.$route.query.id;
this.showBtn = this.$route.query.showBtn=='false'?false:true;
addReadCount({id: this.$route.query.id}).then((resp) => {

});
this.getDicts("vote_type").then((response) => {
this.voteTypeOptions = response.data;
this.getDetail();
});
this.getDicts("vote_status").then((response) => {
this.voteStatusOptions = response.data;
});
},
methods: {
getDetail() {
specialPublicityVote(this.queryParams).then((resp) => {
if(resp.data.voteStatus == '2'){
this.showHasVote = false;
}
resp.data.voteType = this.selectDictLabel(this.voteTypeOptions, resp.data.voteType);
resp.data.voteStatus = this.selectDictLabel(this.voteStatusOptions, resp.data.voteStatus);
this.form = resp.data;
var votedetail =[];
var vote11 = "";
var vote22 = "";
var vote33 = "";
votedetail = resp.data.detailList;
for(let i = 0; i < votedetail.length; i++){
if(votedetail[i].voteResult === '1'){
vote11 += (votedetail[i].voteBy + " ");
this.voteNum1++;
} else if(votedetail[i].voteResult === '2'){
vote22 += (votedetail[i].voteBy + " ");
this.voteNum2++;
}else if(votedetail[i].voteResult === '3'){
vote33 += (votedetail[i].voteBy + " ");
this.voteNum3++;
}
}
if(vote11 != null && vote11.length > 0){
this.vote1 = vote11;
}
if(vote22 != null && vote22.length > 0){
this.vote2 = vote22;
}
if(vote33 != null && vote33.length > 0){
this.vote3 = vote33;
}
});
},
back() {
this.$router.back();
},
hasVote(type){
this.queryParams.countType = type;
updateSpecialPublicityCount(this.queryParams).then((resp) => {
console.log()
resp.data.specialPublicityType = this.selectDictLabel(this.specialPublicityTypeOptions, resp.data.specialPublicityType);
this.form = resp.data;
this.showHasVote = false;
});
}
},
}
</script>
<style scoped lang="scss">
/*/deep/ .van-button--primary{*/
/* background: url("../../assets/images/sunVillage_info/btn_bg.png") no-repeat;*/
/* background-size: 100% 100%;*/
/* border: none;*/
/*}*/
.home_wrapper{
background: #e9e9e9;
min-height: 100vh;
width: 100vw;
.header_main {
height: 116px;
background: url('../../assets/images/sunVillage_info/list_head.png') no-repeat;
background-size: 100% 100%;
position: fixed;
top: 0;
left: 0;
width: 100%;
font-size: 36px;
line-height: 116px;
text-align: center;
color: #fff;
position: relative;

.return_btn {
width: 24px;
height: 43.2px;
background: url('../../assets/images/sunVillage_info/list_icon_5.png') center center no-repeat;
background-size: 20px 36px;
position: absolute;
left: 38px;
top: 36px;
}

.add_btn {
width: 56.4px;
height: 40.8px;
background: url('../../assets/images/sunVillage_info/list_icon_9.png') center center no-repeat;
background-size: 47px 34px;
position: absolute;
right: 38px;
top: 36px;
}
}
.list_main{
padding:25px;
background: #ffffff;
width: 94%;
margin: 25px auto 0;
border-radius: 15PX;
box-shadow: 4px 6px 5px rgba(63, 68, 75, 0.1);
}
.contentBox img{
width: 100%;
}
.titBox{
display: flex;
align-items: center;
}
.tit{
font-size: 36px;
font-weight: bold;
}
/deep/ .van-cell{
padding-left: 0!important;
padding-right: 0!important;
padding-bottom: 0!important;
}
/deep/ .van-field__label{
padding-left: 10PX;
width: 8.2em;
}
/deep/ .van-cell--required::before{
left: 0;
}

}

.open-content {
padding: .2rem .3rem;
max-height: 8rem;
}
</style>

+ 215
- 0
src/views/sunVillage_info/special_vote_detail.vue Dosyayı Görüntüle

@@ -0,0 +1,215 @@
<template>
<div class="app-container">
<div
class="header_main"
:style="`background-image:url(${require('@/assets/images/sunVillage_info/list_head.png')})`"
>
四议表决
<div class="return_btn" @click="onClickLeft"></div>
</div>
<van-form @submit="handleGenerate" @failed="getError" :show-error-message="false" scroll-to-error validate-first>
<div class="main_box">
<van-field label="表决人" required :rules="[{ required: true , message:'请输入表决人' }]" v-model="form.voteBy" placeholder="请输入表决人" input-align="right" label-width="auto"/>
<van-cell title="表决意见" required>
<template #right-icon>
<van-radio-group direction="horizontal" required :rules="[{ required: true , message:'请选择表决意见' }]" v-model="form.voteResult">
<van-radio name="1">同意</van-radio>
<van-radio name="2">不同意</van-radio>
<van-radio name="3">弃权</van-radio>
</van-radio-group>
</template>
</van-cell>
<van-field label="备注" v-model="form.remark" type="textarea" placeholder="请输入备注" input-align="right" rows="3" label-width="auto"/>
</div>
<div>
<van-row>
<p class="title" style="margin: 5px 0px;position: relative;padding-left: 20px;font-size: 16px;">*电子签名</p>
</van-row>
<van-cell-group style="width: 100%;height:100%;overflow: hidden;padding-top: 10px;padding-bottom: 10px;">
<div class="signature-box" @mousedown="canvasTTdown" @touchstart="canvasTTdown">
<vue-esign
ref="esign"
class="mySign"
:width="500"
:height="370"
:isCrop="signature.isCrop"
:lineWidth="signature.lineWidth"
:lineColor="signature.lineColor"
:bgColor.sync="signature.bgColor"
/>
</div>
<img src="../../assets/images/sunVillage_info/signature_icon_10.png" id="canvasTT" style="position:absolute;top: 50%;left: 50%;transform: translate(-50%, -50%) rotate(270deg)" alt="">
<div class="signature-footer">
<van-button @click="handleReset" class="clearBtn" type="info" plain size="small">清空画板</van-button>
<!-- <van-button @click="handleGenerate" type="info" size="small">保存签字</van-button> -->
</div>
</van-cell-group>
</div>
<div style="padding: 16px 0;">
<van-row>
<van-col span="24" align="center">
<van-button round block type="primary" class="submitButton" style="border: 0;background-image: linear-gradient(to right, #48CBFC , #2D6DF6);">保<i style="margin-right: 1em;"></i>存</van-button>
</van-col>
</van-row>
<div class="clear"></div>
</div>
</van-form>
</div>
</template>

<script>
import {votedetailAdd} from "@/api/sunVillage_info/fixedAssets";
import $ from "jquery";
import vueEsign from 'vue-esign'
import {getToken} from "@/utils/auth";
import axios from 'axios'
export default {
name: "votedetailAdd",
data() {
return {
form:{
voteId: this.$route.query.id,
voteBy: null,
voteImg: null,
voteResult: "1",
remark: null,
file: null,
},
//电子签名
signature: {
lineWidth: 6, // 画笔的线条粗细
lineColor: "#000000", // 画笔的颜色
bgColor: "", // 画布的背景颜色
resultImg: "", // 最终画布生成的base64图片
isCrop: false, // 是否裁剪,在画布设定尺寸基础上裁掉四周空白部分
},
};
},
created() {
this.handleReset();
},
methods: {
getError(e){
this.$notify({ type: 'danger', message: e.errors[0].message });
},
goBack(){
window.history.go(-1)
},
canvasTTdown() {
$('#canvasTT').css('display', 'none');
},
// 清空画板
handleReset() {
this.$refs.esign.reset();
$('#canvasTT').css('display', 'block')
},
// 生成签字图片
handleGenerate() {
console.log("正在保存")
this.$toast.loading({
message: "正在保存",
forbidClick: true,
duration: 0,
});
this.$refs.esign
.generate() // 使用生成器调用把签字的图片转换成为base64图片格式
.then((res) => {
this.signature.resultImg = res;
let wj = this.dataURLtoBlob(res);
let param = new FormData() // 创建form对象
param.append('file', wj) // 通过append向form对象添加数据
param.append('voteId', this.form.voteId);
param.append('voteBy', this.form.voteBy);
param.append('voteResult', this.form.voteResult);
param.append('remark', this.form.remark);
votedetailAdd(param).then(response => {
if (response.code === 200) {
this.$toast({
icon: 'success', // 找到自己需要的图标
message: '保存成功',
duration: "1000",
onClose: () => {
this.showSignPopup = false;
this.goBack();
}
});
}
});
})
.catch((err) => {
// 画布没有签字时会执行这里提示一下
this.$toast.fail('请签名后再保存');
});
},
dataURLtoBlob(dataurl, filename = 'file') {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let suffix = mime.split('/')[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], `${filename}.${suffix}`, {
type: mime
})
},
},
}
</script>

<style scoped lang="scss">
.app-container {
padding-bottom: 2%;
.header_main{
height: 116px;
background-size: 100% 100%;
position: fixed;
top: 0;
left: 0;
width: 100%;
font-size: 36px;
line-height: 116px;
text-align: center;
color: #fff;
position: relative;
margin-bottom: 2%;
.return_btn{
width: 24px;
height: 43.2px;
background-size: 20px 36px;
position: absolute;
left: 38px;
top: 36px;
}
}
}
.main_title{
font-size: 0.4rem;
color: #1D6FE9;
margin: 0.2rem 6%;
margin-top: 0;
position: relative;
}
.main_box{
width: 96%;
margin: 0 auto;
border-radius: 6px;
box-shadow: 0px 3px 6px 0px rgba(0,0,0,0.16);
overflow: hidden;
background-color: #FFF;
}
.submitButton{
width: 80%;
margin: 0 auto;
background-color: #1D6FE9;
}

.addFamily{
position: absolute;
top: -2px;
right: 0;
border-radius: 50%;
}
</style>

Yükleniyor…
İptal
Kaydet