This commit is contained in:
shilixia 2021-04-27 15:09:45 +08:00
commit b452d91b9f
22 changed files with 601 additions and 129 deletions

View File

@ -114,8 +114,8 @@
</el-card>
<el-card style="float:left;width: 30%;">
<el-button type="primary" icon="el-icon-plus" @click="adddept">增加巡检组织</el-button>
<el-card style="float:left;width: 30%;margin-top:4px">
<!-- <el-button type="primary" icon="el-icon-plus" @click="adddept">增加巡检组织</el-button> -->
<el-table
:data="recordList"
max-height="300"
@ -126,8 +126,7 @@
@row-click="recorclickRow"
>
<el-table-column
label="组织名称"
width="180">
label="组织名称">
<template slot-scope="scope">
{{ scope.row.dept__name }}
@ -135,8 +134,7 @@
</template>
</el-table-column>
<el-table-column
label="检查状态"
width="180">
label="检查状态">
<template slot-scope="scope">
<el-tag size="medium">{{ scope.row.state }}</el-tag>
@ -155,8 +153,8 @@
</el-table-column>
</el-table>
</el-card>
<el-card class="box-card" style="float:right;width: 70%;">
<el-button type="primary" icon="el-icon-plus" @click="dialogFormVisible=true">指派任务</el-button>
<el-card class="box-card" style="float:right;width: 70%;margin-top:4px;">
<el-button type="primary" @click="dialogFormVisible=true">指派任务</el-button>
<el-table
:data="inspectitemList"
max-height="300"
@ -170,8 +168,7 @@
width="55">
</el-table-column>
<el-table-column
label="检查类别"
width="180">
label="检查类别">
<template slot-scope="scope">
{{ scope.row.item_.cate_name }}
@ -179,8 +176,7 @@
</template>
</el-table-column>
<el-table-column
label="检查要点"
width="180">
label="检查要点">
<template slot-scope="scope">
{{ scope.row.item_.name }}
@ -188,8 +184,7 @@
</template>
</el-table-column>
<el-table-column
label="检查类型"
width="180">
label="检查类型">
<template slot-scope="scope">
{{ scope.row.item_.type }}
@ -197,8 +192,7 @@
</template>
</el-table-column>
<el-table-column
label="检查人"
width="180">
label="检查人">
<template slot-scope="scope" v-if="scope.row.checker_">
{{ scope.row.checker_.name }}
@ -206,8 +200,7 @@
</template>
</el-table-column>
<el-table-column
label="是否检查"
width="180">
label="是否检查">
<template slot-scope="scope">
<el-tag v-if="scope.row.checked" effect="plain"></el-tag>
<el-tag type="danger" effect="plain" v-else></el-tag>

View File

