调整工程目录

This commit is contained in:
aixianling
2021-12-15 14:37:20 +08:00
parent 76b0abe1ea
commit dd1aef6fb3
107 changed files with 17044 additions and 16746 deletions

View File

@@ -69,13 +69,23 @@ const start = () => {
}
}
findApp('src/apps', file => {
if (/.*\\.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
if (/.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
let app = {
name: file.replace(/.*\\([^\\]+).vue/g, '$1'),
path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/')
}
json.pages.push(app)
}
}).then(() => {
return findApp('src/sass', file => {
if (/.+\\App[^\\]+\\[^\\]+\.vue/g.test(file)) {
let app = {
name: file.replace(/.*\\([^\\]+).vue/g, '$1'),
path: file.replace(/^src\\(.*).vue/g, '$1').replace(/\\/g, '/')
}
json.pages.push(app)
}
})
}).then(() => {
fsExtra.outputJson('src/pages.json', json, () => {
chalkTag.done('生成pages.json')

View File

@@ -11,7 +11,8 @@
"main": "src/apps/index.js",
"files": [
"src/components",
"src/apps"
"src/apps",
"src/sass"
],
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",

View File

@@ -1,193 +0,0 @@
<template>
<div class="template-wrapper">
<div class="form-list">
<div
class="form-list__item"
@click="toAdd(index)"
:style="{'background-image': `url(${$cdn}askform/${index + 1}.png)`}"
v-for="(item, index) in itemList"
:key="index">
<h2>{{ item.name }}</h2>
<div>立即创建</div>
</div>
</div>
<div class="template" v-if="list.length">
<h2>共享模板</h2>
<div class="template-list">
<div class="template-item" v-for="(item, index) in list" :key="index" hover-class="bg-hover" @click="quote(item.id)">
<image :src="`${$cdn}askform/6.png`" />
<h2>{{ item.title }}</h2>
<u-icon name="arrow-right" color="#E1E2E3" />
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'addList',
label: '新建项目',
data () {
return {
itemList: [{
name: '问卷调查'
}, {
name: '考试测评'
}, {
name: '报名登记'
}, {
name: '满意调查'
}, {
name: '投票评选'
}],
list: []
}
},
mounted () {
this.getList()
},
methods: {
toAdd (type) {
this.$emit('change', {
type: 'AddForm',
params: {
type
}
})
},
quote (id) {
this.$emit('change', {
type: 'AddForm',
params: {
id,
isQuote: 1
}
})
},
getList () {
this.$http.post(`/app/appquestionnairetemplate/list`, null, {
params: {
current: 1,
templateType: 1,
size: 10000
}
}).then(res => {
if (res.code == 0) {
this.list = res.data.records
}
})
}
}
}
</script>
<style lang="scss" scoped>
.template-wrapper {
padding-bottom: 120rpx;
.template {
margin: 32px 32px 0;
background: #fff;
border-radius: 8px;
overflow: hidden;
& > h2 {
height: 88px;
line-height: 88px;
padding: 0 24px;
color: #333333;
font-size: 30px;
}
.template-item {
display: flex;
align-items: center;
height: 104px;
padding: 0 24px;
border-bottom: 1px solid #D8DDE6;
&:active {
background-color: #eee;
}
&:last-child {
border: none;
}
image {
width: 36px;
height: 42px;
}
i {
font-size: 30px;
color: #E1E2E3;
}
h2 {
flex: 1;
padding: 0 18px;
color: #333333;
font-size: 28px;
font-weight: normal;
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
}
}
}
.form-list {
display: flex;
flex-wrap: wrap;
padding: 0 32px 0;
div {
box-sizing: border-box;
}
.form-list__item {
width: calc(50% - 13px);
height: 216px;
margin: 32px 24px 0 0;
padding: 40px 20px 52px;
background-color: #FFFFFF;
border-radius: 8px;
background-size: 100% 100%;
&:active {
background-color: #eee;
}
&:nth-of-type(2n) {
margin-right: 0;
}
div {
width: 148px;
height: 48px;
line-height: 48px;
text-align: center;
color: #fff;
font-size: 28px;
background: #6BA1F9;
border-radius: 24px;
}
h2 {
margin-bottom: 32px;
padding-left: 10px;
color: #333333;
font-weight: 700;
font-size: 32px;
}
}
}
}
</style>

View File

@@ -1,163 +0,0 @@
export const components = [
{
type: 'radio',
label: '单选',
fixedLabel: '单选',
value: '',
points: '',
icon: 'iconradio',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'checkbox',
label: '多选',
fixedLabel: '多选',
points: '',
icon: 'iconcheck_box',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: [],
value: [],
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
},
{
dictName: '答对几项得几分,答错不得分',
dictValue: '2'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: [],
checked: false
},
{
label: '选项2',
point: '',
value: '',
img: [],
checked: false
}
],
title: ''
},
{
type: 'select',
label: '单下拉框',
fixedLabel: '单下拉框',
value: '',
points: '',
icon: 'iconSelect',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
placeholder: '请选择',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'input',
label: '单行填空',
fixedLabel: '单行填空',
value: '',
pointType: '0',
icon: 'icontext_box',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
placeholder: '请输入...',
answer: ''
},
{
type: 'textarea',
label: '多行填空',
fixedLabel: '多行填空',
pointType: '0',
icon: 'icontext_area',
points: '',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
placeholder: '请输入...',
value: ''
},
{
type: 'upload',
label: '上传图片',
fixedLabel: '上传图片',
value: '',
icon: 'iconpic',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
answer: ''
}
];

View File

@@ -1,558 +0,0 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="!list">
<div class="card">
<header>{{ detail.title }}</header>
<u-gap height="16"></u-gap>
<u-row v-if="detail.createUserId">
<!-- <u-avatar :src="$cdn + 'common/xzh.png'" v-if="false"></u-avatar>-->
<div class="u-avatar__img">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</div>
<span class="user-name">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="32"></u-gap>
<u-row>
<img :src="$cdn + 'common/meeting.png'" alt="">
<span :style="{color:color(detail.status)}">{{ $dict.getLabel('meetStatus', detail.status) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<img :src="$cdn + 'common/date.png'" alt="">
<span>{{ detail.startTime && detail.startTime.substr(0, 16) }} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row style="align-items: start;flex-wrap: nowrap;">
<img :src="$cdn + 'common/location.png'" alt="">
<span>{{ detail.address }}</span>
</u-row>
</div>
<div class="card">
<span>{{ detail.content }}</span>
</div>
<div class="card" v-if="detail.files && detail.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detail.files" @click="preFile(item)" :key="index">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.fileName }}.{{ item.postfix }}</span>
</label>
<span>{{ item.fileSizeStr }}</span>
</u-row>
</div>
</div>
<div class="card item-wrap">
<u-row justify="between">
<span>参会人</span>
<label class="right" @click="list=true">
查看全部<em>{{ detail.attendees && detail.attendees.length }}</em>
<div class="right-arrow"></div>
</label>
</u-row>
</div>
<div class="footer cancel" v-if="detail.status==1 && detail.createUserId == user.id" @click="handleCancel">取消会议
</div>
<template v-else>
<div class="footer" v-if="['1','2'].includes(detail.status) && ['0','3'].includes(detail.joinStatus)">
<div class="leave" @click="updateStatus(0)">
<img :src="$cdn + 'sass/leave.png'" alt="">请假
</div>
<div @click="toDo" class="leave">
<img :src="$cdn + 'sass/toBe.png'" alt="">待定
</div>
<div @click="updateStatus(1)">确认会议</div>
</div>
<!-- <div class="footer" v-if="['1','2'].includes(detail.status) && detail.joinStatus!=0">-->
<!-- <label>{{ detail.joinStatus|transform }}</label>-->
<!-- <img :src="$cdn + tag(detail.joinStatus)" alt="">-->
<!-- </div>-->
</template>
</template>
<template v-else>
<div class="att-list">
<AiTopFixed>
<u-tabs :list="tabs" :current="current" height="96" :is-scroll="false" bar-width="192"
@change="change"></u-tabs>
</AiTopFixed>
<div v-for="(item,index) in detail.attendees && detail.attendees.filter(e=>e.joinStatus==current)" :key="index"
class="att-wrap">
<div class="left">
<u-avatar :src="item.avatar || (($cdn + 'common/xztx.png'))" size="74" mode="square" style="margin-right: 8px"></u-avatar>
<AiOpenData type="userName" :openid="item.name"></AiOpenData>
</div>
<!-- <img :src="$cdn + 'common/phone.png'" alt="" @click="call(item)">-->
</div>
</div>
</template>
<u-modal v-model="show" title="提示" show-cancel-button content='是否要取消该会议?' @confirm="onConfirm"></u-modal>
<AiBack/>
</div>
</template>
<script>
import {mapActions, mapState} from "vuex";
export default {
name: "detail",
data() {
return {
detail: {},
list: false,
current: 0,
pageShow: false,
show: false,
id:null,
}
},
onLoad(opt){
this.id = opt.id;
},
computed: {
...mapState(["user"]),
tabs() {
return [
{name: this.count(0) + "人未确认"},
{name: this.count(1) + "人已确认"},
{name: this.count(2) + "人已请假"},
{name: this.count(3) + "人待定"},
]
},
},
methods: {
onConfirm() {
this.$http.post("/app/appmeetinginfo/cancel", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("取消成功");
this.getDetail();
}
})
},
handleCancel() {
this.show = true;
},
toDo() {
this.$http.post("/app/appmeetinginfo/tobeConfirm", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("会议待定");
setTimeout(_ => {
uni.navigateBack();
}, 800)
}
})
},
count(sta) {
return this.detail.attendees ? this.detail.attendees?.filter(e => e.joinStatus == sta)?.length : 0;
},
change(index) {
this.current = index;
this.detail = {};
this.getDetail();
},
call(item) {
if (item.phone) {
uni.makePhoneCall({
phoneNumber: item.phone
});
}
},
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
tag(status) {
return {
"1": "common/2confirmed2.png",
"2": "common/2absent2.png"
}[status]
},
updateStatus(status) {
this.$http.post(status == 0 ? "/app/appmeetinginfo/absent" : "/app/appmeetinginfo/confirm", null, {
params: {
meetingId: this.id,
reason: status == 0 ? "" : null
}
}).then(res => {
if (res.code == 0) {
this.$u.toast(status == 0 ? "请假成功" : "确认成功")
this.getDetail()
}
})
},
color(status) {
if (status == 1) {
return "#FF8822"
}
if (status == 2) {
return "#1365DD"
}
if (status == 3) {
return "#FF4466"
}
return "#343D65"
},
getDetail() {
this.$http.post("/app/appmeetinginfo/info-id", null, {
params: {id: this.id}
}).then(res => {
if (res && res.data) {
this.detail = res.data
this.pageShow = true
}
})
}
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "会议详情";
this.$dict.load("meetStatus");
wx.hideOptionMenu();
},
filters: {
transform(status) {
if (status == 1) {
return "已确认"
}
if (status == 2) {
return "已请假"
}
}
}
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .AiTopFixed {
margin-bottom: 16px;
.content {
padding: 0 !important;
}
}
.att-list {
min-height: 100%;
.att-wrap {
display: flex;
height: 112px;
align-items: center;
justify-content: space-between;
background-color: #ffffff;
box-sizing: border-box;
padding: 0 50px;
border-bottom: 1px solid #E4E5E6;
.left {
display: flex;
align-items: center;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
.name {
font-size: 30px;
font-weight: 600;
color: #333333;
}
}
& > img {
width: 48px;
height: 48px;
}
}
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
/*margin-left: 8px;*/
}
& > span {
font-size: 30px;
color: #343D65;
margin-left: 16px;
}
::v-deep .u-avatar__img {
width: 56px;
height: 56px;
vertical-align: middle;
color: #ffffff;
background-color: #2266FF;
font-size: 16px;
}
.user-name{
font-size: 30px;
color: #343D65;
}
img {
width: 48px;
height: 48px;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
box-sizing: border-box;
padding: 16px 0;
}
.label {
height: 96px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 522px;
display: flex;
align-items: center;
& > img {
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
text-overflow: ellipsis;
overflow-x: hidden;
white-space: nowrap;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
.name {
font-size: 32px;
font-weight: 400;
color: #333333;
}
.wrap {
height: 112px;
display: flex;
align-items: center;
position: relative;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
& > label {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #4E8EEE;
font-size: 28px;
font-weight: 600;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.item-wrap {
height: 112px;
padding: 0 32px;
.u-row {
height: 100%;
& > span {
font-size: 32px;
font-weight: 400;
color: #333333;
}
}
.right {
font-size: 28px;
color: #999999;
display: flex;
align-items: center;
em {
font-style: normal;
color: #1365DD;
}
.right-arrow {
width: 16px;
height: 16px;
border-top: 5px solid #CCCCCC;
border-right: 5px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background-color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
& > div {
font-size: 28px;
color: #666666;
display:flex;
flex-direction: column;
& > img {
width: 48px;
height: 48px;
}
}
& > div:nth-child(1), & > div:nth-child(2) {
width: 135px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
& > div:last-child {
width: calc(100% - 270px);
height: 100%;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
background-color: #1365DD;
}
& > label {
font-size: 36px;
font-weight: 400;
color: #999999;
}
/*img {*/
/* width: 158px;*/
/* height: 104px;*/
/* position: absolute;*/
/* right: 0;*/
/* top: 0;*/
/*}*/
}
.cancel {
color: #ffffff;
font-size: 36px;
background-color: #005DFF
}
}
</style>

View File

@@ -1,226 +0,0 @@
<template>
<div class="meeting-list">
<div class="card" v-for="(item,index) in list" :key="index" @click="detail(item)">
<header>
<span>{{item.title}}</span>
<span>
<span v-if="index==2">保存于</span>
{{item.createTime}}</span>
</header>
<u-row justify="between">
<div class="time">
<span>{{item.startTime|format}}</span>
<span>{{item.startTime|formatDate(0)}}{{item.startTime|formatDate(1)}}{{item.startTime|formatDate(2)}} {{item.startTime|formatWeek}}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{item.endTime|format}}</span>
<span>{{item.endTime|formatDate(0)}}{{item.endTime|formatDate(1)}}{{item.endTime|formatDate(2)}} {{item.endTime|formatWeek}}</span>
</div>
</u-row>
<u-row class="info">
<span>发起人员</span>
<AiOpenData type="userName" :openid="item.createUserId"/>
</u-row>
<u-gap height="20"></u-gap>
<u-row class="info">
<span>会议地点</span>
<span>{{item.address}}</span>
</u-row>
<div class="tag" v-if="item.status!=0" :style="{background:'url(' + $cdn + tag(item.status) +')'}"></div>
</div>
<u-loadmore :status="status" v-if="list.length"/>
<AiEmpty v-if="!list.length"></AiEmpty>
<AiBack/>
</div>
</template>
<script>
export default {
name: "meetingList",
props: {
params: {
type: [String, Number, Object],
}
},
data() {
return {
list: [],
current: 1,
index: null,
status: "加载更多",
}
},
onLoad(opt) {
this.index = opt.index
uni.setNavigationBarTitle({
title: opt.index == 0 ? "历史会议" : "草稿箱"
});
this.getData();
},
methods: {
detail({id}) {
let url
if (this.index == 2) {
url = "/apps/AppMeetingNotice/addMeeting?id=" + id
} else {
url = "/apps/AppMeetingNotice/detail?id=" + id
}
uni.navigateTo({url})
},
tag(status) {
return {
"1": 'common/1wks.png',
"2": 'common/1jxz.png',
"3": 'common/1yqx.png',
"4": 'common/1yjs.png'
}[status]
},
getData() {
this.$http.post("/app/appmeetinginfo/list", null, {
params: {
listType: this.index == 0 ? "2" : '0',
meetingStatus: this.index == 0 ? "4" : "0",
size: 10,
current: this.current,
}
}).then(res => {
if (res && res.data) {
if (this.current > 1 && this.current > res.data.pages) {
this.status = "已经到底啦"
}
this.list = this.current > 1 ? [...this.list, ...res.data.records] : res.data.records
}
})
},
},
onReachBottom() {
this.current ++;
this.getData();
},
filters: {
format(date) {
return date.split(" ")[1].substr(0, 5)
},
formatDate(date, index) {
return date.split(" ")[0].split("-")[index]
},
formatWeek(date) {
return "日一二三四五六".charAt((new Date(date.split(" ")[0]).getDay()))
}
},
}
</script>
<style lang="scss" scoped>
.meeting-list {
min-height: 100%;
background-color: #F5F5F5;
box-sizing: border-box;
padding: 32px;
.card {
background-color: #FFFFFF;
box-sizing: border-box;
padding: 32px;
border-radius: 8px;
margin-bottom: 32px;
position: relative;
&:last-child {
margin-bottom: 0;
}
& > header {
width: 95%;
font-size: 32px;
font-weight: 600;
color: #333333;
display: flex;
flex-direction: column;
& > span:last-child {
font-size: 28px;
font-weight: 400;
color: #999999;
margin-top: 10px;
}
}
.time {
display: flex;
flex-direction: column;
margin: 46px 0;
& > span:first-child {
font-size: 60px;
font-weight: 600;
color: #333333;
line-height: 84px;
}
& > span:last-child {
font-size: 22px;
color: #333333;
}
}
.arrow {
width: 28px;
height: 68px;
overflow: hidden;
position: relative;
transform: rotate(180deg);
&:before, &:after {
content: "";
width: 50px;
height: 50px;
position: absolute;
transform: scaleY(1.3) translate(30%, -40px) rotate(45deg);
}
&:before {
top: 59px;
background-color: #CCCCCC;
}
&:after {
left: 7px;
top: 59px;
background-color: #FFFFFF;
}
}
.info {
flex-wrap: nowrap;
& > span:first-child {
flex-shrink: 0;
font-size: 30px;
color: #999999;
}
& > span:last-child {
font-size: 30px;
color: #343D65;
}
}
.tag {
width: 112px;
height: 112px;
background-repeat: no-repeat !important;
background-size: 100% 100% !important;
position: absolute;
top: 0;
right: 0;
}
}
}
</style>

View File

@@ -1,360 +0,0 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="detailObj.status!=2">
<div class="card">
<header>{{ detailObj.title }}</header>
<u-gap height="16"></u-gap>
<u-row>
<span>发布人</span>
<span v-if="detailObj.createUserId">
<AiOpenData type="userName" :openid="detailObj.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布部门</span>
<span v-if="detailObj.unitName">
<AiOpenData type="departmentName" :openid="detailObj.unitName"></AiOpenData>
</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布日期</span>
<span>{{ detailObj.releaseTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
</div>
<div class="card">
<div class="label">公告内容</div>
<u-parse :html="detailObj.content"></u-parse>
</div>
<div class="card" style="padding-top: 0" v-if="detailObj.files && detailObj.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detailObj.files" :key="index" @click="preFile(item)">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.name }}.{{ item.postfix }}</span>
</label>
<span>{{ (item.size / 1024).toFixed(2) }}KB</span>
</u-row>
</div>
</div>
<div class="card" @click="handleClick">
<u-row justify="between" class="item">
<span>接收对象</span>
<div class="right">
<em>{{ detailObj.readNum }}</em>已读
<em>{{ detailObj.unReadNum }}</em>未读
<div class="arrow"></div>
</div>
</u-row>
</div>
</template>
<AiEmpty description="该通知已撤回" v-else/>
<AiBack/>
</div>
</template>
<script>
import {mapActions} from "vuex";
export default {
name: "detail",
data() {
return {
detailObj: {},
id: null,
pageShow: false,
flag: false,
}
},
onLoad(opt) {
this.id = opt.id;
this.flag = opt.flag;
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "公告详情";
wx.hideOptionMenu();
},
methods: {
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
getDetail() {
this.$http.post("/app/appannouncement/detail", null, {
params: {
id: this.id,
detail: this.flag
}
}).then(res => {
if (res && res.data) {
this.detailObj = res.data;
this.pageShow = true
}
})
},
handleClick() {
uni.navigateTo({
url:"/apps/AppNotification/read?id=" + this.id,
})
}
},
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .content {
padding: 0;
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 22px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
}
& > span {
font-size: 30px;
color: #343D65;
line-height: 48px;
}
& > span:last-child {
font-size: 30px;
/*color: #343D65;*/
/*margin-left: 16px;*/
line-height: 48px;
}
.title {
width: 490px;
height: 112px;
display: flex;
align-items: center;
font-size: 32px;
color: #333333;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.right {
font-size: 28px;
display: flex;
align-items: center;
color: #666666;
.arrow {
width: 16px;
height: 16px;
border-top: 3px solid #CCCCCC;
border-right: 3px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.item {
position: relative;
height: 80px;
&:after {
width: 100%;
height: 1px;
background-color: rgba(216, 221, 230, 0.5);
content: "";
position: absolute;
left: 0;
bottom: 0;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
}
.label {
height: 80px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
& > em {
font-style: normal;
font-size: 32px;
color: #1365DD;
}
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 476px;
display: flex;
align-items: center;
word-break: break-all;
& > img {
flex-shrink: 0;
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
& > text {
width: 100%;
display: inline-block;
font-size: 30px;
color: #649EFD;
text-align: center;
}
.progress {
height: 12px;
background: #F2F4FC;
border-radius: 12px;
position: relative;
margin: 16px 0 64px 0;
.pro-active {
height: 12px;
background: #639EFD;
border-radius: 12px;
position: absolute;
left: 0;
top: 0;
}
}
em {
font-style: normal;
font-size: 28px;
color: #1365DD;
}
::v-deep .u-collapse {
position: relative;
&:after {
content: "";
width: 718px;
height: 1px;
background-color: rgba(216, 221, 230, 0.5);
position: absolute;
left: 0;
bottom: 0;
}
.u-collapse-head {
padding: 40px 0;
}
.u-collapse-content {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background: #1365DD;
display: flex;
align-items: center;
justify-content: center;
font-size: 36px;
color: #FFFFFF;
}
}
</style>

View File

@@ -2,19 +2,23 @@
<div class="AppWalkask">
<template v-if="isList">
<div class="header-top">
<u-tabs :list="tabList" :is-scroll="false" :current="currentTabs" height="96" bg-color="#3975C6" inactive-color="#fff" active-color="#fff" @change="change"></u-tabs>
<u-tabs :list="tabList" :is-scroll="false" :current="currentTabs" height="96" bg-color="#3975C6"
inactive-color="#fff" active-color="#fff" @change="change"></u-tabs>
</div>
<div class="header-middle">
<div class="currentLeft" v-if="currentTabs == 0">
<div class="currentLeft-top">
<div class="left">
<img src="./components/images/icon2.png" alt="" />
<img src="./components/images/icon2.png" alt=""/>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect" style="color: #fff"> </AiAreaPicker>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect"
style="color: #fff"></AiAreaPicker>
</div>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF" search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch" @clear="handerClear"></u-search>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF"
search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch"
@clear="handerClear"></u-search>
</div>
<template v-if="data.length > 0">
@@ -29,7 +33,8 @@
<div class="cards-hint">{{ item.description }}</div>
<div class="imgs">
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i" @click.stop="previewImage(item.images, items.url)" />
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i"
@click.stop="previewImage(item.images, items.url)"/>
</div>
<div class="cards-bottom">
@@ -46,7 +51,7 @@
</template>
<div v-else>
<AiEmpty description="您还未添加过入户调查走访" class="emptyWrap"> </AiEmpty>
<AiEmpty description="您还未添加过入户调查走访" class="emptyWrap"></AiEmpty>
<div class="addBtn">点击<span class="toAdds" @click="goDetail">新增按钮</span>试试试吧~</div>
</div>
@@ -55,12 +60,15 @@
<div class="currentRight" v-if="currentTabs == 1">
<div class="currentLeft-top">
<div class="left">
<img src="./components/images/icon2.png" alt="" />
<img src="./components/images/icon2.png" alt=""/>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect" style="color: #fff"> </AiAreaPicker>
<AiAreaPicker v-model="areaId" ref="areaIds" :areaId="areaId" @select="areaSelect"
style="color: #fff"></AiAreaPicker>
</div>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF" search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch" @clear="handerClear"></u-search>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#1F5CAF"
search-icon-color="#E2E8F1" color="#E2E8F1" height="58" @search="handerSearch"
@clear="handerClear"></u-search>
</div>
<template v-if="data.length > 0">
@@ -75,7 +83,8 @@
<div class="cards-hint">{{ item.description }}</div>
<div class="imgs">
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i" @click.stop="previewImage(item.images, items.url)" />
<img :src="items.url" alt="" v-for="(items, i) in item.images" :key="i"
@click.stop="previewImage(item.images, items.url)"/>
</div>
<div class="cards-bottom">
@@ -92,17 +101,18 @@
</template>
<div v-else>
<AiEmpty description="您还未添加过入户调查走访" class="emptyWrap"> </AiEmpty>
<AiEmpty description="您还未添加过入户调查走访" class="emptyWrap"></AiEmpty>
<div class="addBtn">点击<span class="toAdds" @click="goDetail">新增按钮</span>试试试吧~</div>
</div>
</div>
</div>
<u-modal v-model="deletShow" content="您确认要删除该条信息吗?" :show-cancel-button="true" :mask-close-able="true" :show-title="false" @confirm="delet"></u-modal>
<u-modal v-model="deletShow" content="您确认要删除该条信息吗?" :show-cancel-button="true" :mask-close-able="true"
:show-title="false" @confirm="delet"></u-modal>
<AiFixedBtn>
<div class="addBtn iconfont iconfont-iconfangda" @tap.stop="goDetail()" />
<div class="addBtn iconfont iconfont-iconfangda" @tap.stop="goDetail()"/>
</AiFixedBtn>
</template>
@@ -111,7 +121,7 @@
</template>
<script>
import { mapState } from 'vuex'
import {mapState} from 'vuex'
import add from './add.vue'
import detail from './detail.vue'
@@ -147,12 +157,13 @@ export default {
deletId: '',
}
},
computed: { ...mapState(['user']) },
computed: {...mapState(['user'])},
created() {
this.areaId = this.user.areaId
this.getList()
},
mounted() {},
mounted() {
},
methods: {
getList() {
this.$http
@@ -247,11 +258,13 @@ export default {
<style lang="scss" scoped>
.AppWalkask {
height: 100%;
.header-middle {
.currentLeft,
.currentRight {
padding-bottom: 56px;
background: #fff;
.currentLeft-top {
display: flex;
align-items: center;
@@ -262,6 +275,7 @@ export default {
width: 40%;
display: flex;
align-items: center;
img {
width: 48px;
height: 48px;
@@ -272,6 +286,7 @@ export default {
.AiCard {
::v-deep .start {
border-bottom: 1px solid #dddddd;
.fill {
.cards-left {
.walkName {
@@ -280,6 +295,7 @@ export default {
margin-right: 16px;
color: #333;
}
.tags {
display: inline-block;
padding: 6px 16px;
@@ -290,6 +306,7 @@ export default {
margin-left: 16px;
}
}
.cards-hint {
margin-top: 16px;
font-size: 30px;
@@ -302,17 +319,21 @@ export default {
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
}
.imgs {
margin-top: 20px;
img {
width: 221px;
height: 221px;
margin-right: 8px;
}
img:nth-child(3n + 0) {
margin-right: 0;
}
}
.cards-bottom {
margin: 24px 0 16px 0;
font-size: 24px;
@@ -341,6 +362,7 @@ export default {
color: #b7b7b7;
margin-top: 5px;
font-weight: 800;
.toAdds {
color: #467dfe;
}

View File

@@ -4,30 +4,34 @@
<div class="header-description">
<u-form :model="forms" ref="uForm" label-width="auto">
<u-form-item label="区域选择" prop="areaId" style="position: relative">
<AiAreaPicker v-model="forms.areaId" ref="areaIds" :areaId="areaIdProps" @select="areaSelect" style="color: #333"> </AiAreaPicker>
<AiAreaPicker v-model="forms.areaId" ref="areaIds" :areaId="areaIdProps" @select="areaSelect"
style="color: #333"></AiAreaPicker>
</u-form-item>
<u-form-item label="走访对象" prop="create_user_name" required style="position: relative">
<u-input v-model="forms.create_user_name" disabled placeholder="请选择走访对象" @click="toWalkObject" />
<u-input v-model="forms.create_user_name" disabled placeholder="请选择走访对象" @click="toWalkObject"/>
<u-icon name="arrow-right" color="#CCCCCC" style="position: absolute; top: 25px; right: 30px"></u-icon>
</u-form-item>
<u-form-item label="现实状态" prop="reality" style="position: relative">
<u-input v-model="forms.reality" disabled placeholder="请选择走访慰问对象" @click="showStstus = true" />
<u-input v-model="forms.reality" disabled placeholder="请选择走访慰问对象" @click="showStstus = true"/>
<u-select v-model="showStstus" :list="$dict.getDict('realityStatus')" value-name="dictValue" label-name="dictName" @confirm="realityStstus"></u-select>
<u-select v-model="showStstus" :list="$dict.getDict('realityStatus')" value-name="dictValue"
label-name="dictName" @confirm="realityStstus"></u-select>
<u-icon name="arrow-right" color="#CCCCCC" style="position: absolute; top: 25px; right: 30px"></u-icon>
</u-form-item>
<u-form-item label="入户走访事项" prop="title" required label-position="top">
<u-input v-model="forms.title" placeholder="请输入入户走访事项(30字以内)" type="textarea" auto-height height="60" maxlength="30" />
<u-input v-model="forms.title" placeholder="请输入入户走访事项(30字以内)" type="textarea" auto-height height="60"
maxlength="30"/>
<div>{{ forms.title.length }}/30</div>
</u-form-item>
<u-form-item label="入户走访内容" prop="description" label-position="top">
<u-input v-model="forms.description" placeholder="请输入入户走访事项(500字以内)" type="textarea" auto-height height="60" maxlength="500" />
<u-input v-model="forms.description" placeholder="请输入入户走访事项(500字以内)" type="textarea" auto-height height="60"
maxlength="500"/>
<div>{{ forms.description.length }}/500</div>
</u-form-item>
@@ -47,7 +51,7 @@
</template>
<script>
import { mapState } from 'vuex'
import {mapState} from 'vuex'
import walkObject from './walkObject'
export default {
@@ -79,7 +83,7 @@ export default {
clickedUserSelect: false,
}
},
computed: { ...mapState(['user']) },
computed: {...mapState(['user'])},
created() {
this.areaIdProps = this.user.areaId
this.$dict.load('realityStatus').then(() => {
@@ -118,7 +122,7 @@ export default {
if (this.forms.images) {
this.forms.images.map((e) => {
console.log(e)
imgs.push({ url: e.url, id: e.id })
imgs.push({url: e.url, id: e.id})
})
}
@@ -143,7 +147,7 @@ export default {
console.log(5)
this.$u.toast('保存成功')
this.flag = false
uni.navigateTo({ url: `./AppWalkask` })
uni.navigateTo({url: `./AppWalkask`})
console.log(6)
}
})
@@ -187,20 +191,24 @@ export default {
.add {
height: 100%;
padding-bottom: 112px;
.header-description {
::v-deep .u-form {
.u-form-item {
margin-bottom: 16px;
.u-form-item__body {
.u-form-item--right__content__slot {
padding-bottom: 0;
}
}
}
.u-form-item:last-child {
margin-bottom: 0;
padding-bottom: 20px !important;
}
.avatars {
.u-form-item__body {
.default {

View File

@@ -28,7 +28,7 @@
<div class="hint-con" v-if="data.description">{{ data.description }}</div>
<div class="imgs">
<img :src="item.url" alt="" v-for="(item, index) in data.images" :key="index" />
<img :src="item.url" alt="" v-for="(item, index) in data.images" :key="index"/>
</div>
</div>
@@ -54,7 +54,8 @@ export default {
this.getDetail()
})
},
mounted() {},
mounted() {
},
methods: {
getDetail() {
this.$http.post(`/app/appvisitvondolence/queryDetailById?id=${this.params.id}`).then((res) => {
@@ -73,14 +74,17 @@ export default {
<style lang="scss" scoped>
.detail {
height: 100%;
.header-top {
background: #3975c6;
padding: 24px 32px 32px;
.hint {
font-size: 40px;
font-weight: 500;
color: #ffffff;
}
.walk-item {
font-size: 28px;
color: #d7e3f3;
@@ -91,17 +95,21 @@ export default {
.header-middle {
background: #fff;
padding: 32px 32px 32px 32px;
.hint-con {
font-size: 32px;
color: #666666;
}
.imgs {
margin: 32px 0 48px 0;
img {
width: 218px;
height: 218px;
margin-right: 16px;
}
img:nth-child(3n + 0) {
margin-right: 0;
}

View File

@@ -1,7 +1,8 @@
<template>
<div class="walkObject">
<div class="header-top">
<u-search v-model="keyword" placeholder="搜索" :show-action="false" bg-color="#F5F5F5" search-icon-color="#CCCCCC" placeholder-color="#999999" @search="handerSearch" @clear="handerClear"></u-search>
<u-search v-model="keyword" placeholder="搜索" :show-action="false" bg-color="#F5F5F5" search-icon-color="#CCCCCC"
placeholder-color="#999999" @search="handerSearch" @clear="handerClear"></u-search>
</div>
<div class="header-middle">
@@ -12,7 +13,8 @@
<div class="Checkbox">
<div v-if="DiyList.length > 0">
<u-collapse event-type="close" arrowaccordion>
<u-collapse-item v-for="(item, index) in DiyList" :title="item.menuLevel2Name" :key="index" @change="selectUser(item)">
<u-collapse-item v-for="(item, index) in DiyList" :title="item.menuLevel2Name" :key="index"
@change="selectUser(item)">
<u-radio-group v-model="value">
<u-radio v-for="(item, index) in userList" :key="index" :name="item.create_user_name">
{{ item.create_user_name }}
@@ -26,7 +28,7 @@
</u-collapse>
</div>
<AiEmpty description="没有数据" class="emptyWrap" v-else> </AiEmpty>
<AiEmpty description="没有数据" class="emptyWrap" v-else></AiEmpty>
</div>
</div>
@@ -73,7 +75,8 @@ export default {
created() {
this.getDiyList()
},
mounted() {},
mounted() {
},
methods: {
getDiyList() {
this.$http.post('/app/appapplicationinfo/queryApplicationListByType?type=0').then((res) => {
@@ -86,7 +89,7 @@ export default {
selectUser(item) {
console.log(item.id)
this.appId = item.id
this.$http.post(`/app/appapplicationinfo/list?appId=${item.id}&current=${this.current}&size=${99}`, { searchParam: this.keyword }).then((res) => {
this.$http.post(`/app/appapplicationinfo/list?appId=${item.id}&current=${this.current}&size=${99}`, {searchParam: this.keyword}).then((res) => {
if (res.code == 0) {
this.userList = res.data.records
}
@@ -96,7 +99,7 @@ export default {
submit() {
this.userList.map((item) => {
if (item.create_user_name == this.value) {
this.$emit('back', { item: item, appId: this.appId })
this.$emit('back', {item: item, appId: this.appId})
}
})
},
@@ -109,6 +112,7 @@ export default {
.walkObject {
background: #ffffff;
padding-bottom: 118px;
.header-top {
background: #fff;
padding: 20px 32px;
@@ -123,10 +127,12 @@ export default {
font-size: 30px;
font-weight: 500;
}
.empty-div {
height: 16px;
background: #f5f5f5;
}
.Checkbox {
padding: 0 20px 0 30px;
@@ -153,6 +159,7 @@ export default {
width: 100%;
box-sizing: border-box;
padding: 0 32px;
.subBtn {
margin: 20px 0 18px 0;
padding: 18px 32px;
@@ -161,8 +168,10 @@ export default {
font-size: 32px;
color: #ffffff;
}
.typeName {
margin: 36px 0 22px 0;
.typeName-box {
padding: 16px 14px;
background: #eaeef1;
@@ -171,6 +180,7 @@ export default {
font-weight: 500;
margin-left: 10px;
}
.typeName-box:first-child {
margin-left: 0;
}

View File

@@ -180,7 +180,7 @@ function requestAndroid(permissionID) {
return new Promise((resolve, reject) => {
plus.android.requestPermissions(
[permissionID],
function(resultObj) {
function (resultObj) {
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
@@ -199,7 +199,7 @@ function requestAndroid(permissionID) {
}
resolve(result);
},
function(error) {
function (error) {
console.log('result error: ' + error.message)
resolve({
code: error.code,
@@ -234,7 +234,7 @@ function gotoAppPermissionSetting() {
}
const permission = {
get isIOS(){
get isIOS() {
return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios')
},
requestIOS: requestIOS,

View File

@@ -7,11 +7,9 @@
</template>
<script>
export default {
export default {
name: "AiAdd",
props: {
},
props: {},
data() {
return {}
},
@@ -20,11 +18,11 @@
this.$emit("add")
}
}
}
}
</script>
<style lang="scss" scoped>
.movableArea {
.movableArea {
position: fixed;
left: 0;
top: 0;
@@ -36,9 +34,9 @@
uni-movable-view {
pointer-events: auto;
}
}
}
.AiAdd {
.AiAdd {
width: 96px;
height: 96px;
background: #1365DD;
@@ -48,7 +46,8 @@
align-items: center;
flex-direction: column;
justify-content: center;
&:before , &:after{
&:before, &:after {
content: "";
background: #FFFFFF;
display: block;
@@ -56,14 +55,14 @@
border-radius: 4px;
}
&:before{
&:before {
height: 48px;
width: 4px;
}
&:after{
&:after {
height: 4px;
width: 48px;
}
}
}
</style>

View File

@@ -2,21 +2,22 @@
<section class="AiAreaPicker">
<ai-search-popup mode="bottom" ref="areaSelector">
<div slot="btn" @tap="handleInit">
<slot v-if="$slots.default" />
<slot v-if="$slots.default"/>
<div v-else class="areaSelector">
<image :src="icon" class="location" />
<div v-text="currentArea.name" />
<image :src="icon" class="location"/>
<div v-text="currentArea.name"/>
</div>
</div>
<div class="areaSelector">
<div class="fixedTop">
<span v-for="(area, i) in fullArea" :key="area.id" v-text="area.name" :class="{ current: area.id == index }" @click="selectNode(area, i)" />
<span v-for="(area, i) in fullArea" :key="area.id" v-text="area.name" :class="{ current: area.id == index }"
@click="selectNode(area, i)"/>
</div>
<span v-text="currentArea.name" />
<span v-text="currentArea.name"/>
</div>
<div class="pendingItem flexRow" flex v-for="op in list" :key="op.id">
<div class="fill" :class="{ self: index == op.id }" v-html="op.name" @tap="handleSelect(op)" />
<u-icon v-if="index != op.id" name="arrow-right" color="#ddd" @click="getChild(op)" />
<div class="fill" :class="{ self: index == op.id }" v-html="op.name" @tap="handleSelect(op)"/>
<u-icon v-if="index != op.id" name="arrow-right" color="#ddd" @click="getChild(op)"/>
</div>
</ai-search-popup>
</section>
@@ -25,14 +26,14 @@
<script>
import AiSearchPopup from './AiSearchPopup'
import AiCell from './AiCell.vue'
import { mapState } from 'vuex'
import {mapState} from 'vuex'
export default {
name: 'AiAreaPicker',
components: { AiCell, AiSearchPopup },
components: {AiCell, AiSearchPopup},
props: {
areaId: { default: '' },
name: { default: '' },
areaId: {default: ''},
name: {default: ''},
all: Boolean,
},
computed: {
@@ -58,7 +59,7 @@ export default {
},
data() {
return {
fullArea: [{ name: '全国', id: 0 }],
fullArea: [{name: '全国', id: 0}],
index: '',
list: [],
}
@@ -75,7 +76,7 @@ export default {
this.$http
.post('/admin/area/getAllParentAreaId', null, {
withoutToken: true,
params: { areaId },
params: {areaId},
})
.then((res) => {
if (res?.data) {
@@ -84,7 +85,7 @@ export default {
} else {
this.fullArea = res.data
}
this.fullArea.unshift({ name: '全国', id: 0 })
this.fullArea.unshift({name: '全国', id: 0})
}
})
},
@@ -93,7 +94,7 @@ export default {
this.$http
.post('/admin/area/queryAreaByParentId', null, {
withoutToken: true,
params: { id },
params: {id},
})
.then((res) => {
if (res?.data) {
@@ -104,7 +105,7 @@ export default {
})
},
getProvinces() {
this.$http.post('/admin/area/queryProvinceList', null, { withoutToken: true }).then((res) => {
this.$http.post('/admin/area/queryProvinceList', null, {withoutToken: true}).then((res) => {
if (res?.data) {
this.list = res.data
}

View File

@@ -26,13 +26,13 @@ export default {
justify-content: center;
.emptyImg {
width: 400 rpx;
height: 240 rpx;
width: 400px;
height: 240px;
margin-top: 112px;
}
.emptyText {
font-size: 29 rpx;
font-size: 29px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: rgba(183, 183, 183, 1);

View File

@@ -45,7 +45,7 @@ export default {
current: this.image,
urls: [this.image],
success() {
sessionStorage.setItem("previewImage"," 1")
sessionStorage.setItem("previewImage", " 1")
}
})
} else {

View File

@@ -12,10 +12,10 @@
</template>
<script>
import tree from "./AiSelectEnterprise/tree";
import AiBack from "./AiBack";
import tree from "./AiSelectEnterprise/tree";
import AiBack from "./AiBack";
export default {
export default {
name: "AiSelectEnterprise",
components: {tree, AiBack},
props: {
@@ -72,11 +72,11 @@
}
}
},
}
}
</script>
<style lang="scss" scoped>
.AiSelectEnterprise {
.AiSelectEnterprise {
min-height: 100%;
background-color: #F5F5F5;
position: relative;
@@ -144,5 +144,5 @@
margin-left: 8px;
}
}
}
}
</style>

View File

@@ -24,10 +24,10 @@
<div class="inline-item" @click.stop="backTree(item,index)" v-if="index!=0">
<span style="margin: 0 8px">/</span>
<text v-if="index==parent.length-1" class="none inline-item">
{{item[tag]}}
{{ item[tag] }}
</text>
<text v-else class="active">
{{item[tag]}}
{{ item[tag] }}
</text>
</div>
</div>
@@ -50,17 +50,17 @@
<u-row justify="between" style="width: 100%;">
<div class="word" v-if="tag=='name'">
<img :src="$cdn + 'common/xzbq.png'" v-if="item.type==1" alt="">
<span class="ellipsis">{{item[tag]}}</span>
<span class="ellipsis">{{ item[tag] }}</span>
</div>
<div class="word" v-else-if="tag=='tagname'">
<template v-if="!item.openId">
<img :src="$cdn + 'common/xzbqbottom.png'" alt="">
<span class="ellipsis">{{item[tag]}}</span>
<span class="ellipsis">{{ item[tag] }}</span>
</template>
<template v-else>
<u-avatar :src="item.avatar || ($cdn + 'common/xztx.png')" mode="square" :size="37"
style="margin: 0 17px;"></u-avatar>
<span class="ellipsis">{{item["name"]}}</span>
<span class="ellipsis">{{ item["name"] }}</span>
</template>
</div>
<div class="right"
@@ -75,9 +75,9 @@
</template>
<script>
import AiTopFixed from "../AiTopFixed";
import AiTopFixed from "../AiTopFixed";
export default {
export default {
name: "tree",
components: {AiTopFixed},
props: {
@@ -282,7 +282,7 @@
this.isSear = true
this.parent.splice(1, Infinity)
this.tree = this.searchResult
if(!val) this.clear()
if (!val) this.clear()
},
search(data, keyword) {
@@ -353,12 +353,12 @@
created() {
this.getTree()
}
}
}
</script>
<style lang="scss" scoped>
.tree {
.tree {
min-height: 100%;
background-color: #F5F5F5;
@@ -430,7 +430,7 @@
margin: 0 34px;
}
.ellipsis{
.ellipsis {
width: 450px;
overflow: hidden;
text-overflow: ellipsis;
@@ -477,5 +477,5 @@
box-sizing: border-box;
padding: 20px 32px 0;
}
}
}
</style>

View File

@@ -1,24 +1,26 @@
<template>
<view class="imt-audio">
<view class="audio-wrapper">
<view class="audio-number">{{format(current)}}</view>
<slider class="audio-slider" :activeColor="color" block-size="16" :value="current" :max="duration || 10" @changing="seek=true,current=$event.detail.value" @change="audio.seek($event.detail.value)"></slider>
<view class="audio-number">{{format(duration)}}</view>
<view class="audio-number">{{ format(current) }}</view>
<slider class="audio-slider" :activeColor="color" block-size="16" :value="current" :max="duration || 10"
@changing="seek=true,current=$event.detail.value" @change="audio.seek($event.detail.value)"></slider>
<view class="audio-number">{{ format(duration) }}</view>
</view>
<view class="audio-control-wrapper" :style="{color}">
<image
class="audio-control audio-control-switch"
@click="audio.paused?play():audio.pause()"
:src="paused ? playImg : stopImg" />
:src="paused ? playImg : stopImg"/>
<p>{{ paused ? '点击播放' : '点击停止播放' }}</p>
</view>
</view>
</template>
<script>
import stopImg from '../pages/resourcesManage/img/stop-img.png'
import playImg from '../pages/resourcesManage/img/play-icon.png'
export default {
import stopImg from '../pages/resourcesManage/img/stop-img.png'
import playImg from '../pages/resourcesManage/img/play-icon.png'
export default {
data() {
return {
audio: uni.createInnerAudioContext(),
@@ -101,7 +103,7 @@
this.seek = false
})
},
beforeDestroy(){
beforeDestroy() {
this.audio.destroy()
},
watch: {
@@ -114,72 +116,72 @@
}
}
}
}
}
</script>
<style>
.imt-audio {
.imt-audio {
background: #fff;
border-radius: 20upx;
}
border-radius: 20 upx;
}
.audio-wrapper {
.audio-wrapper {
display: flex;
align-items: center;
}
}
.audio-number {
width: 120upx;
font-size: 24upx;
.audio-number {
width: 120 upx;
font-size: 24 upx;
line-height: 1;
color: #999999;
text-align: center;
}
}
.audio-slider {
.audio-slider {
flex: 1;
margin: 0;
}
}
.audio-control-wrapper {
margin-top: 40upx;
.audio-control-wrapper {
margin-top: 40 upx;
text-align: center;
}
}
.audio-control-wrapper p {
.audio-control-wrapper p {
color: #999999;
font-size: 26rpx;
}
font-size: 26 rpx;
}
.audio-control-wrapper image {
width: 128rpx;
height: 128rpx;
}
.audio-control-wrapper image {
width: 128 rpx;
height: 128 rpx;
}
.audio-control {
font-size: 32upx;
.audio-control {
font-size: 32 upx;
line-height: 1;
border-radius: 50%;
}
}
.audio-control-next {
.audio-control-next {
transform: rotate(180deg);
}
}
.audio-control-switch {
font-size: 40upx;
margin: 0 100upx;
}
.audio-control-switch {
font-size: 40 upx;
margin: 0 100 upx;
}
.audioLoading {
.audioLoading {
animation: loading 2s;
animation-iteration-count: infinite;
animation-timing-function: linear;
}
}
@keyframes loading {
@keyframes loading {
to {
transform: rotate(360deg);
}
}
}
</style>

View File

@@ -19,7 +19,8 @@
<span>联系方式</span>
</div>
<div class="right">
<input placeholder="请输入" type="number" v-model="form.phone" :maxlength="11" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" type="number" v-model="form.phone" :maxlength="11"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -52,7 +53,7 @@
<span>家庭住址</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.address" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.address" placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -64,7 +65,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.move">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -78,7 +81,8 @@
<span>安置地区</span>
</div>
<div class="right">
<AiAreaPicker ref="area" class="aiArea" :areaId.sync="form.placeAreaId" mode="custom" all @select="onChange">
<AiAreaPicker ref="area" class="aiArea" :areaId.sync="form.placeAreaId" mode="custom" all
@select="onChange">
<span class="label" v-if="form.placeArea">{{ form.placeArea }}</span>
<i v-else>请选择</i>
<u-icon name="arrow-right" color="#ddd"/>
@@ -93,7 +97,7 @@
<span>安置地区详细地址</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.place" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.place" placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -103,13 +107,13 @@
</template>
<script>
import AiUploader from '@/components/AiUploader'
import AiSelect from '@/components/AiSelect'
import AiArea from '@/components/AiArea'
import AiAreaPicker from '@/components/AiAreaPicker'
import AiUploader from '@/components/AiUploader'
import AiSelect from '@/components/AiSelect'
import AiArea from '@/components/AiArea'
import AiAreaPicker from '@/components/AiAreaPicker'
export default {
data () {
export default {
data() {
return {
form: {
addressAreaId: '',
@@ -135,13 +139,13 @@
AiAreaPicker
},
created () {
created() {
this.$areaId = this.$store.state.user.areaId
this.areaName = this.$store.state.user.areaFullName
this.$dict.load(['fpType', 'fpYesOrNo'])
},
onLoad (query) {
onLoad(query) {
if (query.id) {
this.isEdit = true
this.id = query.id
@@ -151,7 +155,7 @@
},
methods: {
submit () {
submit() {
if (!this.form.type) {
return this.$u.toast('请选择监测类型')
}
@@ -180,7 +184,7 @@
})
},
onAreaChange (e) {
onAreaChange(e) {
this.form.addressAreaId = e.id
const areaList = this.$refs.address.fullArea
let fullAreaName = ''
@@ -191,7 +195,7 @@
this.form.addressArea = fullAreaName.replace('全国', '')
},
onChange (e) {
onChange(e) {
this.form.placeAreaId = e.id
const areaList = this.$refs.area.fullArea
let fullAreaName = ''
@@ -202,7 +206,7 @@
this.form.placeArea = fullAreaName.replace('全国', '')
},
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.form = {
@@ -213,18 +217,19 @@
})
}
}
}
}
</script>
<style lang="scss">
.add {
.add {
padding-bottom: 120px;
.aiArea {
display: flex;
align-items: center;
.label {
color: #303133!important;
color: #303133 !important;
font-size: 30px;
}
@@ -361,5 +366,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -21,7 +21,7 @@
<span>姓名</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.name" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.name" placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -32,7 +32,7 @@
<span>身份证号</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.idNumber" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.idNumber" placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -122,7 +122,7 @@
<span>务工区域</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.workArea" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.workArea" placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -133,7 +133,8 @@
<span>务工时长()</span>
</div>
<div class="right">
<input placeholder="请输入" type="number" v-model="form.workingMonths" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" type="number" v-model="form.workingMonths"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -147,7 +148,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.medicalInsurance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -160,7 +163,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.sicknessInsurance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -173,7 +178,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.endowmentInsurance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -186,7 +193,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.subsistenceAllowance">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -199,7 +208,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.destitute">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -210,10 +221,11 @@
</template>
<script>
import AiSelect from '@/components/AiSelect'
import AiDate from '@/components/AiDate'
export default {
data () {
import AiSelect from '@/components/AiSelect'
import AiDate from '@/components/AiDate'
export default {
data() {
return {
form: {
destitute: '',
@@ -247,7 +259,7 @@
AiDate
},
onLoad (query) {
onLoad(query) {
uni.showLoading()
this.id = query.id
this.$dict.load(['fpRelationship', 'sex', 'fpNation', 'fpHealth', 'fpEducation', 'fpYesOrNo', 'fpLaborSkills', 'fpPoliticalOutlook',
@@ -262,7 +274,7 @@
},
methods: {
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
if (this.isEdit) {
@@ -277,7 +289,7 @@
})
},
rules () {
rules() {
return {
relationship: '请选择与户主关系',
name: '请输入姓名',
@@ -293,7 +305,7 @@
}
},
submit () {
submit() {
const rules = this.rules()
for (let v of Object.keys(rules)) {
@@ -325,11 +337,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.add {
.add {
padding-bottom: 120px;
::v-deep .u-radio {
@@ -457,5 +469,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -21,10 +21,10 @@
</template>
<script>
import AiUploader from '@/components/AiUploader'
import AiUploader from '@/components/AiUploader'
export default {
data () {
export default {
data() {
return {
detail: '',
pid: '',
@@ -37,7 +37,7 @@
AiUploader
},
onLoad (query) {
onLoad(query) {
if (query.id) {
this.getInfo(query.id)
this.id = query.id
@@ -46,7 +46,7 @@
},
methods: {
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopovertylog/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.detail = res.data.detail
@@ -55,7 +55,7 @@
})
},
submit () {
submit() {
if (!this.detail) {
return this.$u.toast('请输入帮扶内容')
}
@@ -78,11 +78,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.form {
.form {
padding-bottom: 120px;
div {
@@ -155,5 +155,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -9,7 +9,7 @@
<div class="item-wrapper">
<div class="item-header item-avatar">
<div class="left">
<image src="/static/images/avatar.png" />
<image src="/static/images/avatar.png"/>
<div class="left-right">
<h2>{{ info.name }}</h2>
<p>{{ info.phone }}</p>
@@ -47,14 +47,17 @@
</div>
<div class="item-info">
<label>监测员电话</label>
<span style="color: #3D94FB;" @click="call(info.monitoringContactPhone)">{{ info.monitoringContactPhone || '-' }}</span>
<span style="color: #3D94FB;"
@click="call(info.monitoringContactPhone)">{{ info.monitoringContactPhone || '-' }}</span>
</div>
</div>
<div class="item-wrapper">
<div class="item-header">
<div class="left">
<h2>家庭成员</h2>
<i :style="{color: info.familyList.length ? '#2EA222' : '#FF4466'}">({{ info.familyList.length ? '已填写' : '未填写' }})</i>
<i :style="{color: info.familyList.length ? '#2EA222' : '#FF4466'}">({{
info.familyList.length ? '已填写' : '未填写'
}})</i>
</div>
<span @click="linkTo('/pages/Monitor/FamilyMember?id=' + info.id)">编辑</span>
</div>
@@ -71,7 +74,9 @@
<div class="item-header">
<div class="left">
<h2>家庭情况</h2>
<i :style="{color: isFamilySituation ? '#2EA222' : '#FF4466'}">({{ isFamilySituation ? '已填写' : '未填写' }})</i>
<i :style="{color: isFamilySituation ? '#2EA222' : '#FF4466'}">({{
isFamilySituation ? '已填写' : '未填写'
}})</i>
</div>
<span @click="linkTo('/pages/Monitor/FamilySituation?id=' + info.id)">编辑</span>
</div>
@@ -121,18 +126,19 @@
<div class="log-item__user">
<div class="left">
<div class="user">
<span>{{ item.createUserName.substr(item.createUserName.length - 2)}}</span>
<span>{{ item.createUserName.substr(item.createUserName.length - 2) }}</span>
</div>
<h2>{{ item.createUserName }}</h2>
</div>
<div class="right">
<span>{{ item.createTime }}</span>
<image src="/static/images/more.png" @click="edit(item.id)" />
<image src="/static/images/more.png" @click="edit(item.id)"/>
</div>
</div>
<p>{{ item.detail }}</p>
<div class="imgs">
<image :src="img.url" @click="prevImg(item.imgs, img.url)" v-for="(img, index) in item.imgs" :key="index" />
<image :src="img.url" @click="prevImg(item.imgs, img.url)" v-for="(img, index) in item.imgs"
:key="index"/>
</div>
</div>
</div>
@@ -146,12 +152,13 @@
</template>
<script>
import AiFixedBtn from '@/components/AiFixedBtn'
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
import AiFixedBtn from '@/components/AiFixedBtn'
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
name: 'detail',
data () {
data() {
return {
info: {},
pageShow: false,
@@ -167,7 +174,7 @@
},
computed: {
isIncome () {
isIncome() {
if (!this.info.id) {
return false
}
@@ -177,7 +184,7 @@
},
isPoorStatus () {
isPoorStatus() {
if (!this.info.id) {
return false
}
@@ -187,7 +194,7 @@
},
isFamilySituation () {
isFamilySituation() {
if (!this.info.id) {
return false
}
@@ -198,7 +205,7 @@
}
},
onLoad (query) {
onLoad(query) {
if (query.isFrom) {
this.isFrom = true
uni.setNavigationBarTitle({
@@ -217,13 +224,13 @@
},
methods: {
linkTo (url) {
linkTo(url) {
uni.navigateTo({
url
})
},
call (phone) {
call(phone) {
if (phone) {
uni.makePhoneCall({
phoneNumber: phone
@@ -231,7 +238,7 @@
}
},
edit (id) {
edit(id) {
uni.showActionSheet({
itemList: ['编辑', '删除'],
success: res => {
@@ -256,7 +263,7 @@
})
},
prevImg (urls, img) {
prevImg(urls, img) {
const imgs = urls.map(v => v.url)
uni.previewImage({
urls: imgs,
@@ -264,17 +271,17 @@
})
},
toAddLog () {
toAddLog() {
uni.navigateTo({
url: '/pages/Monitor/AddLog?pid=' + this.info.id
})
},
changeTab (index) {
changeTab(index) {
this.currIndex = index
},
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.info = res.data
@@ -308,11 +315,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.detail {
.detail {
padding-top: 96px;
padding-bottom: 60px;
@@ -355,8 +362,8 @@
span {
position: relative;
flex: 1;
height: 96rpx;
line-height: 96rpx;
height: 96 rpx;
line-height: 96 rpx;
color: #000000;
text-align: center;
font-size: 32px;
@@ -463,7 +470,7 @@
&:last-child {
.log-item__wrapper {
border: none!important;
border: none !important;
}
}
@@ -535,5 +542,5 @@
}
}
}
}
}
</style>

View File

@@ -80,7 +80,7 @@
<div class="addBtn iconfont iconfont-iconfangda" @tap="toAdd"></div>
</ai-fixed-btn>
<div class="no-more" v-if="!list.length">
<image src="/static/images/empty.png" />
<image src="/static/images/empty.png"/>
<div>
<span>您还未添加过家庭成员点击</span>
<i>新增按钮</i>
@@ -91,11 +91,11 @@
</template>
<script>
import AiFixedBtn from '@/components/AiFixedBtn'
import AiBack from '@/components/AiBack'
import AiFixedBtn from '@/components/AiFixedBtn'
import AiBack from '@/components/AiBack'
export default {
data () {
export default {
data() {
return {
list: [],
id: '',
@@ -109,7 +109,7 @@
AiFixedBtn
},
onLoad (query) {
onLoad(query) {
uni.showLoading()
this.id = query.id
this.$dict.load(['fpRelationship', 'sex', 'fpNation', 'fpHealth', 'fpEducation', 'fpYesOrNo', 'fpLaborSkills', 'fpPoliticalOutlook',
@@ -123,13 +123,13 @@
},
methods: {
toAdd () {
toAdd() {
uni.navigateTo({
url: '/pages/Monitor/AddFamilyMember?id=' + this.id
})
},
toEdit (index) {
toEdit(index) {
this.$confirm('确定编辑该数据?').then(() => {
uni.navigateTo({
url: `/pages/Monitor/AddFamilyMember?id=${this.id}&index=${index}`
@@ -138,7 +138,7 @@
})
},
remove (index) {
remove(index) {
this.$confirm('确定删除该数据?').then(() => {
let familyList = JSON.parse(JSON.stringify(this.list))
familyList.splice(index, 1)
@@ -158,11 +158,11 @@
})
},
showMore (index) {
showMore(index) {
this.list[index].isShow = !this.list[index].isShow
},
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.info = res.data
@@ -181,11 +181,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.familyMember {
.familyMember {
padding: 32px 0;
.no-more {
@@ -332,5 +332,5 @@
}
}
}
}
}
</style>

View File

@@ -9,7 +9,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.dilapidatedHouse">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -22,7 +24,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.drinkingWaterSafety">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -49,11 +53,11 @@
</template>
<script>
import AiBack from '@/components/AiBack'
import AiSelect from '@/components/AiSelect'
import AiBack from '@/components/AiBack'
import AiSelect from '@/components/AiSelect'
export default {
data () {
export default {
data() {
return {
form: {
dilapidatedHouse: '',
@@ -69,7 +73,7 @@
AiSelect
},
onLoad (query) {
onLoad(query) {
this.$dict.load(['fpYesOrNo', 'fpRiskType'])
uni.showLoading()
this.id = query.id
@@ -77,7 +81,7 @@
},
methods: {
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.form = {
@@ -90,7 +94,7 @@
})
},
submit () {
submit() {
uni.showLoading()
this.$http.post('/app/apppreventionreturntopoverty/addOrUpdate', {
...this.form,
@@ -107,11 +111,11 @@
})
},
}
}
}
</script>
<style lang="scss">
.add {
.add {
padding-bottom: 120px;
.form-textarea {
@@ -255,5 +259,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -7,7 +7,8 @@
<span>工资收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income1" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income1" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -17,7 +18,8 @@
<span>生产经营收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income2" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income2" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -27,7 +29,8 @@
<span>财产性收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income3" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income3" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -37,7 +40,8 @@
<span>转移性收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income4" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income4" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -47,7 +51,8 @@
<span>理赔收入</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income8" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income8" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -59,7 +64,8 @@
<span>生产经营支出</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income5" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income5" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -69,7 +75,8 @@
<span>合规自然支出</span>
</div>
<div class="right">
<input placeholder="请输入" v-model="form.income9" type="number" placeholder-style="color: #999; font-size: 30rpx;" />
<input placeholder="请输入" v-model="form.income9" type="number"
placeholder-style="color: #999; font-size: 30rpx;"/>
</div>
</div>
</div>
@@ -80,8 +87,8 @@
</template>
<script>
export default {
data () {
export default {
data() {
return {
form: {
income1: '',
@@ -96,14 +103,14 @@
}
},
onLoad (query) {
onLoad(query) {
uni.showLoading()
this.id = query.id
this.getInfo(query.id)
},
methods: {
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.form = {
@@ -116,7 +123,7 @@
})
},
submit () {
submit() {
uni.showLoading()
this.$http.post('/app/apppreventionreturntopoverty/addOrUpdate', {
...this.form,
@@ -133,11 +140,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.add {
.add {
padding-bottom: 120px;
.tips {
@@ -263,5 +270,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -12,11 +12,11 @@
</template>
<script>
import Statistics from './components/Statistics.vue'
import List from './components/List.vue'
import Statistics from './components/Statistics.vue'
import List from './components/List.vue'
export default {
data () {
export default {
data() {
return {
currIndex: 0
}
@@ -28,11 +28,11 @@
},
computed: {
tabBar () {
tabBar() {
const link = icon => `${this.$cdn}askform/${icon}.png`
return [
{text: "监测对象列表", iconPath: "bdlb1", selectedIconPath: "bdlb2" },
{text: "数据统计", iconPath: "xjxm1", selectedIconPath: "xjxm2" }
{text: "监测对象列表", iconPath: "bdlb1", selectedIconPath: "bdlb2"},
{text: "数据统计", iconPath: "xjxm1", selectedIconPath: "xjxm2"}
].map(e => ({
...e,
iconPath: link(e.iconPath),
@@ -41,7 +41,7 @@
}
},
onLoad () {
onLoad() {
uni.$on('reload', () => {
if (this.currIndex === 0) {
this.$refs.list.reload()
@@ -54,11 +54,11 @@
this.$refs.list.getList()
}
}
}
}
</script>
<style lang="scss" scoped>
.povertyMonitor {
.povertyMonitor {
.footer {
display: flex;
position: fixed;
@@ -83,5 +83,5 @@
}
}
}
}
}
</style>

View File

@@ -86,7 +86,9 @@
</div>
<div class="right">
<u-radio-group v-model="form.isRisk" @change="onRiskChange">
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">{{ item.dictName }}</u-radio>
<u-radio :name="item.dictValue" v-for="(item, index) in $dict.getDict('fpYesOrNo')" :key="index">
{{ item.dictName }}
</u-radio>
</u-radio-group>
</div>
</div>
@@ -119,11 +121,11 @@
</template>
<script>
import AiSelect from '@/components/AiSelect'
import AiDate from '@/components/AiDate'
import AiSelect from '@/components/AiSelect'
import AiDate from '@/components/AiDate'
export default {
data () {
export default {
data() {
return {
result: '',
form: {
@@ -147,7 +149,7 @@
AiSelect
},
onLoad (query) {
onLoad(query) {
uni.showLoading()
this.$dict.load(['fpYesOrNo', 'fpRiskEliminationMethod', 'fpIndustrialAssistance', 'fpHealthAssistance', 'fpEmploymentAssistance',
'fpEducationalAssistance', 'fpFinancialAssistance', 'fpSocialAssistance', 'fpPublicWelfarePostAssistance']).then(() => {
@@ -157,7 +159,7 @@
},
methods: {
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.form = {
@@ -174,14 +176,14 @@
})
},
onRiskChange (e) {
onRiskChange(e) {
if (e === '02') {
this.form.riskEliminationMethod = ''
this.form.riskEliminationDate = ''
}
},
submit () {
submit() {
if (!this.form.isRisk) {
return this.$u.toast('请选择是否消除风险')
}
@@ -214,11 +216,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.add {
.add {
padding-bottom: 120px;
& > div {
@@ -346,5 +348,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -7,7 +7,8 @@
<div class="label" v-if="addressArea">{{ addressArea }}</div>
<i v-else>请选择</i>
</AiArea> -->
<AiAreaPicker ref="area" class="aiArea" :name.sync="addressArea" :areaId="areaId" mode="custom" @select="onChange">
<AiAreaPicker ref="area" class="aiArea" :name.sync="addressArea" :areaId="areaId" mode="custom"
@select="onChange">
<span class="label" v-if="addressArea">{{ addressArea }}</span>
<i v-else>请选择</i>
</AiAreaPicker>
@@ -28,7 +29,7 @@
</div>
<div class="list-item__wrapper">
<div class="list-item" v-for="(item, index) in list" :key="index" @click="toDetail(item.id)">
<image src="/static/images/avatar.png" />
<image src="/static/images/avatar.png"/>
<div class="right">
<h2>{{ item.name || item.phone }}</h2>
<p>{{ item.addressArea }}</p>
@@ -44,15 +45,15 @@
</template>
<script>
import AiArea from '@/components/AiArea'
import AiFixedBtn from '@/components/AiFixedBtn'
import AiEmpty from '@/components/AiEmpty/AiEmpty'
import AiAreaPicker from '@/components/AiAreaPicker'
import AiArea from '@/components/AiArea'
import AiFixedBtn from '@/components/AiFixedBtn'
import AiEmpty from '@/components/AiEmpty/AiEmpty'
import AiAreaPicker from '@/components/AiAreaPicker'
export default {
export default {
name: 'list',
data () {
data() {
return {
currIndex: 0,
name: '',
@@ -72,7 +73,7 @@
AiFixedBtn
},
created () {
created() {
uni.showLoading()
this.areaId = this.$store.state.user.areaId
this.addressAreaId = this.$store.state.user.areaId
@@ -89,13 +90,13 @@
},
methods: {
toDetail (id) {
toDetail(id) {
uni.navigateTo({
url: '/pages/Monitor/Detail?id=' + id
})
},
onChange (e) {
onChange(e) {
this.addressAreaId = e.id
this.$nextTick(() => {
@@ -103,7 +104,7 @@
})
},
toAdd () {
toAdd() {
uni.navigateTo({
url: '/pages/Monitor/Add'
})
@@ -119,7 +120,7 @@
})
},
changeTab (index) {
changeTab(index) {
this.currIndex = index
this.reload()
},
@@ -160,11 +161,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.list {
.list {
padding: 112px 0 120px;
.addBtn {
@@ -234,8 +235,8 @@
span {
position: relative;
flex: 1;
height: 96rpx;
line-height: 96rpx;
height: 96 rpx;
line-height: 96 rpx;
color: #000000;
text-align: center;
font-size: 32px;
@@ -291,5 +292,5 @@
font-size: 30px;
}
}
}
}
</style>

View File

@@ -3,7 +3,8 @@
<div class="area">
<i>可选范围</i>
<span class="separat">/</span>
<AiAreaPicker ref="area" class="aiArea" :areaId="areaId" :name.sync="addressArea" mode="custom" @select="onChange">
<AiAreaPicker ref="area" class="aiArea" :areaId="areaId" :name.sync="addressArea" mode="custom"
@select="onChange">
<span class="label" v-if="addressArea">{{ addressArea }}</span>
<i v-else>请选择</i>
</AiAreaPicker>
@@ -54,14 +55,14 @@
</template>
<script>
import echarts from 'echarts'
import AiArea from '@/components/AiArea'
import AiAreaPicker from '@/components/AiAreaPicker'
import echarts from 'echarts'
import AiArea from '@/components/AiArea'
import AiAreaPicker from '@/components/AiAreaPicker'
export default {
export default {
name: 'statistics',
data () {
data() {
return {
addressAreaId: '',
addressArea: '',
@@ -80,14 +81,14 @@
AiAreaPicker
},
created () {
created() {
this.areaId = this.$store.state.user.areaId
this.addressAreaId = this.$store.state.user.areaId
this.addressArea = this.$store.state.user.areaName
},
mounted () {
window.scrollTo(0,0)
mounted() {
window.scrollTo(0, 0)
this.chart1 = echarts.init(document.getElementById('chart1'))
this.chart4 = echarts.init(document.getElementById('chart4'))
this.chart3 = echarts.init(document.getElementById('chart3'))
@@ -98,13 +99,13 @@
},
methods: {
reload () {
reload() {
this.$nextTick(() => {
this.getInfo()
})
},
onChange (e) {
onChange(e) {
this.addressAreaId = e.id
this.$nextTick(() => {
@@ -112,7 +113,7 @@
})
},
initChart1 (data) {
initChart1(data) {
const x = data.map(v => v.m)
const v = data.map(v => v.c)
const option = {
@@ -122,7 +123,7 @@
data: x,
splitLine: {
show: true,
lineStyle:{
lineStyle: {
width: 1,
type: 'solid',
color: '#f5f5f5'
@@ -163,7 +164,7 @@
},
splitLine: {
show: true,
lineStyle:{
lineStyle: {
width: 1,
type: 'solid',
color: '#f5f5f5'
@@ -175,7 +176,7 @@
},
axisLine: {
show: true,
lineStyle:{
lineStyle: {
width: 1,
type: 'solid',
color: '#aaa'
@@ -196,12 +197,11 @@
this.chart1.setOption(option)
},
initChart3 (data) {
initChart3(data) {
const y = data.map(v => this.$dict.getLabel('fpRiskType', v.risk_type) || '其他')
const v = data.map(v => v.c)
const option = {
tooltip: {
},
tooltip: {},
color: ['#2896FF', '#09DBFE', '#61FDB9', '#FFBB69', '#8429FF', '#ea7ccc'],
grid: {
top: '4%',
@@ -214,7 +214,7 @@
type: 'value',
splitLine: {
show: true,
lineStyle:{
lineStyle: {
width: 1,
type: 'solid',
color: '#f5f5f5'
@@ -234,7 +234,7 @@
boundaryGap: true,
axisLine: {
show: true,
lineStyle:{
lineStyle: {
width: 1,
type: 'solid',
color: '#aaa'
@@ -251,7 +251,7 @@
},
splitLine: {
show: true,
lineStyle:{
lineStyle: {
color: ['#e9e9e9'],
width: 1,
type: 'solid'
@@ -263,7 +263,7 @@
},
axisLine: {
show: true,
lineStyle:{
lineStyle: {
width: 1,
type: 'solid',
color: '#aaa'
@@ -285,7 +285,7 @@
this.chart3.setOption(option)
},
initChart4 (data) {
initChart4(data) {
const values = data.map(v => {
return {
value: v.c,
@@ -324,7 +324,7 @@
this.chart4.setOption(option)
},
getInfo () {
getInfo() {
this.$http.post(`/app/apppreventionreturntopoverty/statistics-prtp?areaId=${this.addressAreaId}`).then(res => {
if (res.code === 0) {
this.info = res.data
@@ -335,11 +335,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.statistics {
.statistics {
padding: 112px 0 120px;
.area {
@@ -406,11 +406,11 @@
height: 160px;
h2 {
font-size: 48px!important;
font-size: 48px !important;
}
p {
margin-top: 8px!important;
margin-top: 8px !important;
}
}
@@ -435,5 +435,5 @@
}
}
}
}
}
</style>

View File

@@ -10,7 +10,8 @@
</span>
</div>
<div class="list">
<div class="item" v-for="(item, index) in list" :key="index" @click="linkTo('/pages/PovertyAlleviation/NewsDetail?id=' + item.id)">
<div class="item" v-for="(item, index) in list" :key="index"
@click="linkTo('/pages/PovertyAlleviation/NewsDetail?id=' + item.id)">
<div class="left">
<h2>{{ item.title }}</h2>
<div class="item-bottom">
@@ -18,7 +19,7 @@
<span>{{ item.createTime }}</span>
</div>
</div>
<image v-if="item.coverFile" :src="item.coverFile ? item.coverFile.url : ''" />
<image v-if="item.coverFile" :src="item.coverFile ? item.coverFile.url : ''"/>
</div>
<ai-empty v-if="!list.length && isMore" style="padding-bottom: 20px;"></ai-empty>
</div>
@@ -26,9 +27,10 @@
</template>
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
data () {
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
data() {
return {
currIndex: 0,
list: [],
@@ -54,7 +56,7 @@
},
methods: {
changeTab (index, type) {
changeTab(index, type) {
this.type = type
this.currIndex = index
@@ -67,7 +69,7 @@
})
},
linkTo (url) {
linkTo(url) {
uni.navigateTo({
url
})
@@ -112,11 +114,11 @@
onReachBottom() {
this.getList()
}
}
}
</script>
<style lang="scss">
.news {
.news {
padding: 96px 0 40px;
.list {
@@ -198,8 +200,8 @@
span {
position: relative;
flex: 1;
height: 96rpx;
line-height: 96rpx;
height: 96 rpx;
line-height: 96 rpx;
color: #999999;
text-align: center;
font-size: 28px;
@@ -224,5 +226,5 @@
}
}
}
}
}
</style>

View File

@@ -10,8 +10,8 @@
</template>
<script>
export default {
data () {
export default {
data() {
return {
pageShow: false,
info: {},
@@ -22,13 +22,13 @@
}
},
onLoad (query) {
onLoad(query) {
uni.showLoading()
this.getInfo(query.id)
},
methods: {
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/appnewscenterinfo/queryDetailById?id=${id}`).then(res => {
if (res.code == 0) {
this.info = res.data
@@ -41,11 +41,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.detail {
.detail {
min-height: 100vh;
padding: 40px 32px 40px;
box-sizing: border-box;
@@ -94,5 +94,5 @@
height: 600px;
}
}
}
}
</style>

View File

@@ -2,22 +2,23 @@
<div class="info">
<div class="info-top">
<div class="info-top__item" @click="linkTo('/pages/Monitor/Monitor')">
<image src="/static/images/wdbf.png" />
<image src="/static/images/wdbf.png"/>
<h2>监测对象</h2>
</div>
<div class="info-top__item" @click="linkTo('/pages/povertyMonitor/povertyMonitor')">
<image src="/static/images/yjjk.png" />
<image src="/static/images/yjjk.png"/>
<h2>预警监控</h2>
</div>
<div class="info-top__item" @click="linkTo('/pages/PovertyAlleviation/News')">
<image src="/static/images/news.png" />
<image src="/static/images/news.png"/>
<h2>政策动态</h2>
</div>
</div>
<div class="news">
<h2>最新动态</h2>
<div class="news-list">
<div class="news-item" v-for="(item, index) in list" :key="index" @click="linkTo(`/pages/PovertyAlleviation/NewsDetail?id=${item.id}`)">
<div class="news-item" v-for="(item, index) in list" :key="index"
@click="linkTo(`/pages/PovertyAlleviation/NewsDetail?id=${item.id}`)">
<div class="left">
<h2>{{ item.title }}</h2>
<div class="item-bottom">
@@ -25,7 +26,7 @@
<span>{{ item.createTime }}</span>
</div>
</div>
<image v-if="item.coverFile" :src="item.coverFile ? item.coverFile.url : ''" />
<image v-if="item.coverFile" :src="item.coverFile ? item.coverFile.url : ''"/>
</div>
</div>
</div>
@@ -33,27 +34,27 @@
</template>
<script>
export default {
data () {
export default {
data() {
return {
list: []
}
},
onLoad () {
onLoad() {
this.$dict.load(['newsCenterPolicyType']).then(() => {
this.getList()
})
},
methods: {
linkTo (url) {
linkTo(url) {
uni.navigateTo({
url
})
},
getList () {
getList() {
this.$http.post(`/app/appnewscenterinfo/listForWx`, null, {
params: {
current: 1,
@@ -67,11 +68,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.info {
.info {
padding: 32px 30px;
.info-top {
@@ -165,5 +166,5 @@
}
}
}
}
}
</style>

View File

@@ -4,48 +4,54 @@
<div class="item">
<div class="label">播发内容</div>
<div class="value" @click="linkTo('/pages/resourcesManage/resourcesManage?isChoose=1')">
<span :class="formData.mediaName == '请选择' ? 'color-999' : ''">{{formData.mediaName}}</span>
<span :class="formData.mediaName == '请选择' ? 'color-999' : ''">{{ formData.mediaName }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
<div class="item">
<div class="label">播放设备</div>
<div class="value" @click="selectClick('showEquipment', equipmentList)">
<span :class="formData.serialName == '请选择' ? 'color-999' : ''">{{formData.serialName}}</span>
<span :class="formData.serialName == '请选择' ? 'color-999' : ''">{{ formData.serialName }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
<div class="item">
<div class="label">播发级别</div>
<div class="value" @click="selectClick('showMessageLevel', messageLevelList)">
<span :class="formData.messageLevelName == '请选择' ? 'color-999' : ''">{{formData.messageLevelName}}</span>
<span :class="formData.messageLevelName == '请选择' ? 'color-999' : ''">{{ formData.messageLevelName }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
</div>
<div class="radio-content">
<div class="title">播放方式</div>
<div class="item mar-r50" :class="formData.taskType == 0 ? 'active' : ''" @click="formData.taskType = 0">立即播放<img src="./img/bigHorn-xz.png" alt=""></div>
<div class="item" :class="formData.taskType == 1 ? 'active' : ''" @click="formData.taskType = 1"><img src="./img/bigHorn-xz.png" alt="">定时播放</div>
<div class="item mar-r50" :class="formData.taskType == 0 ? 'active' : ''" @click="formData.taskType = 0">立即播放<img
src="./img/bigHorn-xz.png" alt=""></div>
<div class="item" :class="formData.taskType == 1 ? 'active' : ''" @click="formData.taskType = 1"><img
src="./img/bigHorn-xz.png" alt="">定时播放
</div>
</div>
<div class="content" v-if="formData.taskType != 0">
<div class="item">
<div class="label">定时策略</div>
<div class="value" @click="selectClick('showCyclingType', cyclingTypeList)">
<span :class="formData.cyclingTypeName == '请选择' ? 'color-999' : ''">{{formData.cyclingTypeName}}</span>
<span :class="formData.cyclingTypeName == '请选择' ? 'color-999' : ''">{{ formData.cyclingTypeName }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
</div>
<div class="radio-content" v-if="formData.taskType != 0 && formData.cyclingType == 2">
<div class="title">播放天数</div>
<div class="mini-item" :class="item.isCheck ? 'mini-active' : ''" v-for="(item, index) in dayList" :key="index" @click="checkClick(index)">{{item.label}}</div>
<div class="mini-item" :class="item.isCheck ? 'mini-active' : ''" v-for="(item, index) in dayList" :key="index"
@click="checkClick(index)">{{ item.label }}
</div>
</div>
<div class="content" v-if="formData.taskType != 0 && formData.cyclingType == 3">
<div class="item">
<div class="label">播放天数</div>
<div class="value">
<u-input type="text" placeholder="请输入" height="18" input-align="right" v-model="formData.broadcastDay" maxlength="4" />
<u-input type="text" placeholder="请输入" height="18" input-align="right" v-model="formData.broadcastDay"
maxlength="4"/>
</div>
</div>
</div>
@@ -53,33 +59,35 @@
<div class="item">
<div class="label">开始日期</div>
<div class="value" @click="timeClick(true, 'showDate')">
<span :class="formData.startDate ? 'color-999' : ''">{{formData.startDate || '请选择'}}</span>
<span :class="formData.startDate ? 'color-999' : ''">{{ formData.startDate || '请选择' }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
<div class="item">
<div class="label">开始时间</div>
<div class="value" @click="timeClick(false, 'showSatrt')">
<span :class="formData.startTime ? 'color-999' : ''">{{formData.startTime || '请选择'}}</span>
<span :class="formData.startTime ? 'color-999' : ''">{{ formData.startTime || '请选择' }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
<div class="item">
<div class="label">结束时间</div>
<div class="value" @click="timeClick(false, 'showEnd')">
<span :class="formData.endTime ? 'color-999' : ''">{{formData.endTime || '请选择'}}</span>
<span :class="formData.endTime ? 'color-999' : ''">{{ formData.endTime || '请选择' }}</span>
<img src="./img/right-icon.png" alt="">
</div>
</div>
</div>
<div class="btn" @click="addConfirm">确认</div>
<u-select v-model="showSelect" :list="selectList" @confirm="confirm" label-name="dictName" value-name="dictValue"></u-select>
<u-select v-model="showSelect" :list="selectList" @confirm="confirm" label-name="dictName"
value-name="dictValue"></u-select>
<u-picker v-model="showDateTime" mode="time" :params="params" @confirm="confirm"></u-picker>
<AiBack></AiBack>
</div>
</template>
<script>
import AiBack from "@/components/AiBack";
import AiBack from "@/components/AiBack";
export default {
name: "addPlay",
data() {
@@ -166,7 +174,7 @@ export default {
AiBack
},
onLoad () {
onLoad() {
uni.$on('choose', e => {
console.log(e)
this.formData.mediaId = e.mediaId
@@ -178,41 +186,41 @@ export default {
addConfirm() {
var cyclingDateList = []
this.dayList.map((item) => {
if(item.isCheck) {
if (item.isCheck) {
cyclingDateList.push(item.value)
}
})
if(!this.formData.mediaId) {
if (!this.formData.mediaId) {
return this.$u.toast('请选择播发内容')
}
if(!this.formData.serialNo) {
if (!this.formData.serialNo) {
return this.$u.toast('请选择播放设备')
}
if(!this.formData.messageLevel) {
if (!this.formData.messageLevel) {
return this.$u.toast('播发级别')
}
//播放方式(定时播放)
if(this.formData.taskType != 0 && this.formData.startDate == '请选择') {
if (this.formData.taskType != 0 && this.formData.startDate == '请选择') {
return this.$u.toast('请选择开始日期')
}
if(this.formData.taskType != 0 && this.formData.startTime == '请选择') {
if (this.formData.taskType != 0 && this.formData.startTime == '请选择') {
return this.$u.toast('请选择开始时间')
}
if(this.formData.taskType != 0 && this.formData.endTime == '请选择') {
if (this.formData.taskType != 0 && this.formData.endTime == '请选择') {
return this.$u.toast('请选择结束时间')
}
//播放方式(定时播放)定时策略(时长)
if(this.formData.taskType != 0 && this.formData.cyclingType == 3 && !this.formData.broadcastDay) {
if (this.formData.taskType != 0 && this.formData.cyclingType == 3 && !this.formData.broadcastDay) {
return this.$u.toast('请输入播放天数')
}
//播放方式(定时播放)定时策略(自定义)
if(this.formData.taskType != 0 && this.formData.cyclingType == 2 && !cyclingDateList.length) {
if (this.formData.taskType != 0 && this.formData.cyclingType == 2 && !cyclingDateList.length) {
return this.$u.toast('请选择播放天数')
}
if(this.formData.taskType != 0 && this.formData.cyclingType == 2) {
if (this.formData.taskType != 0 && this.formData.cyclingType == 2) {
this.formData.cyclingDate = cyclingDateList.join(',')
}
this.formData.coverageType = '4'
@@ -226,43 +234,43 @@ export default {
})
},
linkTo (path) {
linkTo(path) {
uni.navigateTo({
url: path
})
},
confirm(e) {
if(this.showMedia) {
if (this.showMedia) {
this.formData.mediaId = e[0].value
this.formData.mediaName = e[0].label
}
if(this.showEquipment) {
if (this.showEquipment) {
this.formData.serialNo = e[0].value
this.formData.serialName = e[0].label
}
if(this.showMessageLevel) {
if (this.showMessageLevel) {
this.formData.messageLevel = e[0].value
this.formData.messageLevelName = e[0].label
}
if(this.showCyclingType) {
if (this.showCyclingType) {
this.formData.cyclingType = e[0].value
this.formData.cyclingTypeName = e[0].label
}
if(this.showDate) {
if (this.showDate) {
this.formData.startDate = e.year + '-' + e.month + '-' + e.day
}
if(this.showSatrt) {
if (this.showSatrt) {
var startTime = e.hour + ':' + e.minute + ':' + e.second
var myDate = new Date();
var time = myDate.getHours() + ':' + myDate.getMinutes() + ':' + myDate.getSeconds()
if (this.timeToSec(startTime) - this.timeToSec(time) > 0) {
this.formData.startTime = startTime
}else {
} else {
this.$u.toast('开始时间要大于当前时间')
}
}
if(this.showEnd) {
if (this.showEnd) {
var endTime = e.hour + ':' + e.minute + ':' + e.second
console.log(this.timeToSec(endTime), this.timeToSec(this.formData.startTime))
if (this.timeToSec(endTime) - this.timeToSec(this.formData.startTime) > 0) {
@@ -291,7 +299,7 @@ export default {
this.$http.post(`/app/appdlbresource/list?current=1&size=10000`).then((res) => {
if (res.code == 0) {
this.mediaList = []
if(res.data && res.data.records.length) {
if (res.data && res.data.records.length) {
res.data.records.map((item) => {
let info = {
dictName: item.name,
@@ -307,7 +315,7 @@ export default {
this.$http.post(`/app/appdlbquipment/getDlbDeviceList?current=1&size=10000&devStatus=5&keyword=`).then((res) => {
if (res.code == 0) {
this.equipmentList = []
if(res.data && res.data.records.length) {
if (res.data && res.data.records.length) {
res.data.records.map((item) => {
let info = {
dictName: item.deviceName,
@@ -325,7 +333,7 @@ export default {
timeClick(showYear, showType) {
this[showType] = true
this.showDateTime = true
if(showYear) {
if (showYear) {
this.params = {
year: true,
month: true,
@@ -334,7 +342,7 @@ export default {
minute: false,
second: false
}
}else {
} else {
this.params = {
year: false,
month: false,
@@ -367,10 +375,12 @@ export default {
<style lang="scss" scoped>
.addPlay {
padding-bottom: 128px;
.content{
.content {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
padding: 34px 0;
font-size: 32px;
@@ -381,11 +391,13 @@ export default {
display: flex;
color: #333;
justify-content: space-between;
.label{
.label {
width: 198px;
font-size: 32px;
}
.value{
.value {
display: flex;
align-items: center;
justify-content: flex-end;
@@ -401,35 +413,41 @@ export default {
text-overflow: ellipsis;
white-space: nowrap;
}
img{
img {
width: 32px;
height: 32px;
vertical-align: middle;
margin-left: 6px;
}
}
.color-999{
.color-999 {
color: #999;
}
}
}
.radio-content{
.radio-content {
padding: 34px 32px 38px;
border-bottom: 1px solid #ddd;
background-color: #fff;
.title{
.title {
font-size: 32px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333;
line-height: 44px;
margin-bottom: 54px;
span{
span {
font-size: 24px;
font-weight: 400;
}
}
.item{
.item {
display: inline-block;
width: 320px;
height: 112px;
@@ -441,15 +459,18 @@ export default {
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333;
img{
img {
display: none;
}
}
.active{
.active {
background: #E7F1FE;
color: #1174FE;
position: relative;
img{
img {
display: inline-block;
position: absolute;
bottom: 0;
@@ -458,10 +479,12 @@ export default {
height: 46px;
}
}
.mar-r50 {
margin-right: 50px;
}
.mini-item{
.mini-item {
display: inline-block;
width: 128px;
height: 72px;
@@ -474,16 +497,19 @@ export default {
margin-right: 58px;
margin-bottom: 32px;
}
.mini-item:nth-of-type(5) {
margin-right: 0;
}
.mini-active{
.mini-active {
background: #F2F8FE;
border: 1px solid #89B2EE;
box-sizing: border-box;
}
}
.btn{
.btn {
position: fixed;
bottom: 0;
left: 0;

View File

@@ -19,9 +19,10 @@
</div>
</div>
<div class="banner">
<div class="item" :class="item.bgClass" v-for="(item, index) in bannerList" :key="index" @click="linkTo(item.path)">
<h2>{{item.title}}</h2>
<div>{{item.text}}</div>
<div class="item" :class="item.bgClass" v-for="(item, index) in bannerList" :key="index"
@click="linkTo(item.path)">
<h2>{{ item.title }}</h2>
<div>{{ item.text }}</div>
<img :src="item.imgUrl" alt="">
</div>
</div>
@@ -75,13 +76,15 @@ export default {
</script>
<style lang="scss" scoped>
.bigHorn {
.header{
.header {
position: relative;
img{
img {
width: 100%;
height: 306px;
}
.content{
.content {
width: 686px;
padding: 40px 0;
background: #FFFFFF;
@@ -92,15 +95,18 @@ export default {
left: 50%;
transform: translateX(-50%);
display: flex;
.item{
.item {
text-align: center;
flex: 1;
img{
img {
width: 64px;
height: 64px;
margin-bottom: 18px;
}
div{
div {
font-size: 30px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -108,7 +114,8 @@ export default {
line-height: 42px;
margin-bottom: 10px;
}
h2{
h2 {
font-size: 40px;
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
@@ -118,9 +125,11 @@ export default {
}
}
}
.banner{
.banner {
margin-top: 150px;
.item{
.item {
width: 686px;
height: 190px;
border-radius: 12px;
@@ -129,37 +138,44 @@ export default {
box-sizing: border-box;
color: #FFF;
position: relative;
h2{
h2 {
font-size: 42px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
line-height: 60px;
margin-bottom: 16px;
}
div{
div {
font-size: 26px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #FFF;
line-height: 32px;
}
img{
img {
width: 160px;
position: absolute;
top: 10px;
right: 30px;
}
}
.bg-67A3F4{
.bg-67A3F4 {
background: #67A3F4;
}
.bg-4ED5BB{
.bg-4ED5BB {
background: #4ED5BB;
}
.bg-E5B565{
.bg-E5B565 {
background: #E5B565;
}
.bg-F19661{
.bg-F19661 {
background: #F19661;
}
}

View File

@@ -4,8 +4,8 @@
<div class="item" v-for="(item, index) in list" :key="index">
<img src="./img/bigHorn-lb@2x.png" alt="">
<div class="info">
<p>{{item.deviceName}}</p>
<span>{{item.areaName}}</span>
<p>{{ item.deviceName }}</p>
<span>{{ item.areaName }}</span>
</div>
</div>
</div>
@@ -16,6 +16,7 @@
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
import AiBack from "@/components/AiBack";
export default {
name: "onlineList",
data() {
@@ -56,22 +57,26 @@ export default {
</script>
<style lang="scss" scoped>
.onlineList {
.record{
.record {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
border-bottom: 1px solid #ddd;
display: flex;
padding: 12px 40px 16px 0;
img{
img {
width: 48px;
height: 48px;
margin: 12px 16px 0 0;
}
.info{
.info {
width: calc(100% - 100px);
p{
p {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -79,7 +84,8 @@ export default {
line-height: 48px;
margin-bottom: 12px;
}
span{
span {
font-size: 22px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;

View File

@@ -4,9 +4,9 @@
<div class="item" v-for="(item, index) in list" :key="index">
<img src="./img/bigHorn-lb@2x.png" alt="">
<div class="info">
<p>{{item.deviceName}}</p>
<span>{{item.createTime}}</span><br />
<span>{{item.name}}</span>
<p>{{ item.deviceName }}</p>
<span>{{ item.createTime }}</span><br/>
<span>{{ item.name }}</span>
</div>
</div>
</div>
@@ -17,6 +17,7 @@
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
import AiBack from "@/components/AiBack";
export default {
name: "onlinePlayList",
data() {
@@ -58,22 +59,26 @@ export default {
</script>
<style lang="scss" scoped>
.onlinePlayList {
.record{
.record {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
border-bottom: 1px solid #ddd;
display: flex;
padding: 12px 40px 16px 0;
img{
img {
width: 48px;
height: 48px;
margin: 12px 16px 0 0;
}
.info{
.info {
width: calc(100% - 100px);
p{
p {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -81,7 +86,8 @@ export default {
line-height: 48px;
margin-bottom: 12px;
}
span{
span {
font-size: 22px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;

View File

@@ -7,11 +7,14 @@
<div class="record">
<div class="item" v-for="(item, index) in list" :key="index">
<div class="info">
<p>{{item.messageName}}</p>
<span>{{item.createTime}}</span><br />
<span>{{item.deviceName}}</span>
<p>{{ item.messageName }}</p>
<span>{{ item.createTime }}</span><br/>
<span>{{ item.deviceName }}</span>
</div>
<div class="btn bg-3975C6"
v-if="item.broadcastStatus == 0 || item.broadcastStatus == 1 || item.broadcastStatus == 2"
@click="cancel(item.broadcastId)">撤销
</div>
<div class="btn bg-3975C6" v-if="item.broadcastStatus == 0 || item.broadcastStatus == 1 || item.broadcastStatus == 2" @click="cancel(item.broadcastId)">撤销</div>
<div class="btn bg-AFD0FC" v-if="item.broadcastStatus == 6">已取消</div>
</div>
</div>
@@ -19,7 +22,8 @@
</div>
</template>
<script>
import AiBack from "@/components/AiBack";
import AiBack from "@/components/AiBack";
export default {
name: "playList",
data() {
@@ -71,7 +75,7 @@ export default {
</script>
<style lang="scss" scoped>
.playList {
.title{
.title {
width: 100%;
height: 88px;
line-height: 88px;
@@ -84,21 +88,25 @@ export default {
box-sizing: border-box;
border-bottom: 1px solid #ddd;
}
.record{
.record {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
border-bottom: 1px solid #ddd;
display: flex;
justify-content: space-between;
padding: 12px 40px 16px 0;
box-sizing: border-box;
.info{
.info {
width: 480px;
margin-right: 40px;
word-break: break-all;
p{
p {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -106,7 +114,8 @@ export default {
line-height: 48px;
margin-bottom: 12px;
}
span{
span {
font-size: 22px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -114,7 +123,8 @@ export default {
line-height: 32px;
}
}
.btn{
.btn {
width: 154px;
height: 60px;
border-radius: 8px;
@@ -126,10 +136,12 @@ export default {
color: #FFF;
margin-top: 18px;
}
.bg-3975C6{
.bg-3975C6 {
background: #3975C6;
}
.bg-AFD0FC{
.bg-AFD0FC {
background: #AFD0FC;
}
}

View File

@@ -3,7 +3,7 @@
<div class="search">
<div class="search-bg">
<img src="./img/search-icon.png" alt="">
<u-input v-model="value" type="text" placeholder="搜索设备名称" class="search-input" height="18" />
<u-input v-model="value" type="text" placeholder="搜索设备名称" class="search-input" height="18"/>
</div>
</div>
<div class="record">
@@ -43,9 +43,7 @@ export default {
value: ''
}
},
methods: {
},
methods: {},
mounted() {
}
@@ -54,14 +52,16 @@ export default {
<style lang="scss" scoped>
.selectEquipment {
padding-bottom: 128px;
.search{
.search {
width: 100%;
height: 104px;
background: #FFF;
margin-bottom: 4px;
padding: 20px 32px;
box-sizing: border-box;
.search-bg{
.search-bg {
width: 686px;
height: 64px;
padding: 14px 0;
@@ -69,14 +69,16 @@ export default {
background: #F5F5F5;
border-radius: 32px;
position: relative;
img{
img {
width: 32px;
height: 32px;
position: absolute;
top: 16px;
left: 32px;
}
.search-input{
.search-input {
width: 590px;
height: 36px;
line-height: 36px;
@@ -85,38 +87,45 @@ export default {
}
}
}
.record{
.record {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
display: flex;
border-bottom: 1px solid #ddd;
.check-img{
.check-img {
width: 32px;
height: 32px;
margin: 32px 32px 0 0;
}
.voice-img{
.voice-img {
width: 48px;
height: 48px;
margin: 28px 16px 0 0;
}
.info{
.info {
width: calc(100% - 148px);
padding: 18px 0;
line-height: 44px;
font-size: 34px;
display: flex;
justify-content: space-between;
.text{
p{
.text {
p {
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
color: #333;
margin-bottom: 8px;
}
span{
span {
font-size: 26px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -124,7 +133,8 @@ export default {
line-height: 36px;
}
}
.status{
.status {
font-size: 34px;
font-family: PingFang-SC-Medium, PingFang-SC;
font-weight: 500;
@@ -134,7 +144,8 @@ export default {
}
}
}
.btn{
.btn {
position: fixed;
bottom: 0;
left: 0;
@@ -144,7 +155,8 @@ export default {
border-top: 1px solid #ddd;
padding: 24px 32px 24px 0;
box-sizing: border-box;
div{
div {
width: 192px;
height: 80px;
line-height: 80px;

View File

@@ -17,13 +17,9 @@
export default {
name: "selectMp3",
data() {
return {
}
},
methods: {
return {}
},
methods: {},
mounted() {
}
@@ -32,18 +28,22 @@ export default {
<style lang="scss" scoped>
.selectMp3 {
padding-bottom: 128px;
.record{
.record {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
display: flex;
img{
img {
width: 32px;
height: 32px;
margin: 40px 16px 0 0;
}
.info{
.info {
width: calc(100% - 60px);
padding-bottom: 16px;
padding: 34px 0;
@@ -57,7 +57,8 @@ export default {
}
}
}
.btn{
.btn {
position: fixed;
bottom: 0;
left: 0;
@@ -67,7 +68,8 @@ export default {
border-top: 1px solid #ddd;
padding: 24px 32px 24px 0;
box-sizing: border-box;
div{
div {
width: 192px;
height: 80px;
line-height: 80px;

View File

@@ -1,12 +1,13 @@
<template>
<div class="closemsg">
<img :src="imgSrc" alt="" />
<img :src="imgSrc" alt=""/>
<text>{{ text }}</text>
<u-button
type="primary"
:custom-style="{ width: '100%', borderRadius: '4px', marginTop: '48px' }"
@click="goBack"
>{{ btnText }}</u-button
>{{ btnText }}
</u-button
>
<back></back>
</div>
@@ -17,7 +18,7 @@ import back from '../../components/AiBack'
export default {
name: 'CloseMsg',
components: { back },
components: {back},
data() {
return {
flag: true
@@ -44,7 +45,7 @@ export default {
return this.flag ? '确定' : '查看详情'
},
imgSrc() {
return this.$cdn+'other/'+(this.flag?'kztcg.png':'kztsb.png')
return this.$cdn + 'other/' + (this.flag ? 'kztcg.png' : 'kztsb.png')
}
}
}

View File

@@ -5,7 +5,7 @@
<textarea placeholder="请输入批示意见" v-model.trim="description" maxlength="200"></textarea>
<u-row justify="between">
<span @click="description=''">清空内容</span>
<span>{{description.length || 0}}/200</span>
<span>{{ description.length || 0 }}/200</span>
</u-row>
</div>
<ai-back/>
@@ -14,9 +14,9 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiBack from "../../../components/AiBack";
export default {
export default {
name: "approval",
components: {AiBack},
data() {
@@ -43,11 +43,11 @@
})
}
}
}
}
</script>
<style lang="scss" scoped>
.approval {
.approval {
background: #F5F5F5;
.card {
@@ -87,5 +87,5 @@
bottom: 0;
background: #197DF0 !important;
}
}
}
</style>

View File

@@ -2,43 +2,44 @@
<div class="detail">
<template v-if="!userSelect">
<div class="card">
<header>{{detail.documentName}}</header>
<header>{{ detail.documentName }}</header>
<u-gap height="16"></u-gap>
<u-row>
<span>公文编号</span>
<span>{{detail.documentCode}}</span>
<span>{{ detail.documentCode }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>公文类型</span>
<span>{{$dict.getLabel("officialDocumentName",detail.documentType)}}</span>
<span>{{ $dict.getLabel("officialDocumentName", detail.documentType) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>紧急程度</span>
<span :style="{color:$dict.getColor('documentEmergencyLevel',detail.emergencyLevel)}">{{$dict.getLabel("documentEmergencyLevel",detail.emergencyLevel)}}</span>
<span
:style="{color:$dict.getColor('documentEmergencyLevel',detail.emergencyLevel)}">{{ $dict.getLabel("documentEmergencyLevel", detail.emergencyLevel) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发文机关</span>
<span>{{detail.issuingUnit}}</span>
<span>{{ detail.issuingUnit }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发文字号</span>
<span>{{detail.issuingFont}}</span>
<span>{{ detail.issuingFont }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>签发人</span>
<span>{{detail.signer}}</span>
<span>{{ detail.signer }}</span>
</u-row>
<u-gap height="16"></u-gap>
<img v-if="detail.confidentialityLevel" :src="$cdn + tag(detail.confidentialityLevel)" alt="">
</div>
<div class="card" style="margin-bottom: 0;padding-top: 0">
<div class="label">备注</div>
<span>{{detail.remark}}</span>
<span>{{ detail.remark }}</span>
</div>
<div class="card" style="padding-top: 0" v-if="detail.files && detail.files.length">
<div class="label">相关附件</div>
@@ -46,30 +47,32 @@
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{item.fileName}}.{{item.postfix}}</span>
<span>{{ item.fileName }}.{{ item.postfix }}</span>
</label>
<span>{{(item.size/1024).toFixed(2)}}KB</span>
<span>{{ (item.size / 1024).toFixed(2) }}KB</span>
</u-row>
</div>
</div>
<div class="card">
<div class="label" style="96px;">{{detail.readType ==0 ? "流转信息" : "传阅情况"}}
<em>({{$dict.getLabel("documentStatus",detail.status)}})</em></div>
<div class="label" style="96px;">{{ detail.readType == 0 ? "流转信息" : "传阅情况" }}
<em>({{ $dict.getLabel("documentStatus", detail.status) }})</em></div>
<div class="progress">
<div class="item" v-for="(item,index) in detail.flowUsers" :key="index">
<div class="avatar">{{item.flowUserName && item.flowUserName.substr(-2)}}</div>
<div class="avatar">{{ item.flowUserName && item.flowUserName.substr(-2) }}</div>
<div class="right">
<u-row justify="between">
<text class="status" :style="{color:item.readStatus==1?'#FF8822':'#1365DD'}">{{$dict.getLabel(detail.readType ==1 ? "readingStatus" :
"documentFlowStatus",detail.readType ==0 ? item.flowStatus : item.readStatus)}}
<text class="status" :style="{color:item.readStatus==1?'#FF8822':'#1365DD'}">{{
$dict.getLabel(detail.readType == 1 ? "readingStatus" :
"documentFlowStatus", detail.readType == 0 ? item.flowStatus : item.readStatus)
}}
</text>
<text class="date">{{item.flowTime}}</text>
<text class="date">{{ item.flowTime }}</text>
</u-row>
<u-row justify="between">
<text class="name">{{item.flowUserName}}</text>
<text class="name">{{ item.flowUserName }}</text>
</u-row>
<u-row justify="between">
<text class="note">{{item.description}}</text>
<text class="note">{{ item.description }}</text>
</u-row>
</div>
</div>
@@ -81,7 +84,9 @@
<div @click="handleClick(1)">流转</div>
</div>
<div class="footer" v-if="detail.readType==1 && detail.flowRight==1" @click="read" style="background-color: #1365DD;color: #FFFFFF">我已阅完</div>
<div class="footer" v-if="detail.readType==1 && detail.flowRight==1" @click="read"
style="background-color: #1365DD;color: #FFFFFF">我已阅完
</div>
</template>
@@ -93,11 +98,11 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import {mapActions} from "vuex";
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import {mapActions} from "vuex";
export default {
export default {
name: "detail",
components: {AiBack, AiSelectEnterprise},
data() {
@@ -128,12 +133,12 @@
})
},
preFile(e) {
if([".jpg",".png",".gif"].includes(e.postfix.toLowerCase())){
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
}else {
} else {
this.previewFile({...e})
}
},
@@ -186,11 +191,11 @@
onShow() {
this.getDetail()
}
}
}
</script>
<style lang="scss" scoped>
.detail {
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
@@ -299,9 +304,9 @@
line-height: 44px;
overflow: hidden;
text-overflow: ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:2;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
@@ -428,5 +433,5 @@
background-color: #1365DD;
}
}
}
}
</style>

View File

@@ -2,29 +2,30 @@
<div class="document-flow">
<ai-top-fixed>
<header class="pad">
<u-search placeholder="请输入公文名称" v-model="documentName" @clear="documentName='',getList()" @search="getList" clearabled :show-action="false" height="64"></u-search>
<u-search placeholder="请输入公文名称" v-model="documentName" @clear="documentName='',getList()" @search="getList"
clearabled :show-action="false" height="64"></u-search>
</header>
</ai-top-fixed>
<div class="list pad" v-if="list.length">
<div class="card" v-for="(item,index) in list" :key="index" @click="handleClick(item)">
<u-row>
<em v-if="item.redStatus==0"></em>
<span>{{item.documentName}}</span>
<span>{{ item.documentName }}</span>
</u-row>
<u-gap height="16"></u-gap>
<u-row>
<label>公文类型</label>
<text style="color: #1365DD;">{{$dict.getLabel("officialDocumentName",item.documentType)}}</text>
<text style="color: #1365DD;">{{ $dict.getLabel("officialDocumentName", item.documentType) }}</text>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<label>登记人</label>
<text>{{item.createUserName}}</text>
<text>{{ item.createUserName }}</text>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<label>登记日期</label>
<text>{{item.createTime}}</text>
<text>{{ item.createTime }}</text>
</u-row>
<img :src=" $cdn + tag(item.readType)" alt="">
</div>
@@ -35,12 +36,12 @@
</template>
<script>
import AiTopFixed from "../../components/AiTopFixed";
import AiEmpty from "../../components/AiEmpty";
import AiTopFixed from "../../components/AiTopFixed";
import AiEmpty from "../../components/AiEmpty";
export default {
export default {
name: "documentFlow",
components: {AiTopFixed,AiEmpty},
components: {AiTopFixed, AiEmpty},
data() {
return {
documentName: "",
@@ -49,11 +50,11 @@
status: "加载更多"
}
},
onLoad(){
onLoad() {
this.$dict.load("officialDocumentName")
},
methods: {
tag(status){
tag(status) {
return {
"0": 'common/1ps.png',
"1": 'common/2cy.png'
@@ -61,7 +62,7 @@
},
getList() {
this.$http.post("/app/appofficialdocumentinfo/appList", null, {
params:{
params: {
documentName: this.documentName,
size: 10,
current: this.current
@@ -81,18 +82,18 @@
})
}
},
onShow(){
onShow() {
this.getList()
},
onReachBottom() {
this.current = this.current + 1;
this.getList()
},
}
}
</script>
<style lang="scss" scoped>
.document-flow {
.document-flow {
min-height: 100%;
background: #F5F5F5;
@@ -118,7 +119,7 @@
position: relative;
margin-bottom: 32px;
.u-row{
.u-row {
flex-wrap: nowrap !important;
}
@@ -162,5 +163,5 @@
box-sizing: border-box;
padding: 32px 32px 0 32px;
}
}
}
</style>

View File

@@ -55,9 +55,11 @@ export default {
::v-deep .u-drawer {
text-align: center;
.uni-scroll-view-content{
.uni-scroll-view-content {
max-height: 672px;
}
.option {
font-size: 32px;
cursor: pointer;

View File

@@ -13,12 +13,13 @@
<script>
import AiBack from "../../components/AiBack";
export default {
name: "historyList",
components: {AiBack},
computed: {
itemLabel() {
return '历史'+this.$dict.getLabel('intelligentGuardianshipItem', this.$route.query.type)+`(${this.$dict.getLabel('intelligentGuardianshipItemUnit',this.$route.query.type)})`
return '历史' + this.$dict.getLabel('intelligentGuardianshipItem', this.$route.query.type) + `(${this.$dict.getLabel('intelligentGuardianshipItemUnit', this.$route.query.type)})`
}
},
data() {
@@ -39,7 +40,7 @@ export default {
}
},
created() {
this.$dict.load("intelligentGuardianshipItem",'intelligentGuardianshipItemUnit')
this.$dict.load("intelligentGuardianshipItem", 'intelligentGuardianshipItemUnit')
this.getHistory()
}
}

View File

@@ -75,7 +75,7 @@ export default {
}
},
created() {
this.$dict.load("intelligentGuardianshipItem",'intelligentGuardianshipItem2', 'sex')
this.$dict.load("intelligentGuardianshipItem", 'intelligentGuardianshipItem2', 'sex')
},
mounted() {
this.getDetail(this.$route.query.id).then(() => this.initMap())

View File

@@ -9,13 +9,13 @@
<header><em>*</em>起止时间</header>
<u-row justify="between">
<div class="time" @click="pick(0)">
<span>{{form.startTime.time}}</span>
<span>{{form.startTime.year}}{{form.startTime.month}}{{form.startTime.day}} {{form.startTime.weekday}}</span>
<span>{{ form.startTime.time }}</span>
<span>{{ form.startTime.year }}{{ form.startTime.month }}{{ form.startTime.day }} {{ form.startTime.weekday }}</span>
</div>
<div class="arrow"></div>
<div class="time" @click="pick(1)">
<span>{{form.endTime.time}}</span>
<span>{{form.endTime.year}}{{form.endTime.month}}{{form.endTime.day}} {{form.endTime.weekday}}</span>
<span>{{ form.endTime.time }}</span>
<span>{{ form.endTime.year }}{{ form.endTime.month }}{{ form.endTime.day }} {{ form.endTime.weekday }}</span>
</div>
</u-row>
</div>
@@ -29,7 +29,8 @@
</div>
<div class="card">
<AiUploader :multiple="true" type="file" :limit="9" placeholder="上传附件" @list="fileList" :def="form.files"></AiUploader>
<AiUploader :multiple="true" type="file" :limit="9" placeholder="上传附件" @list="fileList"
:def="form.files"></AiUploader>
</div>
<div class="card item-wrap" @click="select">
@@ -40,7 +41,7 @@
<span>请选择</span>
</template>
<template v-else>
已选择<em>{{form.attendees.map(e=>e.name).slice(0,2).join("、")}}</em><em>{{form.attendees.length}}</em>
已选择<em>{{ form.attendees.map(e => e.name).slice(0, 2).join("、") }}</em><em>{{ form.attendees.length }}</em>
</template>
<div class="right-arrow"></div>
</div>
@@ -51,7 +52,7 @@
<header>参会提醒</header>
<picker class="right" @change="beforeNoticeChange" :value="form.noticeBefore" range-key="dictName"
:range="$dict.getDict('meetingNoticeBefore')">
<span>{{ form.noticeBefore !=null ? $dict.getDict('meetingNoticeBefore')[form.noticeBefore]["dictName"] : "请选择"}}</span>
<span>{{ form.noticeBefore != null ? $dict.getDict('meetingNoticeBefore')[form.noticeBefore]["dictName"] : "请选择" }}</span>
<div class="right-arrow"></div>
</picker>
</u-row>
@@ -61,7 +62,7 @@
<header>确认提醒</header>
<picker class="right" @change="afterNoticeChange" :value="form.noticeAfter" range-key="dictName"
:range="$dict.getDict('meetingNoticeAfter')">
<span>{{form.noticeAfter !=null ? $dict.getDict('meetingNoticeAfter')[form.noticeAfter]["dictName"] : "请选择"}}</span>
<span>{{ form.noticeAfter != null ? $dict.getDict('meetingNoticeAfter')[form.noticeAfter]["dictName"] : "请选择" }}</span>
<div class="right-arrow"></div>
</picker>
</u-row>
@@ -73,18 +74,19 @@
</div>
<u-picker mode="time" v-model="show" :params="params" @confirm="confirm"></u-picker>
<AiBack ref="aiBack" v-if="!userSelect"/>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.attendees" v-if="userSelect" @change="change"></AiSelectEnterprise>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.attendees" v-if="userSelect"
@change="change"></AiSelectEnterprise>
</div>
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import AiUploader from "../../../components/AiUploader";
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import AiUploader from "../../../components/AiUploader";
export default {
export default {
name: "addMeeting",
components: {AiBack,AiSelectEnterprise,AiUploader},
components: {AiBack, AiSelectEnterprise, AiUploader},
data() {
const initTime = {
time: "",
@@ -114,16 +116,16 @@
}
},
onLoad(opt) {
if(opt.id) {
if (opt.id) {
this.form.id = opt.id
this.getDetail()
}
this.$dict.load("meetingNoticeBefore", "meetingNoticeAfter");
this.$nextTick(()=>{
this.$nextTick(() => {
let date = new Date();
this.form.startTime.time = date.getHours()?.toString()?.padStart(2, "0") + ":" + date.getMinutes()?.toString()?.padStart(2, "0")
this.form.startTime.year = date.getFullYear()
this.form.startTime.month = (date.getMonth()+1)?.toString()?.padStart(2, "0")
this.form.startTime.month = (date.getMonth() + 1)?.toString()?.padStart(2, "0")
this.form.startTime.day = date.getDate()
this.form.startTime.weekday = '日一二三四五六'.charAt(date.getDay())
this.form.endTime = {...this.form.startTime}
@@ -142,10 +144,10 @@
}
},
methods: {
fileList(e){
fileList(e) {
this.form.files = e
},
change(e){
change(e) {
this.form.attendees = e
},
beforeNoticeChange(e) {
@@ -155,12 +157,12 @@
this.form.noticeAfter = e.detail.value
},
getDetail(){
this.$http.post("/app/appmeetinginfo/info-id",null,{
params:{
id:this.form.id
getDetail() {
this.$http.post("/app/appmeetinginfo/info-id", null, {
params: {
id: this.form.id
}
}).then(res=>{
}).then(res => {
if (res && res.data) {
this.form.title = res.data.title
this.form.address = res.data.address
@@ -202,7 +204,7 @@
},
add(status) {
if(status==1){
if (status == 1) {
if (!this.form.title) return this.$u.toast("请输入会议标题")
if (this.form.startTime.timestamp >= this.form.endTime.timestamp) return this.$u.toast("结束时间不能小于开始时间")
@@ -211,12 +213,12 @@
if (!this.form.content) return this.$u.toast("请输入会议内容")
if(!this.form.attendees.length) return this.$u.toast("请选择参会人")
if (!this.form.attendees.length) return this.$u.toast("请选择参会人")
}
this.$http.post("/app/appmeetinginfo/add-update", {
...this.form,
files:this.form.files.map(e=>e.id),
files: this.form.files.map(e => e.id),
status,
startTime: this.form.startTime.year + "-" + this.form.startTime.month + "-" + this.form.startTime.day + " " + this.form.startTime.time + ":00",
endTime: this.form.endTime.year + "-" + this.form.endTime.month + "-" + this.form.endTime.day + " " + this.form.endTime.time + ":00",
@@ -238,11 +240,11 @@
})
}
},
}
}
</script>
<style lang="scss" scoped>
.add-meeting {
.add-meeting {
min-height: 100%;
background: #F5F5F5;
padding-bottom: 140px;
@@ -394,5 +396,5 @@
background-color: #1365DD;
}
}
}
}
</style>

View File

@@ -6,26 +6,26 @@
<div class="body">
<template v-if="list.length">
<div class="card" v-for="(item,index) in list" :key="index" @click="handleClick(item)">
<header>{{item.title}}</header>
<header>{{ item.title }}</header>
<u-row justify="between">
<div class="time">
<span>{{item.startTime|formatTime}}</span>
<span>{{item.startTime|formatDate(0)}}{{item.startTime|formatDate(1)}}{{item.startTime|formatDate(2)}} {{item.startTime|formatWeek}}</span>
<span>{{ item.startTime|formatTime }}</span>
<span>{{ item.startTime|formatDate(0) }}{{ item.startTime|formatDate(1) }}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{item.endTime|formatTime}}</span>
<span>{{item.endTime|formatDate(0)}}{{item.endTime|formatDate(1)}}{{item.endTime|formatDate(2)}} {{item.endTime|formatWeek}}</span>
<span>{{ item.endTime|formatTime }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{ item.endTime|formatWeek }}</span>
</div>
</u-row>
<u-row class="info">
<span>发起单位</span>
<span>{{item.unitName}}</span>
<span>{{ item.unitName }}</span>
</u-row>
<u-gap height="20"></u-gap>
<u-row class="info">
<span>会议地点</span>
<span>{{item.address}}</span>
<span>{{ item.address }}</span>
</u-row>
<div class="tag" :style="{background:'url(' + tag(item.status) + ')'}"></div>
</div>
@@ -39,11 +39,11 @@
</template>
<script>
import AiTopFixed from "../../../components/AiTopFixed";
import AiBack from "../../../components/AiBack";
import AiEmpty from "../../../components/AiEmpty";
import AiTopFixed from "../../../components/AiTopFixed";
import AiBack from "../../../components/AiBack";
import AiEmpty from "../../../components/AiEmpty";
export default {
export default {
name: "belongToMe",
components: {AiTopFixed, AiBack, AiEmpty},
data() {
@@ -122,11 +122,11 @@
return "日一二三四五六".charAt(new Date(date.split(" ")[0]).getDay())
},
}
}
}
</script>
<style lang="scss" scoped>
.belong-to-me {
.belong-to-me {
min-height: 100%;
background-color: #F5F5F5;
@@ -227,5 +227,5 @@
}
}
}
}
}
</style>

View File

@@ -17,7 +17,9 @@
<u-gap height="8"></u-gap>
<u-row>
<img :src="$cdn + 'common/date.png'" alt="">
<span>{{ detail.startTime && detail.startTime.substr(0, 16) }} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
<span>{{
detail.startTime && detail.startTime.substr(0, 16)
}} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>

View File

@@ -2,30 +2,30 @@
<div class="meeting-list">
<div class="card" v-for="(item,index) in list" :key="index" @click="detail(item)">
<header>
<span>{{item.title}}</span>
<span>{{ item.title }}</span>
<span>
<span v-if="index==2">保存于</span>
{{item.createTime}}</span>
{{ item.createTime }}</span>
</header>
<u-row justify="between">
<div class="time">
<span>{{item.startTime|format}}</span>
<span>{{item.startTime|formatDate(0)}}{{item.startTime|formatDate(1)}}{{item.startTime|formatDate(2)}} {{item.startTime|formatWeek}}</span>
<span>{{ item.startTime|format }}</span>
<span>{{ item.startTime|formatDate(0) }}{{ item.startTime|formatDate(1) }}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{item.endTime|format}}</span>
<span>{{item.endTime|formatDate(0)}}{{item.endTime|formatDate(1)}}{{item.endTime|formatDate(2)}} {{item.endTime|formatWeek}}</span>
<span>{{ item.endTime|format }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{ item.endTime|formatWeek }}</span>
</div>
</u-row>
<u-row class="info">
<span>发起人员</span>
<span>{{item.userName}}</span>
<span>{{ item.userName }}</span>
</u-row>
<u-gap height="20"></u-gap>
<u-row class="info">
<span>会议地点</span>
<span>{{item.address}}</span>
<span>{{ item.address }}</span>
</u-row>
<div class="tag" v-if="item.status!=0" :style="{background:'url(' + $cdn + tag(item.status) +')'}"></div>
</div>
@@ -36,10 +36,10 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiEmpty from "../../../components/AiEmpty";
import AiBack from "../../../components/AiBack";
import AiEmpty from "../../../components/AiEmpty";
export default {
export default {
name: "meetingList",
components: {AiBack, AiEmpty},
data() {
@@ -107,7 +107,7 @@
}
},
onShow(){
onShow() {
this.getData()
},
@@ -115,11 +115,11 @@
this.current = this.current + 1;
this.getData()
},
}
}
</script>
<style lang="scss" scoped>
.meeting-list {
.meeting-list {
min-height: 100%;
background-color: #F5F5F5;
box-sizing: border-box;
@@ -199,6 +199,7 @@
.info {
flex-wrap: nowrap;
& > span:first-child {
flex-shrink: 0;
font-size: 30px;
@@ -221,5 +222,5 @@
right: 0;
}
}
}
}
</style>

View File

@@ -2,9 +2,10 @@
<div class="meeting">
<ai-top-fixed>
<u-grid :col="3" :border="false">
<u-grid-item v-for="(item,index) in grid" :key="index" :custom-style="{padding:'14px 0'}" @click="handleClick(index)">
<u-grid-item v-for="(item,index) in grid" :key="index" :custom-style="{padding:'14px 0'}"
@click="handleClick(index)">
<u-icon :name="item.icon" :size="64"></u-icon>
<view class="label">{{item.label}}</view>
<view class="label">{{ item.label }}</view>
</u-grid-item>
</u-grid>
</ai-top-fixed>
@@ -12,26 +13,26 @@
<header>待参加的会议</header>
<template v-if="meetingList.length">
<div class="card" v-for="(item,index) in meetingList" :key="index" @click="detail(item)">
<header>{{item.title}}</header>
<header>{{ item.title }}</header>
<u-row justify="between">
<div class="time">
<span>{{item.startTime|format}}</span>
<span>{{item.startTime|formatDate(0)}}{{item.startTime|formatDate(1)}}{{item.startTime|formatDate(2)}} {{item.startTime|formatWeek}}</span>
<span>{{ item.startTime|format }}</span>
<span>{{ item.startTime|formatDate(0) }}{{ item.startTime|formatDate(1) }}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{item.endTime|format}}</span>
<span>{{item.endTime|formatDate(0)}}{{item.endTime|formatDate(1)}}{{item.endTime|formatDate(2)}} {{item.endTime|formatWeek}}</span>
<span>{{ item.endTime|format }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{ item.endTime|formatWeek }}</span>
</div>
</u-row>
<u-row class="info">
<span>发起人员</span>
<span>{{item.userName}}</span>
<span>{{ item.userName }}</span>
</u-row>
<u-gap height="20"></u-gap>
<u-row class="info">
<span>会议地点</span>
<span>{{item.address}}</span>
<span>{{ item.address }}</span>
</u-row>
<div class="tag" :style="{background:'url(' + $cdn + tag(item.joinStatus) + ')'}"></div>
</div>
@@ -46,16 +47,16 @@
</template>
<script>
import AiEmpty from "../../components/AiEmpty";
import AiTopFixed from "../../components/AiTopFixed";
import AiAdd from "../../components/AiAdd";
import AiEmpty from "../../components/AiEmpty";
import AiTopFixed from "../../components/AiTopFixed";
import AiAdd from "../../components/AiAdd";
export default {
export default {
name: "meetingNotice",
components: {AiEmpty, AiTopFixed, AiAdd},
data() {
return {
meetingList:[]
meetingList: []
}
},
computed: {
@@ -77,16 +78,16 @@
}
},
methods: {
tag(status){
tag(status) {
return {
"0":"common/1wqr.png",
"1":"common/1yqr.png",
"2":"common/1yqj.png",
"0": "common/1wqr.png",
"1": "common/1yqr.png",
"2": "common/1yqj.png",
}[status]
},
detail({id}){
detail({id}) {
uni.navigateTo({
url:"/pages/meetingNotice/components/detail?id=" + id
url: "/pages/meetingNotice/components/detail?id=" + id
})
},
getData() {
@@ -96,48 +97,48 @@
meetingStatus: "1|2",
size: 999
}
}).then(res=>{
if(res && res.data){
}).then(res => {
if (res && res.data) {
this.meetingList = res.data.records
}
})
},
handleClick(index){
handleClick(index) {
let url
if(index==0 || index==2){
url="/pages/meetingNotice/components/meetingList?index=" + index
}else if(index==1){
url="/pages/meetingNotice/components/belongToMe"
if (index == 0 || index == 2) {
url = "/pages/meetingNotice/components/meetingList?index=" + index
} else if (index == 1) {
url = "/pages/meetingNotice/components/belongToMe"
}
uni.navigateTo({url})
},
add() {
uni.navigateTo({
url:"/pages/meetingNotice/components/addMeeting"
url: "/pages/meetingNotice/components/addMeeting"
})
}
},
filters:{
format(date){
return date.split(" ")[1].substr(0,5)
filters: {
format(date) {
return date.split(" ")[1].substr(0, 5)
},
formatDate(date,index){
formatDate(date, index) {
return date.split(" ")[0].split("-")[index]
},
formatWeek(date){
formatWeek(date) {
return "日一二三四五六".charAt((new Date(date.split(" ")[0]).getDay()))
}
},
onShow(){
onShow() {
this.getData()
}
}
}
</script>
<style lang="scss" scoped>
.meeting {
.meeting {
min-height: 100%;
background: #F5F5F5;
padding-bottom: 48px;
@@ -211,6 +212,7 @@
position: absolute;
transform: scaleY(1.3) translate(30%, -40px) rotate(45deg);
}
&:before {
top: 59px;
background-color: #CCCCCC;
@@ -235,7 +237,7 @@
}
}
.tag{
.tag {
width: 112px;
height: 112px;
background-repeat: no-repeat !important;
@@ -247,8 +249,8 @@
}
}
::v-deep .content{
::v-deep .content {
padding: 0 !important;
}
}
}
</style>

View File

@@ -12,7 +12,8 @@
</div>
<div class="card">
<AiUploader :multiple="true" type="image" :limit="9" placeholder="上传图片" @list="fileList" :def="form.files"></AiUploader>
<AiUploader :multiple="true" type="image" :limit="9" placeholder="上传图片" @list="fileList"
:def="form.files"></AiUploader>
</div>
<div class="card item-wrap" @click="select">
@@ -23,7 +24,7 @@
<span>请选择</span>
</template>
<template v-else>
已选择<em>{{form.persons.map(e=>e.name).slice(0,2).join("、")}}</em><em>{{form.persons.length}}</em>
已选择<em>{{ form.persons.map(e => e.name).slice(0, 2).join("、") }}</em><em>{{ form.persons.length }}</em>
</template>
<div class="right-arrow"></div>
</div>
@@ -48,7 +49,7 @@
<span>请选择</span>
</template>
<template v-else>
<span>{{form.releaseTime}}</span>
<span>{{ form.releaseTime }}</span>
</template>
<div class="right-arrow"></div>
</div>
@@ -62,18 +63,19 @@
</div>
<AiBack ref="aiBack" v-if="!userSelect"/>
<u-picker v-model="show" mode="time" :params="params" @confirm="confirm"></u-picker>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.persons" v-if="userSelect" @change="change"></AiSelectEnterprise>
<AiSelectEnterprise :visible.sync="userSelect" :value="form.persons" v-if="userSelect"
@change="change"></AiSelectEnterprise>
</div>
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import AiUploader from "../../../components/AiUploader";
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import AiUploader from "../../../components/AiUploader";
export default {
export default {
name: "add",
components: {AiBack,AiSelectEnterprise,AiUploader},
components: {AiBack, AiSelectEnterprise, AiUploader},
data() {
return {
show: false,
@@ -84,7 +86,7 @@
title: "",
content: "",
persons: [],
releaseTime:null,
releaseTime: null,
files: [],
},
userSelect: false,
@@ -101,35 +103,35 @@
}
},
onLoad(opt) {
if(opt.id) {
if (opt.id) {
this.form.id = opt.id;
this.flag = opt.flag;
this.getDetail();
}
},
methods: {
confirm(e){
if(e.timestamp< (Date.now()/1000)|0){
confirm(e) {
if (e.timestamp < (Date.now() / 1000) | 0) {
return this.$u.toast("发送时间不能小于当前时间");
}
this.form.releaseTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:${e.second}`;
},
fileList(e){
fileList(e) {
this.form.files = e
},
change(e){
change(e) {
this.form.persons = e
},
getDetail(){
this.$http.post("/app/appannouncement/detail",null,{
params:{
id:this.form.id,
getDetail() {
this.$http.post("/app/appannouncement/detail", null, {
params: {
id: this.form.id,
detail: this.flag
}
}).then(res=>{
}).then(res => {
if (res && res.data) {
this.form.releaseTime = res.data.releaseTime;
Object.keys(this.form).map(e=>{
Object.keys(this.form).map(e => {
this.form[e] = res.data[e];
})
this.index = res.data.releaseTime ? 1 : 0;
@@ -138,16 +140,16 @@
},
add(status) {
if(status==1){
if (status == 1) {
if (!this.form.title) return this.$u.toast("请输入会议标题")
if (!this.form.content) return this.$u.toast("请输入会议内容")
if(!this.form.persons.length) return this.$u.toast("请选择发送对象")
if (!this.form.persons.length) return this.$u.toast("请选择发送对象")
if(this.index==1 && !this.form.releaseTime) return this.$u.toast("请选择定时发送时间")
if (this.index == 1 && !this.form.releaseTime) return this.$u.toast("请选择定时发送时间")
if(this.form.releaseTime && new Date(this.form.releaseTime).getTime() < Date.now()) return this.$u.toast("发送时间不能小于当前时间");
if (this.form.releaseTime && new Date(this.form.releaseTime).getTime() < Date.now()) return this.$u.toast("发送时间不能小于当前时间");
}
this.$http.post("/app/appannouncement/addOrUpdate", {
@@ -166,16 +168,16 @@
})
}
},
computed:{
background(){
computed: {
background() {
return `url(${this.$cdn}/notice/jiaobiao.png) no-repeat; background-size: 46px 48px;position: absolute;bottom: 0;right: 0;`
},
}
}
}
</script>
<style lang="scss" scoped>
.add-meeting {
.add-meeting {
min-height: 100%;
background: #F5F5F5;
padding-bottom: 140px;
@@ -261,7 +263,7 @@
}
}
.type{
.type {
width: 320px;
height: 112px;
background: #F5F5F5;
@@ -275,7 +277,7 @@
letter-spacing: 1px;
position: relative;
& > img{
& > img {
width: 46px;
height: 48px;
position: absolute;
@@ -283,7 +285,8 @@
bottom: 0;
}
}
.active{
.active {
background-color: #E7F1FE;
color: #1174FE;
}
@@ -354,5 +357,5 @@
background-color: #1365DD;
}
}
}
}
</style>

View File

@@ -2,21 +2,21 @@
<div class="detail">
<template v-if="detailObj">
<div class="card">
<header>{{detailObj.title}}</header>
<header>{{ detailObj.title }}</header>
<u-gap height="16"></u-gap>
<u-row>
<span>发布人</span>
<span>{{detailObj.releaseUserName}}</span>
<span>{{ detailObj.releaseUserName }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布部门</span>
<span>{{detailObj.unitName}}</span>
<span>{{ detailObj.unitName }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>发布日期</span>
<span>{{detailObj.releaseTime}}</span>
<span>{{ detailObj.releaseTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
</div>
@@ -32,9 +32,9 @@
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{item.name}}.{{item.postfix}}</span>
<span>{{ item.name }}.{{ item.postfix }}</span>
</label>
<span>{{(item.size/1024).toFixed(2)}}KB</span>
<span>{{ (item.size / 1024).toFixed(2) }}KB</span>
</u-row>
</div>
</div>
@@ -43,26 +43,26 @@
<u-row justify="between" class="item">
<span>接收对象</span>
<div class="right">
<em>{{detailObj.readNum}}</em>已读
<em>{{detailObj.unReadNum}}</em>未读
<em>{{ detailObj.readNum }}</em>已读
<em>{{ detailObj.unReadNum }}</em>未读
<div class="arrow"></div>
</div>
</u-row>
</div>
</template>
<AiEmpty description="该通知已撤回" v-else/>
<AiBack />
<AiBack/>
</div>
</template>
<script>
import AiBack from "../../../components/AiBack";
import {mapActions} from "vuex";
import AiEmpty from "../../../components/AiEmpty";
import AiBack from "../../../components/AiBack";
import {mapActions} from "vuex";
import AiEmpty from "../../../components/AiEmpty";
export default {
export default {
name: "detail",
components:{AiBack,AiEmpty},
components: {AiBack, AiEmpty},
data() {
return {
detailObj: null,
@@ -70,7 +70,7 @@
flag: null,
}
},
onLoad(opt){
onLoad(opt) {
this.id = opt.id;
this.flag = opt.flag;
this.getDetail();
@@ -78,12 +78,12 @@
methods: {
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if([".jpg",".png",".gif"].includes(e.postfix.toLowerCase())){
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
}else {
} else {
this.previewFile({...e})
}
},
@@ -93,23 +93,23 @@
id: this.id,
detail: this.flag
}
}).then(res=>{
if(res && res.data){
}).then(res => {
if (res && res.data) {
this.detailObj = res.data;
}
})
},
handleClick() {
uni.navigateTo({
url:"/pages/notification/components/read?id=" + this.id,
url: "/pages/notification/components/read?id=" + this.id,
})
}
},
}
}
</script>
<style lang="scss" scoped>
.detail {
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
@@ -341,5 +341,5 @@
font-size: 36px;
color: #FFFFFF;
}
}
}
</style>

View File

@@ -6,7 +6,7 @@
<div class="body">
<div class="item" v-for="(item,index) in (current==0 ? list.read : list.unRead)" :key="index">
<u-avatar :src="item.avatar" mode="square" size="76"></u-avatar>
<span class="name">{{item.name}}</span>
<span class="name">{{ item.name }}</span>
</div>
</div>
<AiBack/>
@@ -14,10 +14,10 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiTopFixed from "../../../components/AiTopFixed";
import AiBack from "../../../components/AiBack";
import AiTopFixed from "../../../components/AiTopFixed";
export default {
export default {
name: "read",
components: {AiBack, AiTopFixed},
data() {
@@ -33,9 +33,9 @@
},
methods: {
getList() {
this.$http.post("/app/appannouncementreader/list-unread",null,{
params:{
id:this.id
this.$http.post("/app/appannouncementreader/list-unread", null, {
params: {
id: this.id
}
}).then(res => {
if (res && res.data) {
@@ -56,15 +56,15 @@
];
}
},
}
}
</script>
<style lang="scss" scoped>
.read {
.read {
min-height: 100%;
background-color: #F5F5F5;
::v-deep .content{
::v-deep .content {
padding: 0 !important;
}
@@ -80,7 +80,7 @@
background-color: #ffffff;
border-bottom: 1px solid #eeeeee;
& > .name{
& > .name {
font-size: 36px;
font-weight: 600;
color: #333333;
@@ -89,5 +89,5 @@
}
}
}
}
}
</style>

View File

@@ -8,13 +8,15 @@
<template v-if="!item.imgUrl">
<label>
<b v-if="index==0 && item.readStatus==0"></b>
<div class="tag" v-if="index==1" :style="color(item.status)">{{$dict.getLabel("announcementStatus",item.status)}}</div>
{{item.title}}
<div class="tag" v-if="index==1" :style="color(item.status)">
{{ $dict.getLabel("announcementStatus", item.status) }}
</div>
{{ item.title }}
</label>
<u-gap height="16"></u-gap>
<span class="info">
<text>{{item.releaseUserName}}</text>
<text>{{item.releaseTime}}</text>
<text>{{ item.releaseUserName }}</text>
<text>{{ item.releaseTime }}</text>
</span>
</template>
<template v-else>
@@ -22,13 +24,15 @@
<div class="left">
<label>
<b v-if="index==0 && item.readStatus==0"></b>
<div class="tag" v-if="index==1" :style="color(item.status)">{{$dict.getLabel("announcementStatus",item.status)}}</div>
{{item.title}}
<div class="tag" v-if="index==1" :style="color(item.status)">
{{ $dict.getLabel("announcementStatus", item.status) }}
</div>
{{ item.title }}
</label>
<u-gap height="16"></u-gap>
<span class="info">
<text>{{item.releaseUserName}}</text>
<text>{{item.releaseTime}}</text>
<text>{{ item.releaseUserName }}</text>
<text>{{ item.releaseTime }}</text>
</span>
</div>
<img :src="item.imgUrl" alt="">
@@ -46,7 +50,7 @@
<div class="colum" v-for="(item,index) in optList" :key="index" @click="handleOpt(item)">
<u-icon :name="item.icon" size="100" :custom-style="{backgroundColor:'#fff',borderRadius:'16px'}"></u-icon>
<u-gap height="16"></u-gap>
{{item.name}}
{{ item.name }}
</div>
</u-row>
<div class="btn" @click="show=false">关闭</div>
@@ -59,13 +63,13 @@
</template>
<script>
import AiAdd from "../../components/AiAdd";
import AiEmpty from "../../components/AiEmpty";
import AiTopFixed from "../../components/AiTopFixed";
import AiAdd from "../../components/AiAdd";
import AiEmpty from "../../components/AiEmpty";
import AiTopFixed from "../../components/AiTopFixed";
export default {
export default {
name: "notification",
components: {AiAdd, AiEmpty,AiTopFixed},
components: {AiAdd, AiEmpty, AiTopFixed},
data() {
return {
index: 0,
@@ -79,15 +83,15 @@
}
},
onLoad(){
onLoad() {
this.$dict.load("announcementStatus");
},
computed: {
tabs() {
return [{name: "最新公告"},{name: "公告管理"}];
return [{name: "最新公告"}, {name: "公告管理"}];
},
optList(){
optList() {
return [
{
name: "详情",
@@ -118,28 +122,28 @@
val: 4,
show: true,
}
].filter(e=>e.show)
].filter(e => e.show)
}
},
methods: {
changeState(){
this.$http.post(this.content =='删除' ? '/app/appannouncement/delete' : "/app/appannouncement/update-status",null,{
changeState() {
this.$http.post(this.content == '删除' ? '/app/appannouncement/delete' : "/app/appannouncement/update-status", null, {
params: {
[this.content =='删除' ? 'ids' : 'id']:this.detail.id
[this.content == '删除' ? 'ids' : 'id']: this.detail.id
}
}).then(res=>{
if(res.code==0){
}).then(res => {
if (res.code == 0) {
this.$u.toast(this.content + "成功");
this.getList();
}
})
},
confirm(){
confirm() {
this.show = false;
this.changeState();
},
handleOpt(item){
handleOpt(item) {
this.content = {
1: "撤回",
2: "发布",
@@ -153,36 +157,36 @@
});
}
if ([1,2,4].includes(item.val)) {
if ([1, 2, 4].includes(item.val)) {
return this.modal = true;
}
if(item.val==3){
if (item.val == 3) {
this.show = false;
return uni.navigateTo({
url:"/pages/notification/components/add?id=" + this.detail.id + "&flag=" + false
url: "/pages/notification/components/add?id=" + this.detail.id + "&flag=" + false
});
}
},
color(status){
color(status) {
return [
{backgroundColor:"rgba(255,136,34,0.1)",color:"#FF8822"},
{backgroundColor:"rgba(34,102,255,0.1)",color:"#2266FF"},
{backgroundColor:"rgba(102,102,102,0.1)",color:"#666666"},
{backgroundColor:"rgba(255,136,34,0.1)",color:"#FF8822"}
{backgroundColor: "rgba(255,136,34,0.1)", color: "#FF8822"},
{backgroundColor: "rgba(34,102,255,0.1)", color: "#2266FF"},
{backgroundColor: "rgba(102,102,102,0.1)", color: "#666666"},
{backgroundColor: "rgba(255,136,34,0.1)", color: "#FF8822"}
][status];
},
handeClick(item) {
this.detail = item;
if (this.index == 1) {
this.show = true;
}else {
} else {
uni.navigateTo({
url: "/pages/notification/components/detail?id=" + this.detail.id + "&flag=" + true
})
}
},
add(){
add() {
uni.navigateTo({
url: "/pages/notification/components/add"
})
@@ -193,7 +197,7 @@
this.getList()
},
getList() {
this.$http.post(this.index ==0 ? "/app/appannouncement/list-latest" : "/app/appannouncement/list-mgr", null, {
this.$http.post(this.index == 0 ? "/app/appannouncement/list-latest" : "/app/appannouncement/list-mgr", null, {
params: {
size: 10,
current: this.current
@@ -218,16 +222,16 @@
this.current = this.current + 1;
this.getList()
},
}
}
</script>
<style lang="scss" scoped>
.notification {
.notification {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 32px;
::v-deep .content{
::v-deep .content {
padding: 0 !important;
}
@@ -246,7 +250,7 @@
background-color: #ffffff;
margin-bottom: 32px;
&:last-child{
&:last-child {
margin-bottom: 0;
}
@@ -271,7 +275,7 @@
margin-right: 8px;
}
.tag{
.tag {
width: 96px;
height: 44px;
display: inline-block;
@@ -310,7 +314,8 @@
-webkit-line-clamp: 2;
}
}
& > img{
& > img {
width: 192px;
height: 144px;
flex-shrink: 0;
@@ -324,7 +329,7 @@
height: 368px;
background-color: #F7F7F7;
.btn{
.btn {
height: 96px;
display: flex;
align-items: center;
@@ -350,5 +355,5 @@
}
}
}
}
}
</style>

View File

@@ -3,11 +3,11 @@
<div class="info">
<div class="info-top">
<div class="left">
<image src="/static/images/avatar.png" />
<image src="/static/images/avatar.png"/>
<h2>{{ info.name || info.phone }}</h2>
</div>
<div class="right">
<image src="/static/images/phone.png" />
<image src="/static/images/phone.png"/>
<p>拨打电话</p>
</div>
</div>
@@ -55,7 +55,7 @@
<div class="info-item">
<label>图片</label>
<div class="imgs">
<image v-for="(item, index) in 6" :key="index" src="/static/images/avatar.png" />
<image v-for="(item, index) in 6" :key="index" src="/static/images/avatar.png"/>
</div>
</div>
</div>
@@ -68,10 +68,10 @@
</template>
<script>
export default {
export default {
name: 'detail',
data () {
data() {
return {
info: {},
id: '',
@@ -79,7 +79,7 @@
}
},
onLoad (query) {
onLoad(query) {
uni.showLoading()
this.id = query.id
@@ -87,13 +87,13 @@
},
methods: {
linkTo () {
linkTo() {
uni.navigateTo({
url: '/pages/povertyMonitor/Form'
})
},
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/apppreventionreturntopoverty/queryDetailById?id=${id}`).then(res => {
if (res.code === 0) {
this.info = res.data
@@ -105,12 +105,12 @@
})
}
}
}
}
</script>
<style lang="scss">
.detail {
padding-bottom: 122rpx;
.detail {
padding-bottom: 122 rpx;
* {
box-sizing: border-box;
@@ -172,6 +172,7 @@
.right {
text-align: center;
image {
width: 64px;
height: 64px;
@@ -223,7 +224,7 @@
line-height: 1.3;
text-align: right;
color: #999999;
font-size: 30rpx;
font-size: 30 rpx;
}
span {
@@ -246,5 +247,5 @@
}
}
}
}
}
</style>

View File

@@ -24,10 +24,10 @@
</template>
<script>
import AiUploader from '@/components/AiUploader'
import AiUploader from '@/components/AiUploader'
export default {
data () {
export default {
data() {
return {
result: '',
@@ -37,11 +37,11 @@
components: {
AiUploader
}
}
}
</script>
<style lang="scss">
.form {
.form {
padding-bottom: 120px;
div {
@@ -108,5 +108,5 @@
font-size: 32px;
background: #3192F4;
}
}
}
</style>

View File

@@ -8,7 +8,9 @@
<div class="item" v-for="(item, index) in list" :key="index" hover-class="bg-hover" @click="toDetail(item.id)">
<div class="item-top">
<h2>{{ item.name || item.phone }}</h2>
<span :style="{color: item.riskEliminationMethod ? '#2EA222' : '#FF4466'}">{{ item.riskEliminationMethod ? '已解除' : '未解除' }}</span>
<span :style="{color: item.riskEliminationMethod ? '#2EA222' : '#FF4466'}">{{
item.riskEliminationMethod ? '已解除' : '未解除'
}}</span>
</div>
<p>{{ item.addressArea }} {{ item.address }}</p>
<div class="item-bottom">家庭收入</div>
@@ -19,11 +21,12 @@
</template>
<script>
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
import AiEmpty from '@/components/AiEmpty/AiEmpty'
export default {
name: 'list',
data () {
data() {
return {
list: [],
isMore: false,
@@ -36,7 +39,7 @@
AiEmpty
},
created () {
created() {
uni.showLoading()
this.$nextTick(() => {
this.getList()
@@ -47,11 +50,11 @@
},
methods: {
changeTab (index) {
changeTab(index) {
this.currIndex = index
},
toDetail (id) {
toDetail(id) {
uni.navigateTo({
url: `/pages/Monitor/Detail?id=${id}&isFrom=1`
})
@@ -99,11 +102,11 @@
})
}
}
}
}
</script>
<style lang="scss">
.list {
.list {
padding: 30px 0 120px;
.tab {
@@ -127,8 +130,8 @@
span {
position: relative;
flex: 1;
height: 96rpx;
line-height: 96rpx;
height: 96 rpx;
line-height: 96 rpx;
color: #000000;
text-align: center;
font-size: 32px;
@@ -198,12 +201,12 @@
p {
line-height: 1.4;
margin-bottom: 32rpx;
margin-bottom: 32 rpx;
padding: 0 32px;
color: #999999;
font-size: 26px;
}
}
}
}
}
</style>

View File

@@ -33,12 +33,12 @@
</template>
<script>
import echarts from 'echarts'
import echarts from 'echarts'
export default {
export default {
name: 'statistics',
data () {
data() {
return {
chart1: null,
chart2: null,
@@ -48,8 +48,8 @@
}
},
mounted () {
window.scrollTo(0,0)
mounted() {
window.scrollTo(0, 0)
// this.chart1 = echarts.init(document.getElementById('chart1'))
this.chart4 = echarts.init(document.getElementById('chart4'))
this.chart2 = echarts.init(document.getElementById('chart2'))
@@ -59,7 +59,7 @@
},
methods: {
getInfo () {
getInfo() {
this.$http.post(`/app/apppreventionreturntopoverty/statistics-h5`).then(res => {
if (res.code === 0) {
this.info = res.data
@@ -70,7 +70,7 @@
})
},
initChart1 () {
initChart1() {
const option = {
tooltip: {
trigger: 'item',
@@ -112,9 +112,9 @@
}
},
data: [
{ value: 60, name: '总上报' },
{ value: 40, name: '纳入监测' },
{ value: 20, name: '已处理' }
{value: 60, name: '总上报'},
{value: 40, name: '纳入监测'},
{value: 20, name: '已处理'}
]
}
]
@@ -123,7 +123,7 @@
this.chart1.setOption(option)
},
initChart2 (data) {
initChart2(data) {
const values = data.map(item => {
return {
value: item.typeCount,
@@ -162,7 +162,7 @@
this.chart2.setOption(option)
},
initChart3 (data) {
initChart3(data) {
const values = data.map(item => {
return {
value: item.typeCount,
@@ -201,7 +201,7 @@
this.chart3.setOption(option)
},
initChart4 (x, y) {
initChart4(x, y) {
const option = {
tooltip: {
trigger: 'item'
@@ -242,8 +242,8 @@
}
},
data: [
{ value: y, name: '纳入监测' },
{ value: x, name: '消除监测' }
{value: y, name: '纳入监测'},
{value: x, name: '消除监测'}
]
}
]
@@ -252,11 +252,11 @@
this.chart4.setOption(option)
}
}
}
}
</script>
<style lang="scss">
.statistics {
.statistics {
padding: 40px 0 120px;
.block {
@@ -325,5 +325,5 @@
}
}
}
}
}
</style>

View File

@@ -12,11 +12,11 @@
</template>
<script>
import Statistics from './components/Statistics.vue'
import List from './components/List.vue'
import Statistics from './components/Statistics.vue'
import List from './components/List.vue'
export default {
data () {
export default {
data() {
return {
currIndex: 0
}
@@ -28,11 +28,11 @@
},
computed: {
tabBar () {
tabBar() {
const link = icon => `${this.$cdn}askform/${icon}.png`
return [
{text: "预警监控", iconPath: "bdlb1", selectedIconPath: "bdlb2" },
{text: "数据统计", iconPath: "xjxm1", selectedIconPath: "xjxm2" }
{text: "预警监控", iconPath: "bdlb1", selectedIconPath: "bdlb2"},
{text: "数据统计", iconPath: "xjxm1", selectedIconPath: "xjxm2"}
].map(e => ({
...e,
iconPath: link(e.iconPath),
@@ -41,7 +41,7 @@
}
},
onLoad () {
onLoad() {
uni.$on('reload', () => {
if (this.currIndex === 0) {
this.$refs.list.reload()
@@ -56,11 +56,11 @@
this.$refs.list.getList()
}
}
}
}
</script>
<style lang="scss" scoped>
.povertyMonitor {
.povertyMonitor {
.footer {
display: flex;
position: fixed;
@@ -85,5 +85,5 @@
}
}
}
}
}
</style>

View File

@@ -142,8 +142,8 @@ export default {
}
})
},
handleWechat({userId,type}) {
this.injectJWeixin('openUserProfile').then(()=>{
handleWechat({userId, type}) {
this.injectJWeixin('openUserProfile').then(() => {
this.wxInvoke(['openUserProfile', {
type,
userid: userId

View File

@@ -194,6 +194,7 @@ export default {
<style lang="scss" scoped>
.info {
padding-bottom: 130px;
.certBtn {
cursor: pointer;
background: $uni-color-primary;

View File

@@ -12,17 +12,20 @@
</div>
<div class="radio-content">
<div class="title">素材标题</div>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;" maxlength="30"></textarea>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;"
maxlength="30"></textarea>
</div>
</div>
<div v-else>
<div class="radio-content mar-b16">
<div class="title">素材标题</div>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;" maxlength="30"></textarea>
<textarea rows="2" placeholder="请输入30字以内" v-model="name" style="width:100%;height:80px;"
maxlength="30"></textarea>
</div>
<div class="radio-content">
<div class="title">文本内容</div>
<textarea rows="8" placeholder="请输入文本内容12000字以内" v-model="content" style="width:100%;height:300px;" maxlength="12000"></textarea>
<textarea rows="8" placeholder="请输入文本内容12000字以内" v-model="content" style="width:100%;height:300px;"
maxlength="12000"></textarea>
</div>
</div>
<div class="btn" @click="confirm">确认</div>
@@ -31,8 +34,9 @@
</template>
<script>
import AiBack from "@/components/AiBack";
export default {
import AiBack from "@/components/AiBack";
export default {
name: "addPlay",
data() {
return {
@@ -47,7 +51,7 @@
AiBack
},
onLoad (query) {
onLoad(query) {
this.type = query.type
uni.$on('record', e => {
this.file = e
@@ -55,24 +59,24 @@
},
methods: {
toRecord () {
toRecord() {
uni.navigateTo({
url: `/pages/resourcesManage/recording`
})
},
dataURLtoFile (dataurl, filename) {
dataURLtoFile(dataurl, filename) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1]
var bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n)
while (n--){
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], filename, {type:mime})
return new File([u8arr], filename, {type: mime})
},
confirm () {
confirm() {
if (!this.file && this.type === '1') {
return this.$u.toast('请选择音频文件')
}
@@ -113,15 +117,17 @@
})
}
}
}
}
</script>
<style lang="scss" scoped>
.addPlay {
padding-bottom: 128px;
.content{
.content {
padding-left: 32px;
background-color: #fff;
.item{
.item {
width: 100%;
padding: 34px 0;
font-size: 32px;
@@ -132,49 +138,57 @@
display: flex;
color: #333;
justify-content: space-between;
.label{
.label {
width: 198px;
font-size: 32px;
}
.value{
.value {
font-size: 28px;
width: calc(100% - 198px);
padding-right: 32px;
box-sizing: border-box;
text-align: right;
img{
img {
width: 32px;
height: 32px;
vertical-align: middle;
margin-left: 6px;
}
}
.color-999{
.color-999 {
color: #999;
}
}
}
.radio-content{
.radio-content {
padding: 34px 32px 38px;
background-color: #fff;
.title{
.title {
font-size: 32px;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #333;
line-height: 44px;
margin-bottom: 32px;
span{
span {
font-size: 24px;
font-weight: 400;
}
}
}
.mar-b16{
.mar-b16 {
margin-bottom: 16px;
}
.btn{
.btn {
position: fixed;
bottom: 0;
left: 0;

View File

@@ -119,17 +119,17 @@
</template>
<script>
import AiBack from "@/components/AiBack";
import Recorder from 'recorder-core'
import 'recorder-core/src/engine/mp3'
import 'recorder-core/src/engine/mp3-engine'
import stopImg from './img/stop-img.png'
import microphone from './img/microphone.png'
import playImg from './img/play-icon.png'
import AiBack from "@/components/AiBack";
import Recorder from 'recorder-core'
import 'recorder-core/src/engine/mp3'
import 'recorder-core/src/engine/mp3-engine'
import stopImg from './img/stop-img.png'
import microphone from './img/microphone.png'
import playImg from './img/play-icon.png'
export default {
export default {
name: 'recording',
data () {
data() {
return {
isRecording: false,
progress: 0,
@@ -154,21 +154,21 @@
AiBack
},
mounted () {
mounted() {
this.$nextTick(() => {
this.audio = document.querySelector('audio')
})
},
methods: {
record () {
record() {
if (!this.isRecording) {
this.duration = 0
this.recorder = Recorder({
type: 'mp3',
sampleRate: 16000,
bitRate: 16,
onProcess (buffers, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd) {
onProcess(buffers, powerLevel, bufferDuration, bufferSampleRate, newBufferIdx, asyncEnd) {
//可利用extensions/waveview.js扩展实时绘制波形
}
})
@@ -185,7 +185,7 @@
}
},
blobToDataURI (blob) {
blobToDataURI(blob) {
return new Promise((resolve) => {
var reader = new FileReader()
reader.readAsDataURL(blob)
@@ -195,7 +195,7 @@
})
},
save () {
save() {
if (!this.blobFile) {
return this.$u.toast(`请录音`)
}
@@ -208,11 +208,11 @@
})
},
onAudioEnd () {
onAudioEnd() {
this.isPlay = false
},
stop () {
stop() {
this.isRecording = false
this.isStop = true
clearTimeout(this.timingTimeout)
@@ -226,7 +226,7 @@
var seconds = durationObj.seconds() > 9 ? durationObj.seconds() : '0' + durationObj.seconds()
this.time = hours + ':' + min + ':' + seconds
console.log(blob, (window.URL|| webkitURL).createObjectURL(blob), '时长:' + duration + 'ms')
console.log(blob, (window.URL || webkitURL).createObjectURL(blob), '时长:' + duration + 'ms')
this.recorder.close()
this.recorder = null
}, msg => {
@@ -236,7 +236,7 @@
})
},
play () {
play() {
if (!this.isPlay) {
this.playAudio()
this.counterDown()
@@ -247,10 +247,10 @@
}
},
playAudio () {
playAudio() {
this.isPlay = true
if (!this.audioSrc) {
this.audioSrc = (window.URL||webkitURL).createObjectURL(this.blobFile)
this.audioSrc = (window.URL || webkitURL).createObjectURL(this.blobFile)
}
this.$nextTick(() => {
@@ -258,11 +258,11 @@
})
},
recodeStop () {
recodeStop() {
this.recorder.stop((blob, duration) => {
this.restart()
this.blobFile = blob
console.log(blob, (window.URL|| webkitURL).createObjectURL(blob), '时长:' + duration + 'ms')
console.log(blob, (window.URL || webkitURL).createObjectURL(blob), '时长:' + duration + 'ms')
this.recorder.close()
this.recorder = null
}, msg => {
@@ -272,7 +272,7 @@
})
},
restart () {
restart() {
this.time = '00:00:00'
this.progress = 0
this.blobFile = null
@@ -285,7 +285,7 @@
this.isStop = false
},
counterDown () {
counterDown() {
if (this.counterDownTime === -1) {
clearTimeout(this.counterDownTimeout)
this.counterDownTime = this.duration
@@ -299,13 +299,13 @@
var seconds = durationObj.seconds() > 9 ? durationObj.seconds() : '0' + durationObj.seconds()
this.time = hours + ':' + min + ':' + seconds
this.counterDownTime --
this.counterDownTime--
this.counterDownTimeout = setTimeout(() => {
this.counterDown()
}, 1000)
},
timing () {
timing() {
this.progress = ((this.counterDownTime / 120) * 100).toFixed(2) > 100 ? 101 : ((this.counterDownTime / 120) * 100).toFixed(2)
var durationObj = this.$dayjs.duration(this.counterDownTime * 1000)
var hours = durationObj.hours() > 9 ? durationObj.hours() : '0' + durationObj.hours()
@@ -313,39 +313,43 @@
var seconds = durationObj.seconds() > 9 ? durationObj.seconds() : '0' + durationObj.seconds()
this.time = hours + ':' + min + ':' + seconds
this.counterDownTime ++
this.counterDownTime++
this.timingTimeout = setTimeout(() => {
this.timing()
}, 1000)
}
}
}
}
</script>
<style lang="scss" scoped>
uni-page-body{
uni-page-body {
background-color: #fff;
}
.recording {
}
.recording {
height: 100vh;
overflow-y: hidden;
.content{
.content {
padding-top: 310px;
text-align: center;
img{
img {
width: 406px;
height: 306px;
margin-bottom: 48px;
}
.text{
.text {
font-size: 30px;
color: #999;
line-height: 42px;
text-align: center;
}
}
.footer{
.footer {
display: flex;
align-items: center;
justify-content: center;
@@ -357,7 +361,8 @@
background: #F6F8FC;
padding: 20px 86px;
box-sizing: border-box;
span{
span {
display: inline-block;
width: 160px;
height: 64px;
@@ -370,7 +375,8 @@
vertical-align: top;
margin-top: 30px;
}
img{
img {
width: 128px;
height: 128px;
margin: 0 64px;
@@ -407,7 +413,8 @@
background: url(./img/top.png) repeat-x;
background-size: auto 6px;
}
.time{
.time {
width: 100%;
margin-top: 208px;
text-align: center;
@@ -449,6 +456,7 @@
border-radius: 4px;
background-color: #3476EE;
}
.header-line span.line1 {
animation-delay: -1s;
}
@@ -488,6 +496,7 @@
.header-line span.line10 {
animation-delay: -0.1s;
}
.header-line span.line11 {
animation-delay: -1s;
}
@@ -536,5 +545,5 @@
transform: scaleY(4);
}
}
}
}
</style>

View File

@@ -1,7 +1,8 @@
<template>
<div class="resourcesManage">
<div class="tab">
<u-tabs :list="tab" :is-scroll="false" :current="currIndex" @change="change" height="96" :bar-style="barStyle"></u-tabs>
<u-tabs :list="tab" :is-scroll="false" :current="currIndex" @change="change" height="96"
:bar-style="barStyle"></u-tabs>
</div>
<div class="record" v-if="currIndex == 0">
<div class="item" v-for="(item, index) in list" :key="index" @click="choose(item)">
@@ -28,13 +29,14 @@
</div>
</template>
<script>
import AiVideo from '@/components/AiVideo'
import AiBack from "@/components/AiBack";
export default {
import AiVideo from '@/components/AiVideo'
import AiBack from "@/components/AiBack";
export default {
name: "resourcesManage",
data() {
return {
tab: [{ name: '音频素材' }, { name: '文本素材' }],
tab: [{name: '音频素材'}, {name: '文本素材'}],
list: [],
currIndex: 0,
current: 1,
@@ -44,7 +46,7 @@
url: '',
autioName: '',
audio: null,
barStyle: {width:'98px', bottom: '-3px', left: '-38px'}
barStyle: {width: '98px', bottom: '-3px', left: '-38px'}
}
},
@@ -53,7 +55,7 @@
AiVideo
},
onLoad (query) {
onLoad(query) {
this.isChoose = query.isChoose ? true : false
this.getList()
uni.$on('getList', e => {
@@ -79,13 +81,13 @@
})
},
add () {
add() {
uni.navigateTo({
url: `/pages/resourcesManage/addPlay?type=${this.currIndex === 0 ? 1 : 3}`
})
},
choose (item) {
choose(item) {
if (!this.isChoose) {
console.log(item.url)
this.url = item.url
@@ -103,7 +105,7 @@
})
},
getList () {
getList() {
if (this.isMore) return
this.$http.post(`/app/appdlbresource/list`, null, {
@@ -142,40 +144,45 @@
onReachBottom() {
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.resourcesManage {
padding-bottom: 128px;
.tab{
.tab {
border-bottom: 1px solid #ddd;
margin-bottom: 4px;
}
.audio {
width: 100%;
height: 400rpx;
height: 400 rpx;
box-sizing: border-box;
padding: 104rpx 0 46rpx;
padding: 104 rpx 0 46 rpx;
audio {
}
}
.record{
.record {
background-color: #fff;
.item{
.item {
width: 100%;
display: flex;
border-bottom: 1px solid #ddd;
padding: 32px 30px;
box-sizing: border-box;
img{
img {
width: 56px;
height: 56px;
margin-right: 14px;
}
.info{
.info {
width: calc(100% - 70px);
line-height: 44px;
font-size: 34px;
@@ -192,34 +199,41 @@
}
}
}
.record-text{
.record-text {
background-color: #fff;
.item{
.item {
width: 100%;
border-bottom: 1px solid #ddd;
padding: 32px 30px;
box-sizing: border-box;
font-size: 30px;
div{
div {
font-size: 30px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333;
overflow: hidden;
text-overflow:ellipsis;
text-overflow: ellipsis;
white-space: nowrap;
margin-bottom: 12px;
.color-0063E5{
.color-0063E5 {
color: #0063E5;
}
.color-FF8100{
.color-FF8100 {
color: #FF8100;
}
.color-FF4466{
.color-FF4466 {
color: #FF4466;
}
}
p{
p {
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #666;
@@ -235,7 +249,8 @@
}
}
}
.add-img{
.add-img {
width: 120px;
position: fixed;
bottom: 120px;

View File

@@ -19,24 +19,21 @@
export default {
name: "talking",
data() {
return {
}
},
methods: {
return {}
},
methods: {},
mounted() {
}
}
</script>
<style lang="scss" scoped>
uni-page-body{
uni-page-body {
background-color: #fff;
}
.talking {
.header{
.header {
width: 100%;
height: 128px;
background: #F6F8FC;
@@ -44,41 +41,49 @@ uni-page-body{
box-sizing: border-box;
display: flex;
justify-content: space-between;
p{
p {
font-size: 32px;
color: #333;
line-height: 44px;
span{
span {
color: #1174FE;
}
}
img{
img {
width: 32px;
height: 32px;
}
}
.content{
.content {
margin-top: 224px;
.time{
.time {
width: 100%;
text-align: center;
font-size: 96px;
color: #000000;
line-height: 134px;
}
img{
img {
width: 406px;
height: 306px;
margin: 0 0 48px 172px;
}
.text{
.text {
font-size: 30px;
color: #999;
line-height: 42px;
text-align: center;
}
}
.footer{
.footer {
position: fixed;
bottom: 0;
left: 0;
@@ -87,7 +92,8 @@ uni-page-body{
background: #F6F8FC;
padding: 20px 310px;
box-sizing: border-box;
img{
img {
width: 128px;
height: 128px;
}

View File

@@ -48,7 +48,7 @@
</u-row>
<u-row>
<u-icon :name="$cdn + 'Location2@2x.png'" :custom-style="{width:'20px',height:'20px'}"></u-icon>
<span class="date">{{item.areaName}}</span>
<span class="date">{{ item.areaName }}</span>
</u-row>
</u-row>
<div class="content">
@@ -141,7 +141,7 @@ export default {
status: this.currentType,
reportType: this.reportIndex == 6 ? null : this.reportIndex,
address: this.keyword,
areaId:this.user?.areaId
areaId: this.user?.areaId
}
}).then(res => {
if (res?.code == 0) {

View File

@@ -30,12 +30,13 @@
<text class="title">事件描述</text>
<div class="content">{{ detail.explain }}</div>
<div class="photos">
<img :src="item.url" alt="" v-for="(item,index) in detail.files" :key="index" @click.stop="previewImage(detail.files,index)">
<img :src="item.url" alt="" v-for="(item,index) in detail.files" :key="index"
@click.stop="previewImage(detail.files,index)">
</div>
<template v-if="detail.handleResult">
<u-row justify="space-between" class="result">
<text class="title">处理结果</text>
<text>{{detail.integral|formt}}</text>
<text>{{ detail.integral|formt }}</text>
</u-row>
<div class="content">{{ detail.handleResult }}</div>
<div class="photos">
@@ -93,7 +94,7 @@ export default {
}
},
methods: {
previewImage(data,index) {
previewImage(data, index) {
uni.previewImage({
urls: data.map(e => e.url),
current: data[index].url
@@ -117,8 +118,8 @@ export default {
}
},
filters:{
formt(val){
filters: {
formt(val) {
return +val > 0 ? `+${val}` : val
}
}

View File

@@ -20,7 +20,7 @@
v-for="(item, index) in categoryList"
:key="index"
>
<img class="category-img" :src="parseObj(item.photo)" alt="" />
<img class="category-img" :src="parseObj(item.photo)" alt=""/>
<div class="category-info">
<label class="hidden">{{ item.merchandiseName }}</label>
<span class="score"
@@ -41,7 +41,7 @@
</div>
<div class="btn" @click="hanldeSubmit">确认领取</div>
</div>
<back />
<back/>
</div>
</template>
@@ -50,7 +50,7 @@ import Back from '../../components/AiBack'
export default {
name: 'balance',
components: { Back },
components: {Back},
data() {
return {
selected: null,
@@ -81,7 +81,7 @@ export default {
},
computed: {
uri() {
return this.$cdn+'other/' + 'line.png'
return this.$cdn + 'other/' + 'line.png'
}
},
@@ -95,7 +95,7 @@ export default {
title: '请选择结算对象',
icon: 'none'
})
let { memberId, familyId } = this.selected
let {memberId, familyId} = this.selected
this.$http
.post(`/app/appvillagerintegralshoporder/addOrder`, {
shopId: this.categoryList[0].shopId,
@@ -142,6 +142,7 @@ export default {
.balance {
min-height: 100%;
background-color: #ffffff;
.operate {
height: 120px;
display: flex;

View File

@@ -1,15 +1,18 @@
<template>
<div class="result-page">
<img :src="imgSrc" alt="">
<text>{{text}}</text>
<u-button type="primary" :custom-style="{width:'100%',borderRadius:'4px',marginTop:'48px'}" @click="goBack">{{btnText}}</u-button>
<text>{{ text }}</text>
<u-button type="primary" :custom-style="{width:'100%',borderRadius:'4px',marginTop:'48px'}" @click="goBack">
{{ btnText }}
</u-button>
<back></back>
</div>
</template>
<script>
import Back from "../../../../components/AiBack";
export default {
import Back from "../../../../components/AiBack";
export default {
name: "result-page",
components: {Back},
data() {
@@ -25,39 +28,39 @@
methods: {
goBack() {
uni.navigateBack({
delta:3
delta: 3
})
}
},
computed: {
text(){
text() {
return this.flag ? '领取成功!' : '领取失败!请联系管理员处理'
},
btnText(){
btnText() {
return this.flag ? '确定' : '我知道了'
},
imgSrc(){
return this.flag ? (this.$cdn+'other/' + 'kztcg.png') : (this.$cdn+'other/' + 'kztsb.png')
}
imgSrc() {
return this.flag ? (this.$cdn + 'other/' + 'kztcg.png') : (this.$cdn + 'other/' + 'kztsb.png')
}
}
}
</script>
<style lang="scss" scoped>
.result-page {
.result-page {
min-height: 100%;
background-color: #ffffff;
display: flex;
flex-direction: column;
align-items: center;
padding: 96px ;
padding: 96px;
img {
width: 192px;
height: 192px;
}
text{
text {
font-size: 36px;
font-weight: 800;
color: #333333;
@@ -65,5 +68,5 @@
display: flex;
justify-content: center;
}
}
}
</style>

View File

@@ -5,8 +5,8 @@
</div>
<div class="result-body">
<div class="res-item" v-if="result" @click="selected">
<span>{{result.familyName}}</span>
<span>剩余积分:{{result.familyIntegral}}</span>
<span>{{ result.familyName }}</span>
<span>剩余积分:{{ result.familyIntegral }}</span>
</div>
<span class="placeholder" v-else>请通过搜索
<strong>手机号或身份证号</strong>
@@ -20,9 +20,9 @@
</template>
<script>
import back from "../../components/AiBack";
import back from "../../components/AiBack";
export default {
export default {
name: "search",
components: {back},
data() {
@@ -37,7 +37,7 @@
uni.navigateBack({
delta: 1,
success: () => {
uni.$emit('selected',this.result)
uni.$emit('selected', this.result)
},
fail: (err) => {
console.error(err)
@@ -72,11 +72,11 @@
this.show = false
}
}
}
}
</script>
<style lang="scss" scoped>
.search {
.search {
min-height: 100%;
background-color: #ffffff;
@@ -116,5 +116,5 @@
}
}
}
}
</style>

View File

@@ -5,7 +5,7 @@
<scroll-view scroll-y style="height: 100%;">
<div class="nav-left-item" v-for="(val, key, index) in list" :style="active(key)" :key="index"
@click="clickSort(key,index)">
{{key}}分区
{{ key }}分区
<u-badge size="mini" :count="sortCountList[index]" absolute :offset="[5,5]"></u-badge>
</div>
</scroll-view>
@@ -17,14 +17,14 @@
:src="parseObj(item.photo)"
class="category-img" alt="">
<div class="category-info">
<label class="hidden">{{item.merchandiseName}}</label>
<span class="score">{{item.costIntegral}}
<label class="hidden">{{ item.merchandiseName }}</label>
<span class="score">{{ item.costIntegral }}
<span>积分</span>
</span>
<div class="wrap">
<div class="lxc-count">
<div class="less" @click="less(item,index)">-</div>
<div class="num">{{item.merchandiseNumber}}</div>
<div class="num">{{ item.merchandiseNumber }}</div>
<div class="less" @click="add(item,index)">+</div>
</div>
</div>
@@ -34,8 +34,8 @@
</div>
<div class="footer">
<div class="sum">
<span>{{totalCount}}件商品</span>
<span>合计{{totalScore}}
<span>{{ totalCount }}件商品</span>
<span>合计{{ totalScore }}
<span>积分</span>
</span>
</div>
@@ -47,9 +47,10 @@
</template>
<script>
import AiEmpty from "../../components/AiEmpty";
import {mapState} from "vuex";
export default {
import AiEmpty from "../../components/AiEmpty";
import {mapState} from "vuex";
export default {
name: "supermarket",
components: {AiEmpty},
data() {
@@ -70,8 +71,8 @@
list: {
handler(val) {
let sum = 0
Object.keys(val).map(e=>{
val[e].map(p=>{
Object.keys(val).map(e => {
val[e].map(p => {
if (p.merchandiseNumber != 0) {
sum += (p.merchandiseNumber) * (p.costIntegral)
}
@@ -124,16 +125,16 @@
},
add(item, index) {
this.list[this.idx][index]["merchandiseNumber"] = this.list[this.idx][index]["merchandiseNumber"] + 1
this.$set(this.sortCountList, this.mark, this.list[this.idx]?.reduce((pre,curr)=>{
this.$set(this.sortCountList, this.mark, this.list[this.idx]?.reduce((pre, curr) => {
return (pre + curr.merchandiseNumber)
},0))
}, 0))
},
less(item, index) {
if (item.merchandiseNumber > 0) {
this.list[this.idx][index]["merchandiseNumber"] = this.list[this.idx][index]["merchandiseNumber"] - 1
this.$set(this.sortCountList, this.mark, this.list[this.idx]?.reduce((pre,curr)=>{
this.$set(this.sortCountList, this.mark, this.list[this.idx]?.reduce((pre, curr) => {
return (pre + curr.merchandiseNumber)
},0))
}, 0))
}
},
clickSort(key, index) {
@@ -163,15 +164,15 @@
}
},
}
}
</script>
<style lang="scss" scoped>
uni-page-body{
uni-page-body {
background-color: #ffffff;
}
}
.supermarket {
.supermarket {
background-color: #ffffff;
display: flex;
justify-content: space-between;
@@ -246,11 +247,13 @@
.wrap {
display: flex;
justify-content: flex-end;
.lxc-count{
.lxc-count {
display: flex;
align-items: center;
justify-content: center;
.less{
.less {
width: 40px;
height: 40px;
font-size: 20px;
@@ -262,7 +265,7 @@
color: #333333;
}
.num{
.num {
width: 89px;
height: 61px;
display: flex;
@@ -333,5 +336,5 @@
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
}
</style>

View File

@@ -8,7 +8,7 @@
</div>
<picker @change="change" :value="form.type" range-key="dictName" :range="$dict.getDict('workTaskType')">
<u-row>
<div v-if="form.type!=null" class="value">{{$dict.getDict('workTaskType')[form.type]["dictName"]}}</div>
<div v-if="form.type!=null" class="value">{{ $dict.getDict('workTaskType')[form.type]["dictName"] }}</div>
<div v-else class="placeholder">请选择</div>
<div class="arrow"></div>
</u-row>
@@ -41,7 +41,7 @@
</div>
<picker @change="dateChange" mode="date" :value="form.lastTime" :start="startDate" :end="endDate">
<u-row>
<div v-if="form.lastTime!=null" class="value">{{form.lastTime}}</div>
<div v-if="form.lastTime!=null" class="value">{{ form.lastTime }}</div>
<div v-else class="placeholder">请选择</div>
<div class="arrow" v-if="form.lastTime==null"></div>
<div class="clear" v-else @click.stop="form.lastTime = null"></div>
@@ -56,8 +56,8 @@
</div>
<u-row @click="handleSelectUser(0)" style="justify-content: flex-end">
<div v-if="form.userInfoList.length" class="value">
已选择<em>{{form.userInfoList.slice(0,2).map(e=>e.name).join("、")}}</em>
<em>{{form.userInfoList.length}}</em>
已选择<em>{{ form.userInfoList.slice(0, 2).map(e => e.name).join("、") }}</em>
<em>{{ form.userInfoList.length }}</em>
</div>
<div v-else class="placeholder">请选择</div>
<div class="arrow"></div>
@@ -69,8 +69,8 @@
<div class="left" style="line-height: 22px;">督办人</div>
<u-row @click="handleSelectUser(1)" style="justify-content: flex-end">
<div v-if="form.checkUserList.length" class="value">
已选择<em>{{form.checkUserList.slice(0,2).map(e=>e.name).join("、")}}</em>
<em>{{form.checkUserList.length}}</em>
已选择<em>{{ form.checkUserList.slice(0, 2).map(e => e.name).join("、") }}</em>
<em>{{ form.checkUserList.length }}</em>
</div>
<div v-else class="placeholder">请选择</div>
<div class="arrow"></div>
@@ -82,8 +82,8 @@
<div class="left" style="line-height: 22px;">抄送人</div>
<u-row @click="handleSelectUser(2)" style="justify-content: flex-end">
<div v-if="form.sendUserList.length" class="value">
已选择<em>{{form.sendUserList.slice(0,2).map(e=>e.name).join("、")}}</em>
<em>{{form.sendUserList.length}}</em>
已选择<em>{{ form.sendUserList.slice(0, 2).map(e => e.name).join("、") }}</em>
<em>{{ form.sendUserList.length }}</em>
</div>
<div v-else class="placeholder">请选择</div>
<div class="arrow"></div>
@@ -106,10 +106,10 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
import AiBack from "../../../components/AiBack";
import AiSelectEnterprise from "../../../components/AiSelectEnterprise";
export default {
export default {
name: "create",
components: {AiBack, AiSelectEnterprise},
data() {
@@ -147,15 +147,15 @@
},
methods: {
handleCreate() {
if (this.form.type==null) return this.$u.toast("请选择任务类型")
if (this.form.type == null) return this.$u.toast("请选择任务类型")
if (!this.form.taskTitle) return this.$u.toast("请输入任务标题")
if (!this.form.taskDescription) return this.$u.toast("请输入任务说明")
if (this.form.lastTime==null) return this.$u.toast("请选择截止日期")
if (this.form.lastTime == null) return this.$u.toast("请选择截止日期")
if (!this.form.userInfoList.length) return this.$u.toast("请选择执行人")
this.$http.post("/app/appworktaskinfo/addOrUpdate", {
...this.form,
lastTime:this.form.lastTime + " 23:59:59"
lastTime: this.form.lastTime + " 23:59:59"
}).then(res => {
if (res.code == 0) {
this.$u.toast("创建成功")
@@ -211,11 +211,11 @@
this.selectList = []
}
},
}
}
</script>
<style lang="scss" scoped>
.create-sub-task {
.create-sub-task {
min-height: 100%;
background-color: #F5F5F5;
box-sizing: border-box;
@@ -321,5 +321,5 @@
font-size: 36px;
color: #FFFFFF;
}
}
}
</style>

View File

@@ -6,43 +6,43 @@
</ai-top-fixed>
<template v-if="index==0">
<div class="card">
<header>{{detail.taskTitle}}</header>
<header>{{ detail.taskTitle }}</header>
<u-gap height="16"></u-gap>
<u-row>
<span>任务类型</span>
<span>{{$dict.getLabel("workTaskType",detail.type)}}</span>
<span>{{ $dict.getLabel("workTaskType", detail.type) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>开始时间</span>
<span>{{detail.createTime}}</span>
<span>{{ detail.createTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>截止时间</span>
<span style="color:#1365DD">{{detail.lastTime}}</span>
<span style="color:#1365DD">{{ detail.lastTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>剩余时间</span>
<span style="color:#1365DD">{{detail.overTimeStatus}}</span>
<span style="color:#1365DD">{{ detail.overTimeStatus }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>任务状态</span>
<span>{{$dict.getLabel("workTaskDoStatus",detail.status)}}</span>
<span>{{ $dict.getLabel("workTaskDoStatus", detail.status) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>执行说明</span>
<span>{{detail.doDescription}}</span>
<span>{{ detail.doDescription }}</span>
</u-row>
<u-gap height="16"></u-gap>
</div>
<div class="card" style="padding-top: 0">
<div class="label">任务说明</div>
<u-read-more close-text="展开" color="#999999" show-height="300">
<span>{{detail.taskDescription}}</span>
<span>{{ detail.taskDescription }}</span>
</u-read-more>
</div>
<div class="card" style="padding-top: 0" v-if="detail.fileList && detail.fileList.length">
@@ -51,9 +51,9 @@
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{item.name}}.{{item.postfix}}</span>
<span>{{ item.name }}.{{ item.postfix }}</span>
</label>
<span>{{(item.size/1024).toFixed(2)}}KB</span>
<span>{{ (item.size / 1024).toFixed(2) }}KB</span>
</u-row>
</div>
</div>
@@ -63,26 +63,27 @@
<template v-if="['0','1'].includes(isMine)">
<div class="card">
<div class="label">我的进度</div>
<text>已完成{{detail.myUserInfo.percent}}%</text>
<text>已完成{{ detail.myUserInfo.percent }}%</text>
<div class="progress">
<div class="pro-active" :style="{width:detail.myUserInfo.percent + '%'}"></div>
</div>
</div>
<div class="card" v-if="detail.processList.length">
<u-collapse>
<u-collapse-item :title="item.createDate && item.createDate.split(' ')[0]" v-for="(item, index) in detail.processList" :key="index">
<u-collapse-item :title="item.createDate && item.createDate.split(' ')[0]"
v-for="(item, index) in detail.processList" :key="index">
<template slot="info">
完成到<em>{{item.percent}}%</em>
完成到<em>{{ item.percent }}%</em>
</template>
{{item.remarks}}
{{ item.remarks }}
</u-collapse-item>
</u-collapse>
</div>
</template>
<template v-else>
<div class="card" v-for="(item,index) in detail.userInfoList" :key="index">
<div class="label">{{item.userName}}</div>
<text>已完成{{item.percent}}%</text>
<div class="label">{{ item.userName }}</div>
<text>已完成{{ item.percent }}%</text>
<div class="progress">
<div class="pro-active" :style="{width:item.percent + '%'}"></div>
</div>
@@ -93,8 +94,8 @@
<template v-if="index==2">
<div class="card" v-if="list.length">
<u-row justify="between" v-for="(item,index) in list" :key="index" class="item" @click="subDetail(item)">
<label class="title">{{item.taskTitle}}</label>
<label class="right">{{item.percent}}%
<label class="title">{{ item.taskTitle }}</label>
<label class="right">{{ item.percent }}%
<div class="arrow"></div>
</label>
</u-row>
@@ -103,20 +104,22 @@
</template>
<ai-back></ai-back>
<div class="footer" v-if="index==1 && detail.myUserInfo.taskRole == 1 && detail.myUserInfo.doStatus==0" @click="handleClick">去完成</div>
<div class="footer" v-if="index==1 && detail.myUserInfo.taskRole == 1 && detail.myUserInfo.doStatus==0"
@click="handleClick">去完成
</div>
<div class="footer" v-if="index==2" @click="createSubTask">创建子任务</div>
</div>
</template>
<script>
import AiTopFixed from "../../../components/AiTopFixed";
import AiBack from "../../../components/AiBack";
import AiEmpty from "../../../components/AiEmpty";
import {mapActions} from "vuex";
import AiTopFixed from "../../../components/AiTopFixed";
import AiBack from "../../../components/AiBack";
import AiEmpty from "../../../components/AiEmpty";
import {mapActions} from "vuex";
export default {
export default {
name: "detail",
components: {AiTopFixed, AiBack,AiEmpty},
components: {AiTopFixed, AiBack, AiEmpty},
data() {
return {
current: 1,
@@ -146,13 +149,13 @@
methods: {
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if([".jpg",".png",".gif"].includes(e.postfix.toLowerCase())){
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
}else {
this.previewFile({ ...e})
} else {
this.previewFile({...e})
}
},
getDetail() {
@@ -166,7 +169,7 @@
}
})
},
getList(){
getList() {
this.$http.post("/app/appworktaskinfo/list", null, {
params: {
parentTaskCode: this.detail.taskCode,
@@ -200,15 +203,15 @@
}
}
},
onShow(){
onShow() {
this.getDetail()
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.detail {
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
@@ -352,9 +355,9 @@
line-height: 44px;
overflow: hidden;
text-overflow: ellipsis;
display:-webkit-box;
-webkit-box-orient:vertical;
-webkit-line-clamp:2;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
@@ -440,5 +443,5 @@
font-size: 36px;
color: #FFFFFF;
}
}
}
</style>

View File

@@ -4,25 +4,25 @@
<u-row justify="between">
<div class="left">
<u-avatar :src="detail.avatar" v-if="detail.avatar"></u-avatar>
<div class="avatar" v-else>{{detail.name && detail.name.substr(-2)}}</div>
<div class="avatar" v-else>{{ detail.name && detail.name.substr(-2) }}</div>
<div class="info">
<div class="name">{{detail.name}}</div>
<div class="status">{{$dict.getLabel("workTaskRole",detail.taskRole)}}</div>
<div class="name">{{ detail.name }}</div>
<div class="status">{{ $dict.getLabel("workTaskRole", detail.taskRole) }}</div>
</div>
</div>
<!-- <div class="btn">-->
<!-- <img src="../static/tx.png" alt="">催办提醒-->
<!-- </div>-->
<!-- <div class="btn">-->
<!-- <img src="../static/tx.png" alt="">催办提醒-->
<!-- </div>-->
</u-row>
<u-gap height="32"></u-gap>
<u-row>
<div class="label">完成时间</div>
<div class="value">{{detail.finishTime}}</div>
<div class="value">{{ detail.finishTime }}</div>
</u-row>
<u-gap height="16"></u-gap>
<u-row>
<div class="label">逾期时间</div>
<div class="value" style="color: #FF4466">{{detail.overTimeStatus}}</div>
<div class="value" style="color: #FF4466">{{ detail.overTimeStatus }}</div>
</u-row>
<u-gap height="30"></u-gap>
</div>
@@ -31,9 +31,9 @@
<u-collapse v-for="(item,index) in detail.processList" :key="index">
<u-collapse-item :title="item.createDate && item.createDate.split(' ')[0]">
<template slot="info">
完成到<em>{{item.percent}}%</em>
完成到<em>{{ item.percent }}%</em>
</template>
{{item.remarks}}
{{ item.remarks }}
</u-collapse-item>
</u-collapse>
</div>
@@ -42,9 +42,9 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiBack from "../../../components/AiBack";
export default {
export default {
name: "finishDetail",
components: {AiBack},
data() {
@@ -55,7 +55,7 @@
},
onLoad(opt) {
this.id = opt.id
this.$dict.load("workTaskRole").then(_=>this.getDetail())
this.$dict.load("workTaskRole").then(_ => this.getDetail())
},
methods: {
getDetail() {
@@ -70,11 +70,11 @@
})
}
},
}
}
</script>
<style lang="scss" scoped>
.finish-detail {
.finish-detail {
min-height: 100%;
background-color: #F5F5F5;
@@ -182,5 +182,5 @@
}
}
}
}
</style>

View File

@@ -3,58 +3,58 @@
<div class="card">
<header>
<em>[子任务]</em>
{{detail.taskTitle}}
{{ detail.taskTitle }}
</header>
<u-gap height="16"></u-gap>
<u-row>
<span>任务类型</span>
<span>{{$dict.getLabel("workTaskType",detail.type)}}</span>
<span>{{ $dict.getLabel("workTaskType", detail.type) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>开始时间</span>
<span>{{detail.createTime}}</span>
<span>{{ detail.createTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>截止时间</span>
<span>{{detail.lastTime}}</span>
<span>{{ detail.lastTime }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>剩余时间</span>
<span style="color:#1365DD">{{detail.overTimeStatus}}</span>
<span style="color:#1365DD">{{ detail.overTimeStatus }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<span>任务状态</span>
<span style="color:#1365DD">{{$dict.getLabel("workTaskDoStatus",detail.status)}}</span>
<span style="color:#1365DD">{{ $dict.getLabel("workTaskDoStatus", detail.status) }}</span>
</u-row>
<u-gap height="16"></u-gap>
</div>
<div class="card" style="padding-top: 0">
<div class="label">任务说明</div>
<u-read-more close-text="展开" color="#999999" show-height="300">
<span>{{detail.taskDescription}}</span>
<span>{{ detail.taskDescription }}</span>
</u-read-more>
</div>
<div class="card">
<div class="label">当前进度</div>
<text>已完成{{detail.percent}}%</text>
<text>已完成{{ detail.percent }}%</text>
<div class="progress">
<div class="pro-active" :style="{width:detail.percent + '%'}"></div>
</div>
</div>
<div class="card" style="padding-top: 0" v-if="detail.userInfoList && detail.userInfoList.length">
<div class="label title">任务完成进度(<i>{{count}}</i>/{{detail.userInfoList.length}})</div>
<div class="label title">任务完成进度(<i>{{ count }}</i>/{{ detail.userInfoList.length }})</div>
<u-row justify="between" v-for="(item,index) in detail.userInfoList" :key="index" @click="finishDetail(item)">
<div>{{item.userName && item.userName.substr(-2)}}</div>
<div>{{ item.userName && item.userName.substr(-2) }}</div>
<u-row justify="between" class="item">
<text class="name">{{item.userName}}</text>
<text class="name">{{ item.userName }}</text>
<label class="right">
<span>已完成{{item.percent}}%</span>
<span>已完成{{ item.percent }}%</span>
<label class="arrow"></label>
</label>
</u-row>
@@ -75,9 +75,9 @@
</template>
<script>
import AiBack from "../../../components/AiBack";
import AiBack from "../../../components/AiBack";
export default {
export default {
name: "subDetail",
components: {AiBack},
data() {
@@ -95,9 +95,9 @@
this.$dict.load("workTaskType", "workTaskDoStatus").then(_ => this.getDetail())
},
methods: {
finishDetail({id}){
finishDetail({id}) {
uni.navigateTo({
url:"/pages/workTask/components/finishDetail?id=" + id
url: "/pages/workTask/components/finishDetail?id=" + id
})
},
confirm() {
@@ -121,18 +121,18 @@
}).then(res => {
if (res && res.data) {
this.detail = res.data
this.count = res.data?.userInfoList?.reduce((pre,cur)=>{
return pre + (cur.percent==100 ? 1 : 0)
},0)
this.count = res.data?.userInfoList?.reduce((pre, cur) => {
return pre + (cur.percent == 100 ? 1 : 0)
}, 0)
}
})
}
},
}
}
</script>
<style lang="scss" scoped>
.sub-detail {
.sub-detail {
min-height: 100%;
overflow-x: hidden;
background-color: #F5F5F5;
@@ -337,5 +337,5 @@
background: #1365DD;
}
}
}
}
</style>

View File

@@ -5,24 +5,24 @@
</ai-top-fixed>
<div class="list" v-if="list.length">
<div class="card" v-for="(item,index) in list" :key="index" @click="handleClick(item)">
<header>{{item.taskTitle}}</header>
<header>{{ item.taskTitle }}</header>
<u-gap height="24"></u-gap>
<u-row>
<text>任务类型</text>
<text>{{$dict.getLabel("workTaskType",item.type)}}</text>
<text>{{ $dict.getLabel("workTaskType", item.type) }}</text>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<text>截止时间</text>
<text>{{item.lastTime}}</text>
<text>{{ item.lastTime }}</text>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<text>剩余时间</text>
<text :style="{color:item.isOverTime==1?'#FF4466':'#1365DD'}">{{item.overTimeStatus}}</text>
<text :style="{color:item.isOverTime==1?'#FF4466':'#1365DD'}">{{ item.overTimeStatus }}</text>
</u-row>
<u-gap height="24"></u-gap>
<span>已完成{{item.percent}}%</span>
<span>已完成{{ item.percent }}%</span>
<u-gap height="16"></u-gap>
<div class="progress">
<div class="active" :style="{width: item.percent + '%'}"></div>
@@ -37,11 +37,11 @@
</template>
<script>
import AiTopFixed from "../../components/AiTopFixed";
import AiAdd from "../../components/AiAdd";
import AiEmpty from "../../components/AiEmpty";
import AiTopFixed from "../../components/AiTopFixed";
import AiAdd from "../../components/AiAdd";
import AiEmpty from "../../components/AiEmpty";
export default {
export default {
name: "workTask",
components: {AiTopFixed, AiAdd, AiEmpty},
data() {
@@ -148,11 +148,11 @@
this.current = 1
this.getList()
}
}
}
</script>
<style lang="scss" scoped>
.work-task {
.work-task {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 32px;
@@ -218,5 +218,5 @@
}
}
}
}
}
</style>

View File

@@ -9,7 +9,8 @@
<span class="icon">*</span>
<span> 审批意见:</span>
</span>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="opinion" class="textarea" clearable="false"> </textarea>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="opinion" class="textarea"
clearable="false"> </textarea>
<div class="clearn" @click="clearn">清空内容</div>
<div class="msg_length">
<span class="font">{{ opinion.length }}</span>
@@ -26,7 +27,8 @@
<span class="icon" v-if="item.mustFill == 1">*</span>
<span> {{ item.fieldName }}:</span>
</span>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="item.fieldValue" class="textarea" clearable="false"> </textarea>
<textarea :maxlength="150" placeholder="请输入审批意见" v-model="item.fieldValue" class="textarea"
clearable="false"> </textarea>
<div class="clearn" @click="clearn">清空内容</div>
<div class="msg_length">
<span class="font">{{ item.fieldValue.length }}</span>
@@ -42,7 +44,8 @@
<span> {{ item.fieldName }}:</span>
</div>
<div class="left">
<u-input type="text" @click="timeSelect(index)" class="right" placeholder="请选择" disabled v-model="item.fieldValue"></u-input>
<u-input type="text" @click="timeSelect(index)" class="right" placeholder="请选择" disabled
v-model="item.fieldValue"></u-input>
</div>
</div>
</div>
@@ -56,7 +59,8 @@
<!-- 单个文件最大10MB.zip.rar.doc.docx.xls.xlsx.ppt.pptx.pdf.txt.jpg.png格式 -->
<div class="upload">
<div class="info">
<ai-uploader multiple @list="(v) => (annex = v)" :limit="9" action="/admin/file/add2" type="file" placeholder="添加文件" preview />
<ai-uploader multiple @list="(v) => (annex = v)" :limit="9" action="/admin/file/add2" type="file"
placeholder="添加文件" preview/>
</div>
</div>
</div>
@@ -67,7 +71,7 @@
<text class="img_text">(最多9张)</text>
<div class="upload">
<div class="info">
<ai-uploader multiple @list="(v) => (picture = v)" :limit="9" :size="2097152" preview />
<ai-uploader multiple @list="(v) => (picture = v)" :limit="9" :size="2097152" preview/>
</div>
</div>
</div>
@@ -76,8 +80,8 @@
<div class="btn" @click="btn">确定</div>
<!-- 日期选择器 -->
<u-calendar v-model="show" :mode="mode" @change="calendar" />
<back />
<u-calendar v-model="show" :mode="mode" @change="calendar"/>
<back/>
</div>
</template>
@@ -119,9 +123,11 @@ export default {
// 监听
watch: {},
// 实例创建后
onShow() {},
onShow() {
},
// 实例渲染后
mounted() {},
mounted() {
},
// 方法
methods: {
timeSelect(index) {

View File

@@ -6,7 +6,8 @@
<p>审批通过:</p>
<div class="save">
<div style="display:inline">[{{ this.list.tableInfo.tableName }}]已签署完成,</div>
<ai-image preview :file="list.pdfFile" style="display:inline-block;margin-left:4px ;"><span class="clicksave">点击查看和保存</span> </ai-image>
<ai-image preview :file="list.pdfFile" style="display:inline-block;margin-left:4px ;"><span class="clicksave">点击查看和保存</span>
</ai-image>
</div>
</div>
@@ -19,7 +20,8 @@
<div class="people_msg">
<!-- 圆形头像 -->
<div class="avatar">
<span v-if="list.createUserAvatar"><img :src="list.createUserAvatar" alt="" style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-if="list.createUserAvatar"><img :src="list.createUserAvatar" alt=""
style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-else> {{ $formatName(list.createUserName) }}</span>
</div>
@@ -40,7 +42,7 @@
<!-- 已通过 -->
<div class="people_status_agree" v-if="list.approvalStatus == 1">
<img src="./components/people_status_agree.png" alt="" />
<img src="./components/people_status_agree.png" alt=""/>
</div>
<!-- 被驳回 -->
@@ -72,7 +74,7 @@
<div class="item_info">
<span class="annexs">附件资料</span>
<div class="img_text" v-for="(item, indexs) in list.annexs" :key="indexs">
<ai-image :src="item.annexFile.url" preview />
<ai-image :src="item.annexFile.url" preview/>
<span class="text">{{ item.annexName }}</span>
</div>
</div>
@@ -81,20 +83,24 @@
</div>
<!-- tabs栏 -->
<u-tabs class="tabs" :list="list_tabs" height="96" active-color="#1365dd" inactive-color="#999" bar-width="374" font-size="30" :is-scroll="false" :current="current" @change="change"></u-tabs>
<u-tabs class="tabs" :list="list_tabs" height="96" active-color="#1365dd" inactive-color="#999" bar-width="374"
font-size="30" :is-scroll="false" :current="current" @change="change"></u-tabs>
<!-- 表单申请的折叠窗 -->
<div style="background-color:#fff">
<div v-if="current == 0" class="collapse">
<u-collapse event-type="close" :arrow="true" :accordion="true">
<u-collapse-item v-if="item.length > 0" v-for="(item, index) in inforlist" :title="item[0].groupName" :key="index">
<u-collapse-item v-if="item.length > 0" v-for="(item, index) in inforlist" :title="item[0].groupName"
:key="index">
<div v-for="(items, indexs) in item" :key="indexs">
<div class="item_msg">
<!-- -->
<span class="msg_lef">{{ items.fieldName }}</span>
<!-- -->
<!-- 字典值 items.dictionaryCode -->
<span class="msg_lright" v-if="items.fieldDataType != 5">{{ $dict.getLabel(items.dictionaryCode, items.fieldValue) }}</span>
<span class="msg_lright" v-if="items.fieldDataType != 5">{{
$dict.getLabel(items.dictionaryCode, items.fieldValue)
}}</span>
<span class="msg_lright" v-else>
<span v-for="(itemL, indexL) in items.fieldValue" :key="indexL"
>{{ $dict.getLabel(items.dictionaryCode, itemL) }}
@@ -120,12 +126,13 @@
<div class="item-left-ava-icon">
<!-- 头像 -->
<div class="avatar" v-if="item.userName">
<span v-if="item.stepAvatar"><img :src="item.stepAvatar" alt="" style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-if="item.stepAvatar"><img :src="item.stepAvatar" alt=""
style="width: 100%;height: 100%;border-radius:50%"/></span>
<span v-else> {{ $formatName(item.userName) }}</span>
</div>
<div class="avatar" v-else-if="item.title == '抄送'">
<img src="./components/Profile_Picture.png" alt="" />
<img src="./components/Profile_Picture.png" alt=""/>
</div>
<div class="avatar" v-else>
@@ -134,14 +141,14 @@
<!-- 图标 发起 抄送和审批通过图标 -->
<div class="icon-yes" v-if="item.stepType == 1 || item.stepType == 0 || item.stepType == 3">
<img src="./components/agree.png" alt="" />
<img src="./components/agree.png" alt=""/>
</div>
<!-- 审批拒绝图标 -->
<div class="" v-else-if="item.stepType == 2"></div>
<div class="icon-no" v-else>
<img src="./components/clearn.png" />
<img src="./components/clearn.png"/>
</div>
</div>
@@ -191,7 +198,8 @@
<div class="examine_docx1">
<!-- 图片 -->
<div class="examine_img" v-if="item.pictureFiles && item.pictureFiles.length > 0" style="">
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id" style="width: 65px;height: 75px;float: left;margin-left: 6px;margin-bottom: 4px;overflow: hidden;" />
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id"
style="width: 65px;height: 75px;float: left;margin-left: 6px;margin-bottom: 4px;overflow: hidden;"/>
</div>
<!-- 附件资料 -->
@@ -214,7 +222,8 @@
<div class="examine_docx1">
<!-- 图片 -->
<div class="examine_img" v-if="item.pictureFiles && item.pictureFiles.length > 0" style="">
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id" style="width: 69px;height: 75px;float: left;margin-left: 4px;margin-bottom: 4px;overflow: hidden;" />
<ai-image preview :src="pic.url" v-for="pic in item.pictureFiles" :key="pic.id"
style="width: 69px;height: 75px;float: left;margin-left: 4px;margin-bottom: 4px;overflow: hidden;"/>
</div>
<!-- 附件资料 -->
@@ -244,18 +253,18 @@
<div class="agree" @click="agree(1)">同意</div>
</div>
<back />
<back/>
</div>
</template>
<script>
import back from '../../components/AiBack'
import AiImage from '../../components/AiImage'
import { mapActions } from 'vuex'
import {mapActions} from 'vuex'
export default {
name: 'workonlineDetail',
components: { AiImage, back },
components: {AiImage, back},
computed: {
canApproval() {
return this.listType == 0

View File

@@ -1,8 +1,10 @@
<template>
<div class="closemsg">
<img :src="imgSrc" alt="" />
<img :src="imgSrc" alt=""/>
<text>{{ text }}</text>
<u-button type="primary" :custom-style="{ width: '100%', borderRadius: '4px', marginTop: '48px' }" @click="goBack">{{ btnText }} </u-button>
<u-button type="primary" :custom-style="{ width: '100%', borderRadius: '4px', marginTop: '48px' }" @click="goBack">
{{ btnText }}
</u-button>
<back></back>
</div>
</template>
@@ -12,7 +14,7 @@ import back from '../../components/AiBack'
export default {
name: 'CloseMsg',
components: { back },
components: {back},
data() {
return {
flag: true,
@@ -38,7 +40,7 @@ export default {
return this.flag ? '确定' : '我知道了'
},
imgSrc() {
return this.flag ? this.$cdn+'other/' + 'kztcg.png' : this.$cdn+'other/' + 'kztsb.png'
return this.flag ? this.$cdn + 'other/' + 'kztcg.png' : this.$cdn + 'other/' + 'kztsb.png'
},
},
}

View File

@@ -2,7 +2,8 @@
<div class="workonline">
<!-- 顶部搜索 -->
<div class="search">
<u-search class="serach_content" placeholder="请输入标题" :show-action="false" v-model="keyword" @clear="search" @search="search"></u-search>
<u-search class="serach_content" placeholder="请输入标题" :show-action="false" v-model="keyword" @clear="search"
@search="search"></u-search>
</div>
<u-tabs :list="list" :is-scroll="false" :current="currentType" @change="change"></u-tabs>
@@ -22,10 +23,14 @@
<span class="item_info">审批进度</span>
<!-- 申请类型 ing -->
<span class="business_status" v-if="item.approvalStatus == 0"> {{ $dict.getLabel('listApprovalStatusHb', item.approvalStatus) }}</span>
<span class="business_status" v-if="item.approvalStatus == 0"> {{
$dict.getLabel('listApprovalStatusHb', item.approvalStatus)
}}</span>
<!-- end -->
<span class="business_status_blue" v-if="item.approvalStatus == 1"> {{ $dict.getLabel('listApprovalStatusHb', item.approvalStatus) }}</span>
<span class="business_status_blue" v-if="item.approvalStatus == 1"> {{
$dict.getLabel('listApprovalStatusHb', item.approvalStatus)
}}</span>
<!-- false -->
<span class="business_status_gray" v-if="item.approvalStatus == 2">
@@ -49,11 +54,11 @@
<span class="icon">
<!-- ing -->
<img src="./components/ing.png" alt="" v-if="item.approvalStatus == 0" />
<img src="./components/ing.png" alt="" v-if="item.approvalStatus == 0"/>
<!-- end -->
<img src="./components/end.png" alt="" v-if="item.approvalStatus == 1" />
<img src="./components/end.png" alt="" v-if="item.approvalStatus == 1"/>
<!-- false -->
<img src="./components/reject.png" alt="" v-if="item.approvalStatus == 2" />
<img src="./components/reject.png" alt="" v-if="item.approvalStatus == 2"/>
</span>
</div>
</div>
@@ -69,10 +74,10 @@ export default {
data() {
return {
list: [
{ name: '待我审批', type: 0 },
{ name: '我已审批', type: 1 },
{ name: '抄送我的', type: 3 },
{ name: '超时督办', type: 4 },
{name: '待我审批', type: 0},
{name: '我已审批', type: 1},
{name: '抄送我的', type: 3},
{name: '超时督办', type: 4},
],
currentType: 0, // 0待我审批 1已审批 2抄送我的 3超时
keyword: '',
@@ -95,7 +100,8 @@ export default {
})
},
// 实例渲染后
mounted() {},
mounted() {
},
// 方法
methods: {
getList() {

View File

@@ -469,7 +469,7 @@ export default {
.u-checkbox__icon-wrap, .u-radio__icon-wrap {
position: absolute;
top: 4 rpx;
top: 4px;
}
.u-radio__label, .u-checkbox__label {

View File

@@ -0,0 +1,194 @@
<template>
<div class="template-wrapper">
<div class="form-list">
<div
class="form-list__item"
@click="toAdd(index)"
:style="{'background-image': `url(${$cdn}askform/${index + 1}.png)`}"
v-for="(item, index) in itemList"
:key="index">
<h2>{{ item.name }}</h2>
<div>立即创建</div>
</div>
</div>
<div class="template" v-if="list.length">
<h2>共享模板</h2>
<div class="template-list">
<div class="template-item" v-for="(item, index) in list" :key="index" hover-class="bg-hover"
@click="quote(item.id)">
<image :src="`${$cdn}askform/6.png`"/>
<h2>{{ item.title }}</h2>
<u-icon name="arrow-right" color="#E1E2E3"/>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'addList',
label: '新建项目',
data() {
return {
itemList: [{
name: '问卷调查'
}, {
name: '考试测评'
}, {
name: '报名登记'
}, {
name: '满意调查'
}, {
name: '投票评选'
}],
list: []
}
},
mounted() {
this.getList()
},
methods: {
toAdd(type) {
this.$emit('change', {
type: 'AddForm',
params: {
type
}
})
},
quote(id) {
this.$emit('change', {
type: 'AddForm',
params: {
id,
isQuote: 1
}
})
},
getList() {
this.$http.post(`/app/appquestionnairetemplate/list`, null, {
params: {
current: 1,
templateType: 1,
size: 10000
}
}).then(res => {
if (res.code == 0) {
this.list = res.data.records
}
})
}
}
}
</script>
<style lang="scss" scoped>
.template-wrapper {
padding-bottom: 120 rpx;
.template {
margin: 32px 32px 0;
background: #fff;
border-radius: 8px;
overflow: hidden;
& > h2 {
height: 88px;
line-height: 88px;
padding: 0 24px;
color: #333333;
font-size: 30px;
}
.template-item {
display: flex;
align-items: center;
height: 104px;
padding: 0 24px;
border-bottom: 1px solid #D8DDE6;
&:active {
background-color: #eee;
}
&:last-child {
border: none;
}
image {
width: 36px;
height: 42px;
}
i {
font-size: 30px;
color: #E1E2E3;
}
h2 {
flex: 1;
padding: 0 18px;
color: #333333;
font-size: 28px;
font-weight: normal;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
.form-list {
display: flex;
flex-wrap: wrap;
padding: 0 32px 0;
div {
box-sizing: border-box;
}
.form-list__item {
width: calc(50% - 13px);
height: 216px;
margin: 32px 24px 0 0;
padding: 40px 20px 52px;
background-color: #FFFFFF;
border-radius: 8px;
background-size: 100% 100%;
&:active {
background-color: #eee;
}
&:nth-of-type(2n) {
margin-right: 0;
}
div {
width: 148px;
height: 48px;
line-height: 48px;
text-align: center;
color: #fff;
font-size: 28px;
background: #6BA1F9;
border-radius: 24px;
}
h2 {
margin-bottom: 32px;
padding-left: 10px;
color: #333333;
font-weight: 700;
font-size: 32px;
}
}
}
}
</style>

View File

@@ -2,21 +2,24 @@
<div class="form-config">
<div class="config-group">
<div class="config-item">
<u-input class="form-maintitle" :maxlength="200" v-model="config.label" :placeholder="`请输入${config.fixedLabel||''}标题 ${config.required ? '(必填)' : ''}`" placeholder-style="color: #999999; font-weight: 600" />
<u-input class="form-maintitle" :maxlength="200" v-model="config.label"
:placeholder="`请输入${config.fixedLabel||''}标题 ${config.required ? '(必填)' : ''}`"
placeholder-style="color: #999999; font-weight: 600"/>
</div>
<div class="config-item__select--wrapper" v-if="['radio', 'select', 'checkbox'].includes(config.type)">
<div class="config-item__select" v-for="(item, index) in config.options" :key="index">
<image class="config-icon" :src="`${$cdn}askform/del.png`" @click="removeOptions(index)" />
<image class="config-icon" :src="`${$cdn}askform/del.png`" @click="removeOptions(index)"/>
<div class="config-item__upload" v-if="config.type !== 'select'" @click="upload(index)">
<u-icon color="#8c9dc3" name="plus" v-if="!item.img.length"></u-icon>
<image v-else :src="item.img[0].url" />
<image v-else :src="item.img[0].url"/>
</div>
<div class="textarea">
<textarea type="textarea" placeholder-style="color: #CDCDCF" :auto-height="true" v-model="item.label" :maxlength="100" placeholder="请输入选项" />
<textarea type="textarea" placeholder-style="color: #CDCDCF" :auto-height="true" v-model="item.label"
:maxlength="100" placeholder="请输入选项"/>
</div>
</div>
<div class="config-item__select config-item__select--add" @click="addOptions">
<image class="config-icon" :src="`${$cdn}askform/zj.png`" />
<image class="config-icon" :src="`${$cdn}askform/zj.png`"/>
<span>添加选项</span>
</div>
</div>
@@ -27,7 +30,7 @@
<span>说明文字</span>
</div>
<div class="config-item__right">
<u-input v-model="config.placeholder" placeholder="请输入说明文字" input-align="right" />
<u-input v-model="config.placeholder" placeholder="请输入说明文字" input-align="right"/>
</div>
</div>
<div class="config-item">
@@ -35,7 +38,8 @@
<span>是否必填</span>
</div>
<div class="config-item__right">
<u-switch v-model="config.required" active-value="1" inactive-value="0" :size="40" active-color="#1088F9"></u-switch>
<u-switch v-model="config.required" active-value="1" inactive-value="0" :size="40"
active-color="#1088F9"></u-switch>
</div>
</div>
<div class="config-item" v-if="!['upload'].includes(config.type)">
@@ -51,10 +55,11 @@
<span>正确答案</span>
</div>
<div class="config-item__right">
<u-input v-model="config.answer" placeholder="请输入正确答案" input-align="right" />
<u-input v-model="config.answer" placeholder="请输入正确答案" input-align="right"/>
</div>
</div>
<div class="config-item" v-if="['radio', 'select'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item"
v-if="['radio', 'select'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item__left">
<span>正确答案</span>
</div>
@@ -63,22 +68,25 @@
<u-icon name="arrow-down-fill" color="#c0c4cc" size="24"></u-icon>
</div>
</div>
<div class="config-item config-item__checkbox" v-if="config.isShowPoints && ['radio', 'select', 'checkbox'].includes(config.type)">
<div class="config-item config-item__checkbox"
v-if="config.isShowPoints && ['radio', 'select', 'checkbox'].includes(config.type)">
<div class="config-item__left">
<span>计分方式</span>
</div>
<div class="config-item__right" @click="isShowType = true">
<span>{{ pointTypeName ? pointTypeName : '请选择' }}</span>
<u-icon name="arrow-right" color="#E1E2E3" />
<u-icon name="arrow-right" color="#E1E2E3"/>
</div>
</div>
<div class="config-item config-item__answer config-item__checkbox" v-if="['checkbox'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item config-item__answer config-item__checkbox"
v-if="['checkbox'].includes(config.type) && config.isShowPoints && config.pointType === '0'">
<div class="config-item__left">
<span>正确答案</span>
</div>
<div class="config-item__right">
<u-checkbox-group wrap @change="onCheckboxChange">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label" v-for="(field, i) in config.options" :key="i">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label"
v-for="(field, i) in config.options" :key="i">
<span>{{ field.label }}</span>
</u-checkbox>
</u-checkbox-group>
@@ -89,7 +97,7 @@
<span>本题分值</span>
</div>
<div class="config-item__right">
<u-input v-model="config.points" type="number" placeholder="请输入本题分值" input-align="right" />
<u-input v-model="config.points" type="number" placeholder="请输入本题分值" input-align="right"/>
</div>
</div>
<div v-if="config.isShowPoints && config.pointType === '1'">
@@ -98,15 +106,16 @@
<span>{{ item.label }}</span>
</div>
<div class="config-item__right">
<u-input v-model="item.point" placeholder="请输入分值" input-align="right" />
<u-input v-model="item.point" placeholder="请输入分值" input-align="right"/>
</div>
</div>
</div>
<div class="config-item config-item__point" v-if="config.isShowPoints && config.pointType === '2'">
<u-checkbox-group wrap @change="onCheckboxChange">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label" v-for="(field, i) in config.options" :key="i">
<u-checkbox v-model="field.checked" :name="field.label" v-if="field.label"
v-for="(field, i) in config.options" :key="i">
<span>{{ field.label }}</span>
<u-input v-model="field.point" type="number" placeholder="请输入分值" input-align="right" />
<u-input v-model="field.point" type="number" placeholder="请输入分值" input-align="right"/>
</u-checkbox>
</u-checkbox-group>
</div>
@@ -115,12 +124,14 @@
<span>全部答对</span>
</div>
<div class="config-item__right">
<u-input v-model="config.points" type="number" placeholder="请输入全部答对分值" input-align="right" />
<u-input v-model="config.points" type="number" placeholder="请输入全部答对分值" input-align="right"/>
</div>
</div>
</div>
<u-select :list="config.options" :default-value="defaultAnswer" value-name="value" label-name="label" v-model="isShowAnswer" @confirm="answerChange"></u-select>
<u-select :list="config.pointDict" :default-value="defaultType" value-name="dictValue" label-name="dictName" v-model="isShowType" @confirm="pointTypeChange"></u-select>
<u-select :list="config.options" :default-value="defaultAnswer" value-name="value" label-name="label"
v-model="isShowAnswer" @confirm="answerChange"></u-select>
<u-select :list="config.pointDict" :default-value="defaultType" value-name="dictValue" label-name="dictName"
v-model="isShowType" @confirm="pointTypeChange"></u-select>
<div class="add-form__footer">
<div @click="back">
<span>取消</span>
@@ -131,20 +142,20 @@
</template>
<script>
import { components } from './config'
import {components} from './config'
export default {
props: ['filed', 'index', 'filedType'],
data () {
data() {
return {
isShowType: false,
isShowAnswer: false,
config: {
}
config: {}
}
},
mounted () {
mounted() {
if (this.index !== '') {
this.config = this.filed
return false
@@ -155,19 +166,19 @@ export default {
},
computed: {
pointTypeName () {
pointTypeName() {
if (!this.config.pointDict) return ''
return this.config.pointDict.filter(v => v.dictValue === this.config.pointType)[0].dictName
},
defaultType () {
defaultType() {
if (!this.config.pointType) return [0]
return [Number(this.config.pointType)]
},
defaultAnswer () {
defaultAnswer() {
if (!this.config.answer) return [0]
let index = 0
@@ -184,20 +195,20 @@ export default {
},
methods: {
answerChange (e) {
answerChange(e) {
this.config.answer = e[0].label
},
pointTypeChange (e) {
pointTypeChange(e) {
console.log(e)
this.config.pointType = e[0].value
},
onCheckboxChange (e) {
onCheckboxChange(e) {
this.config.answer = e
},
upload (index) {
upload(index) {
let params = {
count: 1,
sizeType: ['compressed'],
@@ -217,7 +228,7 @@ export default {
uni.chooseImage(params)
},
uploadFile (img, index) {
uploadFile(img, index) {
uni.showLoading({title: '上传中'})
let formData = new FormData()
formData.append('file', img)
@@ -233,7 +244,7 @@ export default {
})
},
removeOptions (index) {
removeOptions(index) {
const len = this.config.options.length
const label = this.config.options[index].label
if (len === 2) {
@@ -254,11 +265,11 @@ export default {
this.config.options.splice(index, 1)
},
back () {
back() {
this.$emit('back')
},
confirm () {
confirm() {
uni.$emit('filedConfig', {
config: this.config,
index: this.index === '' ? '-1' : this.index
@@ -267,11 +278,11 @@ export default {
this.back()
},
addOptions () {
addOptions() {
const len = this.config.options.length
let label = `选项${len + 1}`
const index= this.config.options.findIndex(v => label === v.label)
const index = this.config.options.findIndex(v => label === v.label)
if (index > -1) {
label = `新选项${len + 1}`
}
@@ -289,7 +300,7 @@ export default {
</script>
<style lang="scss" scoped>
.form-config {
.form-config {
box-sizing: border-box;
padding-bottom: 130px;
@@ -383,7 +394,7 @@ export default {
font-size: 28px;
span {
max-width: 400rpx;
max-width: 400 rpx;
line-height: 1.2;
}
}
@@ -421,7 +432,8 @@ export default {
padding: 20px 0;
.config-item__left {
margin-bottom: 32rpx;
margin-bottom: 32 rpx;
span {
word-break: break-all;
color: #333;
@@ -449,6 +461,7 @@ export default {
// justify-content: flex-end;
}
}
.config-item__point {
height: auto;
padding: 0;
@@ -530,5 +543,5 @@ export default {
}
}
}
}
}
</style>

View File

@@ -5,14 +5,14 @@
<div class="setting-item">
<div class="setting-item__left">
<span>截止时间</span>
<image :src="`${$cdn}askform/bz.png`" @click="tips = '表单截止后,用户打开表单会提示此表单已结束' , isShowModal = true" />
<image :src="`${$cdn}askform/bz.png`" @click="tips = '表单截止后,用户打开表单会提示此表单已结束' , isShowModal = true"/>
</div>
<div class="setting-item__right">
<u-radio-group v-model="periodValidityType" active-color="#1088F9">
<u-radio name="0" label="永久有效" style="padding-right: 20rpx;">永久有效</u-radio>
<u-radio name="1" label="自定义时间">自定义时间</u-radio>
</u-radio-group>
<u-icon name="arrow-right" color="#E1E2E3" />
<u-icon name="arrow-right" color="#E1E2E3"/>
</div>
</div>
<div class="setting-item" v-if="periodValidityType === '1'" @click="isShowTime = true">
@@ -21,13 +21,13 @@
</div>
<div class="setting-item__right">
<span>{{ periodValidityEndTime }}</span>
<u-icon name="arrow-right" color="#E1E2E3" />
<u-icon name="arrow-right" color="#E1E2E3"/>
</div>
</div>
<div class="setting-item">
<div class="setting-item__left">
<span>匹配客户方式</span>
<image :src="`${$cdn}askform/bz.png`" @click="tips = '将参与活动的微信客户和企业微信客户匹配' , isShowModal = true" />
<image :src="`${$cdn}askform/bz.png`" @click="tips = '将参与活动的微信客户和企业微信客户匹配' , isShowModal = true"/>
</div>
<div class="setting-item__right">
<span>客户微信ID匹配</span>
@@ -36,7 +36,7 @@
<div class="setting-item">
<div class="setting-item__left">
<span>提交次数</span>
<image :src="`${$cdn}askform/bz.png`" @click="tips = '此功能发布后不可修改' , isShowModal = true" />
<image :src="`${$cdn}askform/bz.png`" @click="tips = '此功能发布后不可修改' , isShowModal = true"/>
</div>
<div class="setting-item__right">
<u-radio-group v-model="commitType" active-color="#1088F9">
@@ -71,7 +71,8 @@
<div @click="confirm">{{ type === 'edit' ? '发布' : '确定' }}</div>
</div>
<u-modal v-model="isShowModal" :content="tips"></u-modal>
<u-picker mode="time" v-model="isShowTime" :show-time-tag="true" @close="isShowTime = false" @confirm="onTimeChange" :params="params"></u-picker>
<u-picker mode="time" v-model="isShowTime" :show-time-tag="true" @close="isShowTime = false" @confirm="onTimeChange"
:params="params"></u-picker>
</div>
</template>
@@ -79,7 +80,7 @@
export default {
props: ['id', 'formConfig', 'type'],
data () {
data() {
return {
params: {
year: true,
@@ -101,7 +102,7 @@ export default {
}
},
mounted () {
mounted() {
if (this.id) {
this.id = this.id
this.getInfo(this.id)
@@ -120,15 +121,15 @@ export default {
},
methods: {
onTimeChange (e) {
onTimeChange(e) {
this.periodValidityEndTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:${e.second}`
},
back () {
back() {
this.$emit('back')
},
getInfo (id) {
getInfo(id) {
this.$http.post(`/app/appquestionnairetemplate/queryDetailById?id=${id}`).then(res => {
if (res.code == 0) {
this.periodValidityType = res.data.periodValidityType
@@ -145,7 +146,7 @@ export default {
})
},
publish () {
publish() {
this.$http.post(`/app/appquestionnairetemplate/release`, null, {
params: {
commitType: this.commitType,
@@ -169,7 +170,7 @@ export default {
})
},
confirm () {
confirm() {
if (this.type === 'edit') {
this.publish()
@@ -191,7 +192,7 @@ export default {
</script>
<style lang="scss" scoped>
.form-setting {
.form-setting {
padding: 0 20px;
.add-form__footer {
@@ -308,5 +309,5 @@ export default {
}
}
}
}
}
</style>

View File

@@ -27,7 +27,7 @@
<span>{{ $dict.getLabel('questionnaireStatus', item.status) }}</span>
</div>
</div>
<div style="height: 30rpx"></div>
<u-gap/>
<AiEmpty v-if="!list.length && isMore"></AiEmpty>
</scroll-view>
<u-popup v-model="isShow" :closeable="false" mode="bottom" :z-index="11">

View File

@@ -0,0 +1,163 @@
export const components = [
{
type: 'radio',
label: '单选',
fixedLabel: '单选',
value: '',
points: '',
icon: 'iconradio',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'checkbox',
label: '多选',
fixedLabel: '多选',
points: '',
icon: 'iconcheck_box',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: [],
value: [],
pointType: '0',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
},
{
dictName: '答对几项得几分,答错不得分',
dictValue: '2'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: [],
checked: false
},
{
label: '选项2',
point: '',
value: '',
img: [],
checked: false
}
],
title: ''
},
{
type: 'select',
label: '单下拉框',
fixedLabel: '单下拉框',
value: '',
points: '',
icon: 'iconSelect',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
pointType: '0',
placeholder: '请选择',
pointDict: [
{
dictName: '此题有唯一答案和分值',
dictValue: '0'
},
{
dictName: '每个选项都有对应分值',
dictValue: '1'
}
],
options: [
{
label: '选项1',
value: '',
point: '',
img: []
},
{
label: '选项2',
value: '',
point: '',
img: []
}
],
title: ''
},
{
type: 'input',
label: '单行填空',
fixedLabel: '单行填空',
value: '',
pointType: '0',
icon: 'icontext_box',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
placeholder: '请输入...',
answer: ''
},
{
type: 'textarea',
label: '多行填空',
fixedLabel: '多行填空',
pointType: '0',
icon: 'icontext_area',
points: '',
isShowPoints: false,
required: true,
hasAnswer: false,
answer: '',
placeholder: '请输入...',
value: ''
},
{
type: 'upload',
label: '上传图片',
fixedLabel: '上传图片',
value: '',
icon: 'iconpic',
isShowPoints: false,
points: '',
required: true,
hasAnswer: false,
answer: ''
}
];

View File

@@ -59,7 +59,7 @@ import meetingList from './meetingList';
export default {
name: "AppMeetingNotice",
appName: "会议通知",
components: { addMeeting, belongToMe, detail, meetingList},
components: {addMeeting, belongToMe, detail, meetingList},
data() {
return {
meetingList: [],
@@ -96,9 +96,9 @@ export default {
"3": "common/toDo.png",
}[status]
},
handleDetail({id}){
handleDetail({id}) {
uni.navigateTo({
url:"/apps/AppMeetingNotice/detail?id=" + id
url: "/apps/AppMeetingNotice/detail?id=" + id
})
},
getData() {
@@ -114,12 +114,12 @@ export default {
}
})
},
handleClick(index){
handleClick(index) {
let url
if(index==0 || index==2){
url="/apps/AppMeetingNotice/meetingList?index=" + index
}else if(index==1){
url="/apps/AppMeetingNotice/belongToMe"
if (index == 0 || index == 2) {
url = "/apps/AppMeetingNotice/meetingList?index=" + index
} else if (index == 1) {
url = "/apps/AppMeetingNotice/belongToMe"
}
uni.navigateTo({url})
},

View File

@@ -128,23 +128,23 @@ export default {
},
onLoad(opt) {
if(opt.id) {
if (opt.id) {
this.form.id = opt.id
this.getDetail()
}
this.$nextTick(()=>{
this.$nextTick(() => {
let date = new Date();
this.form.startTime.time = date.getHours()?.toString()?.padStart(2, "0") + ":" + date.getMinutes()?.toString()?.padStart(2, "0")
this.form.startTime.year = date.getFullYear()
this.form.startTime.month = (date.getMonth()+1)?.toString()?.padStart(2, "0")
this.form.startTime.month = (date.getMonth() + 1)?.toString()?.padStart(2, "0")
this.form.startTime.day = date.getDate()
this.form.startTime.weekday = '日一二三四五六'.charAt(date.getDay())
this.form.endTime = {...this.form.startTime}
})
},
onShow(){
onShow() {
document.title = "新增会议";
this.$dict.load("meetingNoticeBefore", "meetingNoticeAfter");
},

View File

@@ -10,12 +10,16 @@
<u-row justify="between">
<div class="time">
<span>{{ item.startTime|formatTime }}</span>
<span>{{ item.startTime|formatDate(0) }}{{ item.startTime|formatDate(1) }}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
<span>{{ item.startTime|formatDate(0) }}{{
item.startTime|formatDate(1)
}}{{ item.startTime|formatDate(2) }} {{ item.startTime|formatWeek }}</span>
</div>
<div class="arrow"></div>
<div class="time">
<span>{{ item.endTime|formatTime }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{ item.endTime|formatWeek }}</span>
<span>{{ item.endTime|formatDate(0) }}{{ item.endTime|formatDate(1) }}{{ item.endTime|formatDate(2) }} {{
item.endTime|formatWeek
}}</span>
</div>
</u-row>
<u-row class="info">
@@ -63,7 +67,7 @@ export default {
}
},
onShow() {
document.title="我发起的";
document.title = "我发起的";
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {

View File

@@ -0,0 +1,561 @@
<template>
<div class="detail" v-if="pageShow">
<template v-if="!list">
<div class="card">
<header>{{ detail.title }}</header>
<u-gap height="16"></u-gap>
<u-row v-if="detail.createUserId">
<!-- <u-avatar :src="$cdn + 'common/xzh.png'" v-if="false"></u-avatar>-->
<div class="u-avatar__img">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</div>
<span class="user-name">
<AiOpenData type="userName" :openid="detail.createUserId"></AiOpenData>
</span>
</u-row>
<u-gap height="32"></u-gap>
<u-row>
<img :src="$cdn + 'common/meeting.png'" alt="">
<span :style="{color:color(detail.status)}">{{ $dict.getLabel('meetStatus', detail.status) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row>
<img :src="$cdn + 'common/date.png'" alt="">
<span>{{
detail.startTime && detail.startTime.substr(0, 16)
}} {{ detail.endTime && detail.endTime.substr(0, 16) }}</span>
</u-row>
<u-gap height="8"></u-gap>
<u-row style="align-items: start;flex-wrap: nowrap;">
<img :src="$cdn + 'common/location.png'" alt="">
<span>{{ detail.address }}</span>
</u-row>
</div>
<div class="card">
<span>{{ detail.content }}</span>
</div>
<div class="card" v-if="detail.files && detail.files.length">
<div class="label">相关附件</div>
<div class="file" v-for="(item,index) in detail.files" @click="preFile(item)" :key="index">
<u-row justify="between">
<label class="left">
<img :src="$cdn + 'common/appendix.png'" alt="">
<span>{{ item.fileName }}.{{ item.postfix }}</span>
</label>
<span>{{ item.fileSizeStr }}</span>
</u-row>
</div>
</div>
<div class="card item-wrap">
<u-row justify="between">
<span>参会人</span>
<label class="right" @click="list=true">
查看全部<em>{{ detail.attendees && detail.attendees.length }}</em>
<div class="right-arrow"></div>
</label>
</u-row>
</div>
<div class="footer cancel" v-if="detail.status==1 && detail.createUserId == user.id" @click="handleCancel">取消会议
</div>
<template v-else>
<div class="footer" v-if="['1','2'].includes(detail.status) && ['0','3'].includes(detail.joinStatus)">
<div class="leave" @click="updateStatus(0)">
<img :src="$cdn + 'sass/leave.png'" alt="">请假
</div>
<div @click="toDo" class="leave">
<img :src="$cdn + 'sass/toBe.png'" alt="">待定
</div>
<div @click="updateStatus(1)">确认会议</div>
</div>
<!-- <div class="footer" v-if="['1','2'].includes(detail.status) && detail.joinStatus!=0">-->
<!-- <label>{{ detail.joinStatus|transform }}</label>-->
<!-- <img :src="$cdn + tag(detail.joinStatus)" alt="">-->
<!-- </div>-->
</template>
</template>
<template v-else>
<div class="att-list">
<AiTopFixed>
<u-tabs :list="tabs" :current="current" height="96" :is-scroll="false" bar-width="192"
@change="change"></u-tabs>
</AiTopFixed>
<div v-for="(item,index) in detail.attendees && detail.attendees.filter(e=>e.joinStatus==current)" :key="index"
class="att-wrap">
<div class="left">
<u-avatar :src="item.avatar || (($cdn + 'common/xztx.png'))" size="74" mode="square"
style="margin-right: 8px"></u-avatar>
<AiOpenData type="userName" :openid="item.name"></AiOpenData>
</div>
<!-- <img :src="$cdn + 'common/phone.png'" alt="" @click="call(item)">-->
</div>
</div>
</template>
<u-modal v-model="show" title="提示" show-cancel-button content='是否要取消该会议?' @confirm="onConfirm"></u-modal>
<AiBack/>
</div>
</template>
<script>
import {mapActions, mapState} from "vuex";
export default {
name: "detail",
data() {
return {
detail: {},
list: false,
current: 0,
pageShow: false,
show: false,
id: null,
}
},
onLoad(opt) {
this.id = opt.id;
},
computed: {
...mapState(["user"]),
tabs() {
return [
{name: this.count(0) + "人未确认"},
{name: this.count(1) + "人已确认"},
{name: this.count(2) + "人已请假"},
{name: this.count(3) + "人待定"},
]
},
},
methods: {
onConfirm() {
this.$http.post("/app/appmeetinginfo/cancel", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("取消成功");
this.getDetail();
}
})
},
handleCancel() {
this.show = true;
},
toDo() {
this.$http.post("/app/appmeetinginfo/tobeConfirm", null, {
params: {
meetingId: this.id,
}
}).then(res => {
if (res.code == 0) {
this.$u.toast("会议待定");
setTimeout(_ => {
uni.navigateBack();
}, 800)
}
})
},
count(sta) {
return this.detail.attendees ? this.detail.attendees?.filter(e => e.joinStatus == sta)?.length : 0;
},
change(index) {
this.current = index;
this.detail = {};
this.getDetail();
},
call(item) {
if (item.phone) {
uni.makePhoneCall({
phoneNumber: item.phone
});
}
},
...mapActions(['previewFile', 'injectJWeixin']),
preFile(e) {
if ([".jpg", ".png", ".gif"].includes(e.postfix.toLowerCase())) {
uni.previewImage({
current: e.url,
urls: [e.url]
})
} else {
this.previewFile({...e})
}
},
tag(status) {
return {
"1": "common/2confirmed2.png",
"2": "common/2absent2.png"
}[status]
},
updateStatus(status) {
this.$http.post(status == 0 ? "/app/appmeetinginfo/absent" : "/app/appmeetinginfo/confirm", null, {
params: {
meetingId: this.id,
reason: status == 0 ? "" : null
}
}).then(res => {
if (res.code == 0) {
this.$u.toast(status == 0 ? "请假成功" : "确认成功")
this.getDetail()
}
})
},
color(status) {
if (status == 1) {
return "#FF8822"
}
if (status == 2) {
return "#1365DD"
}
if (status == 3) {
return "#FF4466"
}
return "#343D65"
},
getDetail() {
this.$http.post("/app/appmeetinginfo/info-id", null, {
params: {id: this.id}
}).then(res => {
if (res && res.data) {
this.detail = res.data
this.pageShow = true
}
})
}
},
created() {
this.injectJWeixin(['sendChatMessage']).then(() => {
this.getDetail()
})
},
onShow() {
document.title = "会议详情";
this.$dict.load("meetStatus");
wx.hideOptionMenu();
},
filters: {
transform(status) {
if (status == 1) {
return "已确认"
}
if (status == 2) {
return "已请假"
}
}
}
}
</script>
<style lang="scss" scoped>
.detail {
min-height: 100%;
background-color: #F5F5F5;
padding-bottom: 140px;
::v-deep .AiTopFixed {
margin-bottom: 16px;
.content {
padding: 0 !important;
}
}
.att-list {
min-height: 100%;
.att-wrap {
display: flex;
height: 112px;
align-items: center;
justify-content: space-between;
background-color: #ffffff;
box-sizing: border-box;
padding: 0 50px;
border-bottom: 1px solid #E4E5E6;
.left {
display: flex;
align-items: center;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
.name {
font-size: 30px;
font-weight: 600;
color: #333333;
}
}
& > img {
width: 48px;
height: 48px;
}
}
}
.card {
background-color: #FFFFFF;
margin-bottom: 8px;
box-sizing: border-box;
padding: 16px 32px;
header {
font-size: 40px;
font-weight: 600;
color: #333333;
line-height: 64px;
letter-spacing: 1px;
}
.u-row {
& > div {
border-radius: 50%;
text-align: center;
font-size: 30px;
display: flex;
align-items: center;
justify-content: center;
/*margin-left: 8px;*/
}
& > span {
font-size: 30px;
color: #343D65;
margin-left: 16px;
}
::v-deep .u-avatar__img {
width: 56px;
height: 56px;
vertical-align: middle;
color: #ffffff;
background-color: #2266FF;
font-size: 16px;
}
.user-name {
font-size: 30px;
color: #343D65;
}
img {
width: 48px;
height: 48px;
}
}
& > span {
font-size: 32px;
color: #333333;
line-height: 48px;
letter-spacing: 1px;
display: inline-block;
box-sizing: border-box;
padding: 16px 0;
}
.label {
height: 96px;
font-size: 32px;
color: #333333;
display: flex;
align-items: center;
margin-bottom: 16px;
}
.file {
height: 128px;
background: #FFFFFF;
border-radius: 8px;
border: 1px solid #CCCCCC;
box-sizing: border-box;
padding: 0 16px;
margin-bottom: 32px;
& > .u-row {
height: 100%;
.left {
width: 522px;
display: flex;
align-items: center;
& > img {
width: 96px;
height: 96px;
}
& > span {
font-size: 32px;
color: #333333;
display: inline-block;
line-height: 44px;
text-overflow: ellipsis;
overflow-x: hidden;
white-space: nowrap;
}
}
& > span {
font-size: 28px;
color: #999999;
}
}
}
.active {
background-color: #F3F6F9;
}
.name {
font-size: 32px;
font-weight: 400;
color: #333333;
}
.wrap {
height: 112px;
display: flex;
align-items: center;
position: relative;
&:after {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 622px;
height: 2px;
background-color: rgba(216, 221, 230, 0.5);
}
& > label {
width: 80px;
height: 80px;
border-radius: 50%;
background-color: #4E8EEE;
font-size: 28px;
font-weight: 600;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
}
}
}
.item-wrap {
height: 112px;
padding: 0 32px;
.u-row {
height: 100%;
& > span {
font-size: 32px;
font-weight: 400;
color: #333333;
}
}
.right {
font-size: 28px;
color: #999999;
display: flex;
align-items: center;
em {
font-style: normal;
color: #1365DD;
}
.right-arrow {
width: 16px;
height: 16px;
border-top: 5px solid #CCCCCC;
border-right: 5px solid #CCCCCC;
transform: rotate(45deg);
}
}
}
.footer {
height: 112px;
width: 100%;
position: fixed;
left: 0;
bottom: 0;
background-color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
& > div {
font-size: 28px;
color: #666666;
display: flex;
flex-direction: column;
& > img {
width: 48px;
height: 48px;
}
}
& > div:nth-child(1), & > div:nth-child(2) {
width: 135px;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
& > div:last-child {
width: calc(100% - 270px);
height: 100%;
color: #FFFFFF;
display: flex;
align-items: center;
justify-content: center;
background-color: #1365DD;
}
& > label {
font-size: 36px;
font-weight: 400;
color: #999999;
}
/*img {*/
/* width: 158px;*/
/* height: 104px;*/
/* position: absolute;*/
/* right: 0;*/
/* top: 0;*/
/*}*/
}
.cancel {
color: #ffffff;
font-size: 36px;
background-color: #005DFF
}
}
</style>

Some files were not shown because too many files have changed in this diff Show More