@ -34,7 +34,11 @@ const install = (Vue, vm) => {
let checkInspectRecord = (id, params)=> vm.$u.put(`/quality/inspectrecord/${id}/check/`, params);
let upInspectDept = (id, params)=>vm.$u.put(`/quality/inspectdept/${id}/up/`, params);
let startInspectDept = (id, params)=>vm.$u.put(`/quality/inspectdept/${id}/start/`, params);//开始检查
let upInspectDept = (id, params)=>vm.$u.put(`/quality/inspectdept/${id}/up/`, params);//提交记录
let appointChecker = (params) => vm.$u.post('/quality/inspectrecord/appoint/', params);//检查指派
vm.$u.api = {getUserInfo,
getCode,
codeLogin,
@ -46,7 +50,9 @@ const install = (Vue, vm) => {
getSubtaskDept,
getInspectRecord,
checkInspectRecord,
upInspectDept
upInspectDept,
appointChecker,
startInspectDept
};
}

View File

@ -20,7 +20,6 @@ const install = (Vue, vm) => {
// 请求拦截配置Token等参数
Vue.prototype.$u.http.interceptor.request = (config) => {
config.header.Authorization = 'Bearer ' + vm.vuex_token;
// 方式一存放在vuex的token假设使用了uView封装的vuex方式https://uviewui.com/components/globalVariable.html
// config.header.token = vm.token;
@ -47,9 +46,9 @@ const install = (Vue, vm) => {
}
else if(res.code === 401){
vm.$u.toast('验证失败,请重新登录');
// uni.reLaunch({
// url:'/pages/login/login'
// })
uni.reLaunch({
url:'/pages/login/login'
})
return false;
}
else{

View File

@ -0,0 +1,141 @@
<template>
<view :class="[styleType === 'text'?'segmented-control--text' : 'segmented-control--button' ]" :style="{ borderColor: styleType === 'text' ? '' : activeColor }"
class="segmented-control">
<view v-for="(item, index) in values" :class="[ styleType === 'text'?'segmented-control__item--text': 'segmented-control__item--button' , index === currentIndex&&styleType === 'button'?'segmented-control__item--button--active': '' , index === 0&&styleType === 'button'?'segmented-control__item--button--first': '',index === values.length - 1&&styleType === 'button'?'segmented-control__item--button--last': '' ]"
:key="index" :style="{
backgroundColor: index === currentIndex && styleType === 'button' ? activeColor : '',borderColor: index === currentIndex&&styleType === 'text'||styleType === 'button'?activeColor:'transparent'
}"
class="segmented-control__item" @click="_onClick(index)">
<text :style="{color:
index === currentIndex
? styleType === 'text'
? activeColor
: '#fff'
: styleType === 'text'
? '#000'
: activeColor}"
class="segmented-control__text">{{ item }}</text>
</view>
</view>
</template>
<script>
/**
* SegmentedControl 分段器
* @description 用作不同视图的显示
* @tutorial https://ext.dcloud.net.cn/plugin?id=54
* @property {Number} current 当前选中的tab索引值从0计数
* @property {String} styleType = [button|text] 分段器样式类型
* @value button 按钮类型
* @value text 文字类型
* @property {String} activeColor 选中的标签背景色与边框颜色
* @property {Array} values 选项数组
* @event {Function} clickItem 组件触发点击事件时触发e={currentIndex}
*/
export default {
name: 'UniSegmentedControl',
props: {
current: {
type: Number,
default: 0
},
values: {
type: Array,
default () {
return []
}
},
activeColor: {
type: String,
default: '#007aff'
},
styleType: {
type: String,
default: 'button'
}
},
data() {
return {
currentIndex: 0
}
},
watch: {
current(val) {
if (val !== this.currentIndex) {
this.currentIndex = val
}
}
},
created() {
this.currentIndex = this.current
},
methods: {
_onClick(index) {
if (this.currentIndex !== index) {
this.currentIndex = index
this.$emit('clickItem', {
currentIndex: index
})
}
}
}
}
</script>
<style lang="scss" scoped>
.segmented-control {
/* #ifndef APP-NVUE */
display: flex;
box-sizing: border-box;
/* #endif */
flex-direction: row;
height: 36px;
overflow: hidden;
/* #ifdef H5 */
cursor: pointer;
/* #endif */
}
.segmented-control__item {
/* #ifndef APP-NVUE */
display: inline-flex;
box-sizing: border-box;
/* #endif */
position: relative;
flex: 1;
justify-content: center;
align-items: center;
}
.segmented-control__item--button {
border-style: solid;
border-top-width: 1px;
border-bottom-width: 1px;
border-right-width: 1px;
border-left-width: 0;
}
.segmented-control__item--button--first {
border-left-width: 1px;
border-top-left-radius: 5px;
border-bottom-left-radius: 5px;
}
.segmented-control__item--button--last {
border-top-right-radius: 5px;
border-bottom-right-radius: 5px;
}
.segmented-control__item--text {
border-bottom-style: solid;
border-bottom-width: 3px;
}
.segmented-control__text {
font-size: 16px;
line-height: 20px;
text-align: center;
}
</style>

View File

@ -79,7 +79,7 @@
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wx126bdbf0c683c357",
"appid" : "wx0605643660b9b2ec",
"setting" : {
"urlCheck" : false,
"minified" : true

View File

@ -15,7 +15,7 @@
"path" : "pages/home/home",
"style" :
{
"navigationBarTitleText": "主页",
"navigationBarTitleText": "",
"enablePullDownRefresh": false
}
@ -103,9 +103,9 @@
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTextStyle": "white",
"navigationBarTitleText": "uView",
"navigationBarBackgroundColor": "#FFFFFF",
"navigationBarBackgroundColor": "#2b85e4",
"backgroundColor": "#FFFFFF"
},
"tabBar": {

View File

@ -1,25 +1,33 @@
<template>
<view>
<u-image :src="imageURL" mode="widthFix"></u-image>
<!-- <view :style="{background: 'url('+imageURL+')'}">
</view> -->
<view style="background-color: #0074ba;">
<u-image :src="imageURL" mode="widthFix"></u-image>
<view style="background-color: #2b85e4;font-weight: bold;font-size: 30rpx;color:white;padding-left:8rpx">欢迎您:{{vuex_user.name}}</view>
</view>
<!-- <u-swiper @change="change" :height="250" :list="swiper_list" :title="swtitle" :effect3d="effect3d"
:indicator-pos="indicatorPos" :mode="mode" :interval="3000" @click="click"></u-swiper> -->
<view style="margin-top:12rpx;margin-bottom: 12rpx;">
<view style="margin-bottom: 12rpx;">
<u-grid :col="3" :border="false">
<u-grid-item v-for="(item, index) in grids" v-bind:key="index" @click="clickGrid(item)">
<u-icon :name="item.icon" :size="60"></u-icon>
<u-icon :name="item.icon" :size="60" color="#2b85e4" size="72"></u-icon>
<view class="grid-text">{{item.name}}</view>
</u-grid-item>
</u-grid>
</view>
<view style="margin-bottom: 12rpx;margin-left: 6rpx;">
<view style="margin-bottom: 12rpx;margin-left: 6rpx;" v-if="myinspecttaskList.length>0">
<u-section title="最近任务" :right="false" ></u-section>
</view>
<u-card v-for="(item, index) in myinspecttaskList" v-bind:key="index" :title="item.name" margin="12rpx"
:border="false" :foot-border-top="false" border-radius="2rpx" :head-style="headstyle"
:border="false" :foot-border-top="false" border-radius="8rpx" :head-style="headstyle"
@body-click="taskClick" :index="item.id" padding="10">
<view class="" slot="body">
<view class="u-body-item-title">
<span style="color:#2979FF;font-weight: bold;margin-right: 8rpx;">{{item.state}}</span>
<span class="itemstate">{{item.state}}</span>
{{item.name}}
</view>
<view class="u-body-item">
@ -33,9 +41,9 @@
</view>
<view class="u-body-item">
涉及单位:
<span style="color:blue;">{{item.depts_count}}</span>
<span style="color:darkblue;">{{item.depts_count}}</span>
巡查组:
<span style="color:blue;">{{item.members.length}}</span>
<span style="color:darkblue;">{{item.members.length}}</span>
</view>
</view>
</u-card>
@ -46,7 +54,7 @@
export default {
data() {
return {
imageURL: 'https://cdn.uviewui.com/uview/swiper/1.jpg',
imageURL: 'http://testsearch.ctc.ac.cn:8000/media/default/banner3.jpg',
swiper_list: [{
image: 'https://cdn.uviewui.com/uview/swiper/1.jpg',
title: '昨夜星辰昨夜风,画楼西畔桂堂东'
@ -164,4 +172,9 @@
color: #333;
}
}
.itemstate {
color:$u-type-primary-dark;
font-weight: bold;
margin-right: 8rpx;
}
</style>

View File

@ -1,17 +1,24 @@
<template>
<view class="wrap">
<u-card :title="initData.dept__name" margin="12rpx" :border="false" :foot-border-top="false" border-radius="2rpx"
:head-style="headstyle" padding="10">
<u-card :title="initData.dept__name" margin="12rpx" :border="false" :foot-border-top="false"
border-radius="8rpx" :head-style="headstyle" padding="10">
<view class="" slot="body">
<view class="u-body-item-title">
<span style="color:#2979FF;font-weight: bold;margin-right: 8rpx;">{{initData.state}}</span>
<span class="itemstate">{{initData.state}}</span>
</view>
<view class="u-body-item" v-if="initData.start_date">
开始检查日期: <span>{{initData.start_date}}</span>
</view>
</view>
<view class="" slot="foot">
<view style="flex:true;text-align: right;">
<u-checkbox @change="selfChange" v-model="is_self">只看我的</u-checkbox>
<u-button type="primary" size="mini" style="margin-left:6rpx" @click="upReport" v-if="initData.state=='检查中'&&initData.leader==vuex_user.id">提交结果</u-button>
<u-button size="mini" style="margin-left:6rpx" @click="goReport" v-if="initData.state=='已提交'">查看报告</u-button>
<u-button type="primary" size="mini" style="margin-left:6rpx" @click="startCheck"
v-if="initData.state=='待检查'&&initData.leader==vuex_user.id">开始检查</u-button>
<u-button type="warning" size="mini" style="margin-left:6rpx" @click="upReport"
v-if="initData.state=='检查中'&&initData.leader==vuex_user.id">提交结果</u-button>
<u-button size="mini" style="margin-left:6rpx" @click="goReport" v-if="initData.state=='已提交'">查看报告
</u-button>
</view>
</view>
@ -21,8 +28,9 @@
</view>
<view style="background-color: #ffffff;padding: 8rpx;">
<u-tabs :list="list" :is-scroll="false" :current="currentIndex" @change="sectionChange"></u-tabs>
<!-- <u-card v-for="(item, index) in records" v-bind:key="index" margin="6rpx"
:border="false" :foot-border-top="false" border-radius="2rpx" :head-style="headstyle"
<!-- <uni-segmented-control :current="currentIndex" :values="list1" styleType="text" @clickItem="sectionChange2"></uni-segmented-control> -->
<!-- <u-card v-for="(item, index) in records" v-bind:key="index" margin="6rpx"
:border="false" :foot-border-top="false" border-radius="8rpx" :head-style="headstyle"
@body-click="clickRow" :index="item.id" padding="10" v-if="getShow(item.checked)">
<view class="" slot="body">
<view class="u-body-item-title">
@ -38,26 +46,42 @@
</view>
</view>
</u-card> -->
<view v-for="(item, index) in records" v-bind:key="index" v-if="getShow(item.checked)"
style="padding: 12rpx;">
<view class="u-body-item-title">{{item.item_.sortnum}}.{{item.item_.name}}</view>
<view class="u-body-item">
<span v-if="item.checker_">{{item.checker_.name}}</span>--
<span v-if="item.result=='发现'" style="color:red">{{item.result}}</span>
<span v-else-if="item.result=='未发现'" style="color:green">{{item.result}}</span>
<span v-else-if="item.result=='不适用'">{{item.result}}</span>
</view>
<view style="flex:true;text-align: right;">
<u-button type="primary" size="mini" style="margin-left:6rpx" @click="clickRow(item)">检查</u-button>
<u-button size="mini" style="margin-left:6rpx" @click="clickRow2(item)"
v-if="currentIndex==1"
>详情</u-button>
<view v-show="currentIndex==0" style="text-align: right;">
<u-checkbox v-model="mutiSelect" @change="mutiSelectChange">多选</u-checkbox>
<u-button type="primary" size="mini" style="margin-left:6rpx" @click="membersShow"
v-if="initData.leader==vuex_user.id && mutiSelect">指派给</u-button>
</view>
<view style="margin-top:6rpx">
<u-gap height="1" bg-color="#bbb"></u-gap>
<u-gap height="2" bg-color="#ececec"></u-gap>
</view>
</view>
<!-- <u-collapse ref="mycollapse">
<checkbox-group @change="checkboxChange">
<view v-for="(item, index) in records" v-bind:key="index" v-show="getShow(item.checked)"
style="padding: 12rpx;">
<view class="u-body-item-title">
<checkbox :checked="item.selected" :value="item.id+'item'" v-if="mutiSelect"/>
<!-- <u-checkbox v-model="item.selected" v-if="mutiSelect"></u-checkbox> -->
{{item.item_.sortnum}}.{{item.item_.name}}
</view>
<view class="u-body-item">
<span v-if="item.checker_">{{item.checker_.name}}</span>--
<span v-if="item.result=='发现'" style="color:red">{{item.result}}</span>
<span v-else-if="item.result=='未发现'" style="color:green">{{item.result}}</span>
<span v-else-if="item.result=='不适用'">{{item.result}}</span>
</view>
<view style="flex:true;text-align: right;">
<u-button type="primary" size="mini" style="margin-left:6rpx" @click="clickRow(item)" v-if="initData.state=='检查中'">检查
</u-button>
<u-button size="mini" style="margin-left:6rpx" @click="clickRow2(item)" >
详情</u-button>
</view>
<view style="margin-top:6rpx">
<u-gap height="2" bg-color="#ececec"></u-gap>
</view>
</view>
</checkbox-group>
<!-- <u-collapse ref="mycollapse">
<u-collapse-item :title="title1" :open="true">
<u-cell-group :border="false">
<u-cell-item :title="item.item_.name" v-for="(item, index) in records1" v-bind:key="index"
@ -83,6 +107,8 @@
<view style="margin-top:16rpx">
<u-divider bg-color="#ededed">没有更多了</u-divider>
</view>
<u-picker mode="selector" v-model="showMembers" :default-selector="[0]" :range="members"
range-key="member__name" @confirm="pickerConfirm"></u-picker>
</view>
</template>
@ -103,6 +129,7 @@
name: '已检查'
}
],
list1:['未检查', '已检查'],
// title1:"未检查(0)",
// title2:"已检查(0)",
records: [],
@ -110,30 +137,53 @@
// records1:[],
// records2:[],
is_self: false,
showNo: false
showNo: false,
mutiSelect: false,
showMembers: false,
members: [],
selects: []
}
},
onLoad(options) {
this.initData = options;
let pages = getCurrentPages();
let prePage = pages[pages.length - 2];
if (prePage && prePage.subtask) {
this.members = prePage.subtask.members
} else {
this.$u.api.getSubinspectTask(this.initData.subtask).then(res => {
this.members = res.data.members
})
}
},
onShow() {
this.getSubtaskDept();
this.$u.api.getInspectRecords({
subtask: this.initData.subtask,
dept: this.initData.dept,
pageoff: true
}).then(res => {
this.records_ = res.data
this.records = res.data
this.sectionChange(this.currentIndex)
// this.setCollapse(this.records_)
})
this.getRecords()
},
methods: {
getSubtaskDept() {
this.$u.api.getSubtaskDept(this.initData.id).then(res => {
this.initData = res.data
if (this.initData.state == '已提交') {
this.sectionChange(1)
}
})
},
getRecords() {
this.$u.api.getInspectRecords({
subtask: this.initData.subtask,
dept: this.initData.dept,
pageoff: true
}).then(res => {
this.records_ = res.data
this.records = res.data
// for(var i=0;i<this.records.length;i++){
// this.records[i].selected=false
// }
this.mutiSelect = false
this.sectionChange(this.currentIndex)
// this.setCollapse(this.records_)
})
},
selfChange(val) {
@ -151,8 +201,26 @@
}
},
sectionChange(index) {
console.log(index)
this.currentIndex = index;
},
sectionChange2(val){
this.currentIndex=val.currentIndex;
},
checkboxChange(val){
let selects = [];
for(var i=0;i<val.detail.value.length;i++){
selects.push(val.detail.value[i].replace("item",""))
}
this.selects = selects
},
mutiSelectChange() {
if (this.mutiSelect) {
for (var i = 0; i < this.records.length; i++) {
this.records[i].selected = false
}
}
},
getShow(val) {
if (val && this.currentIndex == 1) {
return true
@ -183,17 +251,18 @@
// uni.navigateTo({
// url:'/pages/inspectrecord/recorddo'
// })
if((item.checker!= this.vuex_user.id && item.checker == null) || this.initData.leader==this.vuex_user.id ){
if ((item.checker != this.vuex_user.id && item.checker == null) || this.initData.leader == this.vuex_user
.id || item.checker == this.vuex_user.id) {
this.$u.route({
url: '/pages/inspectrecord/recorddo',
params: {
id: item.id
}
})
}else{
} else {
this.$u.toast('该项检查已指派他人')
}
},
clickRow2(item) {
// uni.navigateTo({
@ -206,23 +275,70 @@
}
})
},
goReport(){
goReport() {
this.$u.toast('暂未开通')
},
upReport(){
membersShow() {
if (this.selects.length > 0) {
this.showMembers = true
} else {
this.$u.toast('请选择检查项')
}
},
pickerConfirm(index) {
var that = this
let checker = that.members[index].member
uni.showModal({
title: '',
content: '确认将' + that.selects.length + '个检查指派给' + that.members[index].member__name + '吗?',
success: function(res) {
if (res.confirm) {
that.$u.api.appointChecker({
records: that.selects,
checker: checker
}).then(res => {
that.$u.toast('成功')
that.getRecords()
})
} else if (res.cancel) {
}
}
});
},
upReport() {
let that = this
uni.showModal({
title: '提交',
content: '确认提交吗?',
success: function (res) {
if (res.confirm) {
that.$u.api.upInspectDept(that.initData.id).then(res=>{
this.initData = res.data
}).catch(e=>{})
} else if (res.cancel) {
}
}
title: '',
content: '确认提交吗?',
success: function(res) {
if (res.confirm) {
that.$u.api.upInspectDept(that.initData.id).then(res => {
that.initData = res.data
that.$u.toast('提交成功')
}).catch(e => {})
} else if (res.cancel) {
}
}
});
},
startCheck(){
let that = this
uni.showModal({
title: '',
content: '确认开始检查吗?',
success: function(res) {
if (res.confirm) {
that.$u.api.startInspectDept(that.initData.id).then(res => {
that.initData = res.data
that.$u.toast('成功')
}).catch(e => {})
} else if (res.cancel) {
}
}
});
}
}
@ -247,4 +363,10 @@
color: #333;
}
}
.itemstate {
color: $u-type-primary-dark;
font-weight: bold;
margin-right: 8rpx;
}
</style>

View File

@ -3,8 +3,10 @@
<u-form :model="form" label-position="top" :label-style="labelStyle" ref="uForm" :rules="rules"
:errorType="errorType">
<u-form-item label="检查事项" v-if="form.item_">
<view >类别:<span style="color:darkblue;font-weight: bold;">{{form.item_.type}}</span></view>
<view>
<view>类别:<span style="color:darkblue;font-weight: bold;">{{form.item_.type}}</span></view>
<view>{{form.item_.sortnum}}.{{form.item_.name}}</view>
</view>
</u-form-item>
<u-form-item label="取证要求" v-if="form.item_">
<span>{{form.item_.require}}</span>
@ -16,13 +18,11 @@
<span v-if="form.note">{{form.note}}</span>
</u-form-item>
<u-form-item label="拍照取证">
</u-form-item>
<view >
<u-image
<u-image
@click="imgListPreview(index)"
width="260rpx" height="260rpx" :src="item" v-for="(item, index) in fileList" v-bind:key="index" style="padding: 6rpx;"></u-image>
</view>
width="260rpx" height="260rpx" :src="item" v-for="(item, index) in fileList" v-bind:key="index" style="margin: 8rpx;"></u-image>
</u-form-item>
</u-form>
</view>
</template>

View File

@ -4,7 +4,7 @@
:errorType="errorType">
<u-form-item label="检查事项" v-if="form.item_">
<view>
<view >类别:<span style="color:darkblue;font-weight: bold;">{{form.item_.type}}</span></view>
<view>类别:<span style="color:darkblue;font-weight: bold;">{{form.item_.type}}</span></view>
<view>{{form.item_.sortnum}}.{{form.item_.name}}</view>
</view>
</u-form-item>

View File

@ -15,9 +15,9 @@
</u-form-item>
</u-form>
<!-- <button :style="[inputStyle]" class="getCaptcha">登录</button> -->
<!-- <u-gap height="1" bg-color="#bbb"></u-gap> -->
<!-- <u-gap height="0.5" bg-color="#bbb"></u-gap> -->
<view style="margin-top: 16rpx;">
<u-button @click="submit" type="warning" >登录</u-button>
<u-button @click="submit" type="primary" >登录</u-button>
</view>
<view class="alternative">
<navigator url="login_password" class="password" open-type="redirect">密码登录</navigator>

View File

@ -13,7 +13,7 @@
</u-form-item>
</u-form>
<view style="margin-top: 16rpx;">
<u-button @click="submit" type="warning" >登录</u-button>
<u-button @click="submit" type="primary" >登录</u-button>
</view>
</view>
</view>

View File

@ -83,5 +83,6 @@ page{
}
.user-box{
background-color: #fff;
padding-top:24rpx;
}
</style>

View File

@ -1,11 +1,11 @@
<template>
<view class="wrap">
<u-card v-for="(item, index) in myinspecttaskList" v-bind:key="index" :title="item.name" margin="6rpx"
:border="false" :foot-border-top="false" border-radius="2rpx" :head-style="headstyle"
<u-card v-for="(item, index) in myinspecttaskList" v-bind:key="index" :title="item.name" margin="12rpx"
:border="false" :foot-border-top="false" border-radius="8rpx" :head-style="headstyle"
@body-click="taskClick" :index="item.id">
<view class="" slot="body">
<view class="u-body-item-title">
<span style="color:#2979FF;font-weight: bold;margin-right: 8rpx;">{{item.state}}</span>
<span class="itemstate">{{item.state}}</span>
{{item.name}}
</view>
<view class="u-body-item">
@ -19,9 +19,9 @@
</view>
<view class="u-body-item">
涉及单位:
<span style="color:blue;">{{item.depts_count}}</span>
<span style="color:darkblue;">{{item.depts_count}}</span>
巡查组:
<span style="color:blue;">{{item.members.length}}</span>
<span style="color:darkblue;">{{item.members.length}}</span>
</view>
</view>
</u-card>
@ -73,5 +73,10 @@
color: #333;
}
}
.itemstate {
color:$u-type-primary-dark;
font-weight: bold;
margin-right: 8rpx;
}
</style>

View File

@ -1,10 +1,10 @@
<template>
<view class="wrap">
<u-card :title="subtask.name" margin="12rpx" :border="false" :foot-border-top="false" border-radius="2rpx"
<u-card :title="subtask.name" margin="12rpx" :border="false" :foot-border-top="false" border-radius="8rpx"
:head-style="headstyle" padding="10">
<view class="" slot="body">
<view class="u-body-item-title">
<span style="color:#2979FF;font-weight: bold;margin-right: 4rpx;">{{subtask.state}}</span>
<span class="itemstate">{{subtask.state}}</span>
{{subtask.name}}
</view>
<view class="u-body-item">
@ -18,23 +18,23 @@
</view>
<view class="u-body-item">
涉及单位:
<span style="color:blue;">{{subtask.depts_count}}</span>
<span style="color:darkblue;">{{subtask.depts_count}}</span>
巡查组:
<span style="color:blue;" v-if="subtask.members">{{subtask.members.length}}</span>
<span style="color:darkblue;" v-if="subtask.members">{{subtask.members.length}}</span>
</view>
<view style="margin-top: 6rpx;">
<u-gap height="1" bg-color="#bbb"></u-gap>
<u-gap height="0.5" bg-color="#bbb"></u-gap>
</view>
<u-collapse-item title="巡查组组成" :open="true">
<view>
组长:
<span v-for="(item, index) in subtask.members" v-bind:key="index" mode="plain"
style="margin-left:8rpx;color: #00007f;" v-if="item.type=='组长'">{{item.member__name}}</span>
style="margin-left:8rpx;color: darkblue;" v-if="item.type=='组长'">{{item.member__name}}</span>
</view>
<view>
组员:
<span v-for="(item, index) in subtask.members" v-bind:key="index" mode="plain"
style="margin-left:8rpx;color: #00007f;" v-if="item.type!='组长'">{{item.member__name}}</span>
style="margin-left:8rpx;color: darkblue;" v-if="item.type!='组长'">{{item.member__name}}</span>
</view>
</u-collapse-item>
</view>
@ -131,4 +131,9 @@
color: #333;
}
}
.itemstate {
color:$u-type-primary-dark;
font-weight: bold;
margin-right: 8rpx;
}
</style>

View File

@ -37,9 +37,9 @@ const store = new Vuex.Store({
// vuex_api: 'http://127.0.0.1:8000/api',
// vuex_apifile: 'http://127.0.0.1:8000/api/file/',
vuex_host: 'http://testsearch.ctc.ac.cn',
vuex_api: 'http://testsearch.ctc.ac.cn:8000/api',
vuex_apifile: 'http://testsearch.ctc.ac.cn:8000/api/file/',
vuex_host: 'https://testsearch.ctc.ac.cn',
vuex_api: 'https://testsearch.ctc.ac.cn/api',
vuex_apifile: 'https://testsearch.ctc.ac.cn/api/file/',
// 如果vuex_version无需保存到本地永久存储无需lifeData.vuex_version方式
// vuex_version: '1.0.1',

View File

@ -0,0 +1,19 @@
# Generated by Django 3.0.5 on 2021-04-26 03:28
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('quality', '0013_inspectitem_template'),
]
operations = [
migrations.AddField(
model_name='inspecttask',
name='template',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='quality.InspectTemplate', verbose_name='使用模板'),
),
]

View File

@ -40,6 +40,7 @@ class InspectTask(CommonAModel):
start_date = models.DateField('巡查开始日期')
end_date = models.DateField('巡查结束日期')
state = models.CharField('任务状态', max_length=50, choices=state_choices, default='待发布')
template = models.ForeignKey(InspectTemplate, on_delete=models.CASCADE, verbose_name='使用模板', null=True, blank=True)
class Meta:
verbose_name = '巡查任务'

View File

@ -36,10 +36,10 @@ class InspectTaskSerializer(serializers.ModelSerializer):
fields = '__all__'
def get_dept_count(self, obj):
return InspectDept.objects.filter(subtask__inspecttask=obj, is_deleted=True).count()
return InspectDept.objects.filter(subtask__inspecttask=obj, is_deleted=False).count()
def get_subtask_count(self, obj):
return SubInspectTask.objects.filter(inspecttask=obj, is_deleted=True).count()
return SubInspectTask.objects.filter(inspecttask=obj, is_deleted=False).count()
class InspectTaskSimpleSerializer(serializers.ModelSerializer):
class Meta:
@ -99,7 +99,7 @@ class InspectDeptSerializer(serializers.ModelSerializer):
leader = serializers.SerializerMethodField()
class Meta:
model = InspectDept
fields = ('dept', 'dept__name', 'state', 'subtask', 'id', 'note', 'leader')
fields = ('dept', 'dept__name', 'state', 'subtask', 'id', 'note', 'leader', 'start_date')
@staticmethod
def setup_eager_loading(queryset):

View File

@ -79,7 +79,7 @@ class SubtaskViewSet(PageOrNot, CreateUpdateCustomMixin, OptimizationMixin, Mode
'put': 'inspecttask_update', 'delete': 'inspecttask_delete'}
queryset = SubInspectTask.objects.all()
serializer_class = SubtaskListSerializer
filterset_fields = ['inspecttask']
filterset_fields = ['inspecttask', 'state']
ordering = ['-create_time']
def get_queryset(self):
@ -183,6 +183,21 @@ class InspectDeptViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
perms_map = {'get':'*'}
queryset = InspectDept.objects.all()
serializer_class = InspectDeptSerializer
@action(methods=['put'], detail=True, perms_map = {'put':'inspectrecord_update'},
permission_classes=[IsAdminUser|IsSubInspectTaskLeader])
def start(self, request, *args, **kwargs):
"""
对该组织开始检查
"""
obj = self.get_object()
if obj.state == '待检查':
obj.state = '检查中'
obj.start_date = timezone.now()
obj.save()
return Response(InspectDeptSerializer(instance=obj).data, status=status.HTTP_200_OK)
return Response('状态错误', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map = {'put':'inspectrecord_update'},
permission_classes=[IsAdminUser|IsSubInspectTaskLeader])
def up(self, request, *args, **kwargs):
@ -244,13 +259,9 @@ class InspectRecordViewSet(PageOrNot, ModelViewSet):
提交单条记录检查结果
"""
instance = self.get_object()
serializer = InspectRecordCheckSerializer(instance, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(checker=request.user, checked=True, check_time=timezone.now())
# 修改状态
insd = InspectDept.objects.get(subtask=instance.subtask, dept=instance.dept)
if insd.state == '待检查':
insd.state = '检查中'
insd.start_date = timezone.now()
insd.save()
return Response(status=status.HTTP_200_OK)
if instance.subtask.state == '执行中':
serializer = InspectRecordCheckSerializer(instance, data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save(checker=request.user, checked=True, check_time=timezone.now())
return Response(status=status.HTTP_200_OK)
return Response('任务状态错误', status=status.HTTP_400_BAD_REQUEST)

View File

@ -0,0 +1,28 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqBDfLPIyYIee9
M7LjCzdRRP5PHezjaks360V5AnK+oJO7HMgdH7z4QQG8AjKNbLOSFmVaH0R5YTJ3
XmOGgrdnmb+mCUx3G5wdO9/UXpP4ZA0Gx0S7nqmNPWR03wENoQQjcfMpkBFxMlwC
opS/EeBmQXaKIcg6B4hw3JLObdlr3f1eHccPZchH8Bwho4UjFO7rYVX8jfshV5iC
99KV650jv9uQ3OKno3moDPk9JRnozBpyUwRJ9SFFCZ1lOO625M+dPG13hZcGxMSy
T9wXzcij2luRHXxTSky952ciN3nTomKY00WcOCj0ZCGdHQV/6CzPALdL64TtN5uq
FLG0IoLxAgMBAAECggEAfZ6GNwVzAEk098gGKdm0srieioia6mE0WInemA2mCJGO
9hbLCTHVJzyo8mhRP8uMVqlzk4Y8ys51Qlucf9t/de3U+/Is7GibDcKanEiRXltW
gKalc1dFAdXVrsDC/3X0H9hnCVOof5HtCAlmjFLCEevWkTNqxO2h83oWgq4JkreL
NxyGmRLQAedqaLGcXbPemFSorsNcdQnoUOtJ/7GPl1MjMzt4dx1ysNlV8blNp4VL
BCteRZRdNz6F5paMcbtDKFDLgOdspJofRSsyMCLGktSUw9++F2PM2uavDAw84Pdg
5BtKRvd1P9Esn+TXBtPy1rQoBkBbGKt61Xev0gojvQKBgQDel2xDOVXJkYPIp4V7
lVwxZYyCzei5YDKTiRGIQu2QS6//r3CSpU6+NTn6RRNTPWvp6PeQSOiMd1gxqgdb
88WXPaIRCb4XDoADyRsB5gDCapetuVJCyUmgw5amkdJ5ktr1ql2dNJokodop40vx
WWNXe0ojEcM2pM7PeMzypUsl3wKBgQDDiLfhuxprhUPHx461RUrA2jTZFdROxgsi
N9NGO3qxuOc/p8MnePikuXs8s7c/x3LZVaVDquy6zoIy6KF+VS4tT36YlT7GyRyv
ndH/t9SiKzks9zBrI3uPlDhkIyctnhVY+2aNM/5cglblOM1FzilijbreNSzh3Lcg
7xp0CQVRLwKBgDiZGBYfxghyz6d9sRszZzXINGouITbBlxqch7C2E+HU3POOkHk5
P0RuFEfmuHs56u6XJhux7i+JSQuXyDdBTMSgD011xLfoH/TWdd+NtDO7FsY9kQUa
WXZfRTclbPcsuDAvGY6XiXo3DVoJSY4cxH3CA5/XLGQAk/V9Kd+o1+rRAoGBAKvz
sklnQe+mDRpGCuCsY/W+rtTtVnxDuwzHbRuJOPfLdElNXdh7kKVDm/Wg0Zjb68rm
f2RHjtEkw+jDHSm8/NPJ4bmLHd6wg3KI5mDsJ6jJPAmoA8NkO8fi/8hIBa8fIwTS
aLfqLljqIkKINjSZ/Vj27It21dZ2Q/FJc8jxGeTvAoGBALA91l1PnTsUUd3lHj0V
H0uUZD8qIan3WjzKbuJUnvYSI2GgKMPiSX5r4E18+7xgSG2lHRIEN5+FA6T/v9n/
HbP6e4FGhAaR7KrcxId55pfWPksYPHCAOZFSiKQwVkPy1sJTMKqDZULROQUwjV69
MjzYAERmsYQA2CkkSLCFhQU2
-----END PRIVATE KEY-----

View File

@ -0,0 +1,128 @@
-----BEGIN CERTIFICATE-----
MIIGTDCCBTSgAwIBAgIQPS0W9BEZigBFmUThrWpjwTANBgkqhkiG9w0BAQsFADCB
jzELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
A1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQD
Ey5TZWN0aWdvIFJTQSBEb21haW4gVmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENB
MB4XDTIxMDQyNTAwMDAwMFoXDTIyMDQyNTIzNTk1OVowHzEdMBsGA1UEAxMUdGVz
dHNlYXJjaC5jdGMuYWMuY24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
AQCqBDfLPIyYIee9M7LjCzdRRP5PHezjaks360V5AnK+oJO7HMgdH7z4QQG8AjKN
bLOSFmVaH0R5YTJ3XmOGgrdnmb+mCUx3G5wdO9/UXpP4ZA0Gx0S7nqmNPWR03wEN
oQQjcfMpkBFxMlwCopS/EeBmQXaKIcg6B4hw3JLObdlr3f1eHccPZchH8Bwho4Uj
FO7rYVX8jfshV5iC99KV650jv9uQ3OKno3moDPk9JRnozBpyUwRJ9SFFCZ1lOO62
5M+dPG13hZcGxMSyT9wXzcij2luRHXxTSky952ciN3nTomKY00WcOCj0ZCGdHQV/
6CzPALdL64TtN5uqFLG0IoLxAgMBAAGjggMRMIIDDTAfBgNVHSMEGDAWgBSNjF7E
VK2K4Xfpm/mbBeG4AY1h4TAdBgNVHQ4EFgQUr4UA+Awov3oaqRuAMgP3UbKkxF0w
DgYDVR0PAQH/BAQDAgWgMAwGA1UdEwEB/wQCMAAwHQYDVR0lBBYwFAYIKwYBBQUH
AwEGCCsGAQUFBwMCMEkGA1UdIARCMEAwNAYLKwYBBAGyMQECAgcwJTAjBggrBgEF
BQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EMAQIBMIGEBggrBgEF
BQcBAQR4MHYwTwYIKwYBBQUHMAKGQ2h0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2Vj
dGlnb1JTQURvbWFpblZhbGlkYXRpb25TZWN1cmVTZXJ2ZXJDQS5jcnQwIwYIKwYB
BQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMDkGA1UdEQQyMDCCFHRlc3Rz
ZWFyY2guY3RjLmFjLmNughh3d3cudGVzdHNlYXJjaC5jdGMuYWMuY24wggF/Bgor
BgEEAdZ5AgQCBIIBbwSCAWsBaQB3AEalVet1+pEgMLWiiWn0830RLEF0vv1JuIWr
8vxw/m1HAAABeQalozkAAAQDAEgwRgIhAISF+Qpq5bQHPbWpjW8XGdvm6sxf4HKu
vOrk4NTSX1zBAiEAzzOX6eWf6b8eyBWUPQpaEcEr/wYWLjj+84/FMhO1UnEAdQDf
pV6raIJPH2yt7rhfTj5a6s2iEqRqXo47EsAgRFwqcwAAAXkGpaLUAAAEAwBGMEQC
IE+Nd7R7KnkKQwESXlUM8CMoU2ubZRKleyGodJpVK8O8AiAqPBhS1AXPZ/ZIrCg4
Fg8pqoLMcxxRmsfAewI3OpbUWAB3AFWB1MIWkDYBSuoLm1c8U/DA5Dh4cCUIFy+j
qh0HE9MMAAABeQalos0AAAQDAEgwRgIhAOkGSJnkhA9GxnVL7h85Q59b84cJOjtj
r3ThnHypBamEAiEA096UyGiIKNIVChALqjv8lQh1rywKba0UiI0lLrh7DHwwDQYJ
KoZIhvcNAQELBQADggEBAH8N8GxC+04Pt3XJZD/UoUWIcIJ2uHOhtVVe/pebctMk
8VjD1BF4uKJOGpGRQ80cYB/DWScJL6x0TyTvLyTfeR26tndWDZvNk+L3GokwptRp
XCgNmSUHOhS7wnKCXKqRZZ0QkR32HpNknv36qn9fhe/6wcnUyQeYYCc9AUKyGoKY
EwnS0sL0HLLIDGiewXtR/mSeLt7lbx7+kffxIvRvQvjBV/m+4bHYJHLC/RvwTrWW
+fZcAg595PypE6mZrV9Hb9Vuh5mHRUioPYRT+pEBiih4qzZTHn7c4rQC1c8URuWm
8Ima8Y+4fi3Iwly+JHNv2LaYQlNdtM8iWoIWfwlTzFo=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIGEzCCA/ugAwIBAgIQfVtRJrR2uhHbdBYLvFMNpzANBgkqhkiG9w0BAQwFADCB
iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTgx
MTAyMDAwMDAwWhcNMzAxMjMxMjM1OTU5WjCBjzELMAkGA1UEBhMCR0IxGzAZBgNV
BAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UE
ChMPU2VjdGlnbyBMaW1pdGVkMTcwNQYDVQQDEy5TZWN0aWdvIFJTQSBEb21haW4g
VmFsaWRhdGlvbiBTZWN1cmUgU2VydmVyIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
AQ8AMIIBCgKCAQEA1nMz1tc8INAA0hdFuNY+B6I/x0HuMjDJsGz99J/LEpgPLT+N
TQEMgg8Xf2Iu6bhIefsWg06t1zIlk7cHv7lQP6lMw0Aq6Tn/2YHKHxYyQdqAJrkj
eocgHuP/IJo8lURvh3UGkEC0MpMWCRAIIz7S3YcPb11RFGoKacVPAXJpz9OTTG0E
oKMbgn6xmrntxZ7FN3ifmgg0+1YuWMQJDgZkW7w33PGfKGioVrCSo1yfu4iYCBsk
Haswha6vsC6eep3BwEIc4gLw6uBK0u+QDrTBQBbwb4VCSmT3pDCg/r8uoydajotY
uK3DGReEY+1vVv2Dy2A0xHS+5p3b4eTlygxfFQIDAQABo4IBbjCCAWowHwYDVR0j
BBgwFoAUU3m/WqorSs9UgOHYm8Cd8rIDZsswHQYDVR0OBBYEFI2MXsRUrYrhd+mb
+ZsF4bgBjWHhMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAbBgNVHSAEFDASMAYGBFUdIAAw
CAYGZ4EMAQIBMFAGA1UdHwRJMEcwRaBDoEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0
LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDB2Bggr
BgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKGM2h0dHA6Ly9jcnQudXNlcnRydXN0LmNv
bS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENBLmNydDAlBggrBgEFBQcwAYYZaHR0cDov
L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAMr9hvQ5Iw0/H
ukdN+Jx4GQHcEx2Ab/zDcLRSmjEzmldS+zGea6TvVKqJjUAXaPgREHzSyrHxVYbH
7rM2kYb2OVG/Rr8PoLq0935JxCo2F57kaDl6r5ROVm+yezu/Coa9zcV3HAO4OLGi
H19+24rcRki2aArPsrW04jTkZ6k4Zgle0rj8nSg6F0AnwnJOKf0hPHzPE/uWLMUx
RP0T7dWbqWlod3zu4f+k+TY4CFM5ooQ0nBnzvg6s1SQ36yOoeNDT5++SR2RiOSLv
xvcRviKFxmZEJCaOEDKNyJOuB56DPi/Z+fVGjmO+wea03KbNIaiGCpXZLoUmGv38
sbZXQm2V0TP2ORQGgkE49Y9Y3IBbpNV9lXj9p5v//cWoaasm56ekBYdbqbe4oyAL
l6lFhd2zi+WJN44pDfwGF/Y4QA5C5BIG+3vzxhFoYt/jmPQT2BVPi7Fp2RBgvGQq
6jG35LWjOhSbJuMLe/0CjraZwTiXWTb2qHSihrZe68Zk6s+go/lunrotEbaGmAhY
LcmsJWTyXnW0OMGuf1pGg+pRyrbxmRE1a6Vqe8YAsOf4vmSyrcjC8azjUeqkk+B5
yOGBQMkKW+ESPMFgKuOXwIlCypTPRpgSabuY0MLTDXJLR27lk8QyKGOHQ+SwMj4K
00u/I5sUKUErmgQfky3xxzlIPK1aEn8=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgTCCBGmgAwIBAgIQOXJEOvkit1HX02wQ3TE1lTANBgkqhkiG9w0BAQwFADB7
MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYD
VQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UE
AwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTE5MDMxMjAwMDAwMFoXDTI4
MTIzMTIzNTk1OVowgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5
MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBO
ZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0
aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAgBJlFzYOw9sI
s9CsVw127c0n00ytUINh4qogTQktZAnczomfzD2p7PbPwdzx07HWezcoEStH2jnG
vDoZtF+mvX2do2NCtnbyqTsrkfjib9DsFiCQCT7i6HTJGLSR1GJk23+jBvGIGGqQ
Ijy8/hPwhxR79uQfjtTkUcYRZ0YIUcuGFFQ/vDP+fmyc/xadGL1RjjWmp2bIcmfb
IWax1Jt4A8BQOujM8Ny8nkz+rwWWNR9XWrf/zvk9tyy29lTdyOcSOk2uTIq3XJq0
tyA9yn8iNK5+O2hmAUTnAU5GU5szYPeUvlM3kHND8zLDU+/bqv50TmnHa4xgk97E
xwzf4TKuzJM7UXiVZ4vuPVb+DNBpDxsP8yUmazNt925H+nND5X4OpWaxKXwyhGNV
icQNwZNUMBkTrNN9N6frXTpsNVzbQdcS2qlJC9/YgIoJk2KOtWbPJYjNhLixP6Q5
D9kCnusSTJV882sFqV4Wg8y4Z+LoE53MW4LTTLPtW//e5XOsIzstAL81VXQJSdhJ
WBp/kjbmUZIO8yZ9HE0XvMnsQybQv0FfQKlERPSZ51eHnlAfV1SoPv10Yy+xUGUJ
5lhCLkMaTLTwJUdZ+gQek9QmRkpQgbLevni3/GcV4clXhB4PY9bpYrrWX1Uu6lzG
KAgEJTm4Diup8kyXHAc/DVL17e8vgg8CAwEAAaOB8jCB7zAfBgNVHSMEGDAWgBSg
EQojPpbxB+zirynvgqV/0DCktDAdBgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rID
ZsswDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0gBAowCDAG
BgRVHSAAMEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29t
L0FBQUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggr
BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA
A4IBAQAYh1HcdCE9nIrgJ7cz0C7M7PDmy14R3iJvm3WOnnL+5Nb+qh+cli3vA0p+
rvSNb3I8QzvAP+u431yqqcau8vzY7qN7Q/aGNnwU4M309z/+3ri0ivCRlv79Q2R+
/czSAaF9ffgZGclCKxO/WIu6pKJmBHaIkU4MiRTOok3JMrO66BQavHHxW/BBC5gA
CiIDEOUMsfnNkjcZ7Tvx5Dq2+UUTJnWvu6rvP3t3O9LEApE9GQDTF1w52z97GA1F
zZOFli9d31kWTz9RvdVFGD/tSo7oBmF0Ixa1DVBzJ0RHfxBdiSprhTEUxOipakyA
vGp4z7h/jnZymQyd/teRCBaho1+V
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
-----END CERTIFICATE-----