Merge remote-tracking branch 'origin/dev_20230526_Mobile'

# Conflicts:
#	jero-web/src/common/lang/en-us.js
#	jero-web/src/common/lang/zh-cn.js
#	jero-web/src/components/tools/UserMenu.vue
This commit is contained in:
高嵩
2023-06-25 22:28:26 +08:00
133 changed files with 11279 additions and 133 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 641 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 704 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 372 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 535 B

@@ -0,0 +1,4 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 2.16699C1 1.89085 1.22386 1.66699 1.5 1.66699H14.5C14.7761 1.66699 15 1.89085 15 2.16699V11.8337C15 12.1098 14.7761 12.3337 14.5 12.3337H1.5C1.22386 12.3337 1 12.1098 1 11.8337V2.16699ZM2 11.3337H14V2.66699H2V11.3337Z" fill="#040B29"/>
<path d="M12 13.3337H4C4 13.8859 4.48842 14.3337 5.09091 14.3337H10.9091C11.5116 14.3337 12 13.8859 12 13.3337Z" fill="#040B29"/>
</svg>

After

Width:  |  Height:  |  Size: 481 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 446 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 476 B

+45
View File
@@ -1851,4 +1851,49 @@ module.exports = {
operationguide:'Project operation guide',
copyLink:'Copy link',
successfulReplication:'Successful replication',
//手机端
myCollection:'My Collection',
recentBrowsing:'Recent Browsing',
mySubscription:'My Subscription',
languageSwitching:'Language Switching',
phoneSearch:'search',
taskStatistics:'Task Statistics',
mine:'Mine',
regulatoryCertificationProcess:'Regulatory certification process',
authenticationParameterCollection:'Authentication parameter collection',
regulatoryCertificationProcessData:'Regulatory Certification Process Data',
regulationListIssuance:'Regulation list issuance',
designTheComplianceProcess:'Design the compliance process',
verifyComplianceProcess:'Verify compliance process',
thePreHomeProcess:'Pre-Home Process',
technicalAssessmentOfRegulations:'Technical Assessment Regulations',
legalOpinionCollection:'Legal Opinion Collection',
authenticationParameterCollectionData:'Authentication parameter collection data',
phoneRelatedItems:'Related items',
listHeading:'List heading',
phoneVersionNumber:'Version number',
node:'Node',
goToCheck:'View',
stored:'Stored',
individual:'a ',
document:'document',
treatmentMode:'Treatment Mode',
onlyMobilePhoneAreDisplayed:'Only the tasks that can be handled by the mobile phone are displayed',
phoneReset:'Reset',
noMore:'No More',
loading:'Loading...',
howAboutComment:'How about a comment',
send:'Send',
pleaseProcessThePC:'Please process it on the PC',
clickAndSelect:'Click and select',
phoneCreationTime:'Creation Time',
theCurrentFormatSupportPreview:'The current format does not support preview',
nearlyMonth:'Nearly a month',
nearlyThreeMonths:'Nearly Three Months',
nearlySixMonths:'Nearly Six Months',
nearlyYear:'Nearly a Year',
browsingTime:'Browsing Time',
pleaseViewOnPc:'Please view on PC',
taskHandling:'Task Handling',
}
File diff suppressed because it is too large Load Diff
@@ -31,7 +31,7 @@
</div>
</a-spin>
<!-- <div class='drawer-bootom-button'>-->
<!-- <a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>-->
<!-- </div>-->
<!-- 错误数据提示-->
+1 -1
View File
@@ -55,7 +55,7 @@
/>
</div>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -55,7 +55,7 @@
/>
</div>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -74,7 +74,7 @@
</span>
</a-table>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -82,7 +82,7 @@
</a-form-model>
</a-spin>
<div class='drawer-bootom-button' style="margin-top: 4px">
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('confirm') }}</a-button>
</div>
</div>
@@ -18,7 +18,7 @@
</a-form-model>
</a-spin>
<div class='drawer-bootom-button' style='margin-top: 20px'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -46,7 +46,7 @@
</a-form-model>
</a-spin>
<!-- <div class='drawer-bootom-button'>-->
<!-- <a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>-->
<!-- </div>-->
<!-- 错误数据提示-->
@@ -46,7 +46,7 @@
</a-form-model>
</a-spin>
<!-- <div class='drawer-bootom-button'>-->
<!-- <a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>-->
<!-- </div>-->
<!-- 错误数据提示-->
@@ -62,7 +62,7 @@
/>
</div>
<!-- <div class='drawer-bootom-button'>-->
<!-- <a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>-->
<!-- </div>-->
</div>
@@ -72,7 +72,7 @@
</div>
</div>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -10,18 +10,18 @@
<!-- <span id="p-company">HEZHONGWEILAI</span>-->
</div>
</div>
<div v-if="mobile">
<span class="top-bg"><img src="~/@assets/mobileBg.png" alt=""></span>
<span class="btm-bg"><img src="~/@assets/mobileHome.png" alt=""></span>
</div>
<!-- <div v-if="mobile">-->
<!-- <span class="top-bg"><img src="~/@assets/mobileBg.png" alt=""></span>-->
<!-- <span class="btm-bg"><img src="~/@assets/mobileHome.png" alt=""></span>-->
<!-- </div>-->
<div v-if="mobile" class="mobile">
<div class="logo">
<img src="~@/assets/logo.png" alt="">
</div>
<div class="company">
<span>合众未来</span>
<span>HEZHONGWEILAI</span>
</div>
<!-- <div class="company">-->
<!-- <span>合众未来</span>-->
<!-- <span>HEZHONGWEILAI</span>-->
<!-- </div>-->
</div>
<div class="illustration" v-if="!mobile">
<img src="@/assets/home.png" alt="">
@@ -174,7 +174,7 @@
height: 100%;
.mobile{
position: absolute;
top: 6rem;
top: 3rem;
width: 100%;
display: flex;
flex-direction: column;
+8 -14
View File
@@ -31,18 +31,11 @@
<!-- <a-icon type="question-circle-o"></a-icon>-->
<!-- </a>-->
<!-- </span>-->
<!-- <div class="action" @click="Jumpflybook">-->
<!-- <span class="header-notice">-->
<!-- <a-tooltip placement="bottomRight" :title="$t('userManual')" overlayClassName="tooltipColor">-->
<!-- <a-icon style="font-size: 16px; padding: 4px; color: #000000A6" type="question-circle"/>-->
<!-- </a-tooltip>-->
<!-- </span>-->
<!-- </div>-->
<a-dropdown>
<span class="action action-full ant-dropdown-link user-dropdown-menu">
<!-- <a-avatar class="avatar" size="small" :src="getAvatar()"/>-->
<!-- <span v-if="isDesktop()">welcome,{{ userInfo().username }}</span>-->
<a-icon style="font-size: 16px; padding: 4px; color: #000000A6" type="question-circle"/>
<div class="action" @click="Jumpflybook">
<span class="header-notice">
<a-tooltip placement="bottomRight" :title="$t('userManual')" overlayClassName="tooltipColor">
<a-icon style="font-size: 16px; padding: 4px; color: #000000A6" type="question-circle"/>
</a-tooltip>
</span>
<a-menu slot="overlay" class="user-dropdown-menu-wrapper">
<a-menu-item key="5" @click="Jumpflybook">
@@ -231,8 +224,8 @@
hiddenClick() {
this.shows = false
},
Jumpflybook(){
window.open('https://eicgyqr5mc.feishu.cn/docx/doxcnY2GbQfMSMqLP0eIFzFlEcd', '_blank');
Jumpflybook() {
window.open('https://eicgyqr5mc.feishu.cn/docx/doxcnY2GbQfMSMqLP0eIFzFlEcd', '_blank')
},
Jumpoperationguide(){
window.open('https://eicgyqr5mc.feishu.cn/docx/ZyhWdIz7EoMZ68xhI2bckcWWnMg', '_blank');
@@ -401,6 +394,7 @@
.action {
color: rgba(0, 0, 0, 0.65) !important;
font-size: 14px;
}
.action .avatar {
+82
View File
@@ -477,6 +477,88 @@ export const constantRouterMap = [
name: 'TaskPlanList',
component: () => import(/* webpackChunkName: "user" */ '@/views/projectManagement/projectStatusBoard/components/TaskPlanList')
},
/* 手机端开始 */
//搜索
{
path: '/phoneSearch',
name: 'phoneSearch',
component: () => import('@/views/phoneView/search')
},
//待办中心
{
path: '/phoneToDoCenter',
name: 'phoneToDoCenter',
component: () => import('@/views/phoneView/toDoCenter')
},
//任务数据
{
path: '/phoneTaskData',
name: 'phoneTaskData',
component: () => import('@/views/phoneView/taskData')
},
//我的
{
path: '/phoneHome',
name: 'phoneHome',
component: () => import('@/views/phoneView/home')
},
//搜索列表
{
path: '/phoneSearchList',
name: 'phoneSearchList',
component: () => import('@/views/phoneView/searchList')
},
//文档详情
{
path: '/phoneDocumentDetails',
name: 'phoneDocumentDetails',
component: () => import('@/views/phoneView/documentDetails')
},
//流程
{
path: '/phoneProcessManagement',
name: 'phoneProcessManagement',
component: () => import('@/views/phoneView/processManagement')
},
//知识分享
{
path: '/phoneProblemKnowledgeBase',
name: 'phoneProblemKnowledgeBase',
component: () => import('@/views/phoneView/problemKnowledgeBase')
},
//办理页面
{
path: '/phoneHandlingPage',
name: 'phoneHandlingPage',
component: () => import('@/views/phoneView/handlingPage')
},
//我的收藏
{
path: '/phoneMyCollection',
name: 'phoneMyCollection',
component: () => import('@/views/phoneView/myCollection')
},
//最近预览
{
path: '/phoneRecentBrowsing',
name: 'phoneRecentBrowsing',
component: () => import('@/views/phoneView/recentBrowsing')
},
//我的订阅
{
path: '/phoneMySubscribe',
name: 'phoneMySubscribe',
component: () => import('@/views/phoneView/mySubscribe')
},
//perhome办理流程
{
path: '/phonePreHomoMangement',
name: 'phonePreHomoMangement',
component: () => import('@/views/phoneView/preHomoMangement')
},
/* 手机端结束 */
// {
// path:'/vehicleinformation',
// name: 'vehicleinformation',
+4
View File
@@ -65,12 +65,16 @@ import '@/components/JVxeCells/install'
// 挂载全局使用的方法
import VueDraggableResizable from 'vue-draggable-resizable'
import Vant from 'vant';
import 'vant/lib/index.css';
import 'amfe-flexible/index.js'
Vue.component('vue-draggable-resizable', VueDraggableResizable)
Vue.config.productionTip = false
Vue.use(Storage, config.storageOptions)
Vue.use(Antd)
Vue.use(VueAxios, router)
Vue.use(Viser)
Vue.use(Vant);
Vue.use(hasPermission)
Vue.use(JDictSelectTag)
Vue.use(Print)
+50 -4
View File
@@ -10,6 +10,32 @@ import { JSEncrypt } from 'jsencrypt'
import { getAction } from '@/api/manage'
import { welcome } from '@/utils/util'
// 判断当前设备
function isMobile() {
var userAgentInfo = navigator.userAgent
var mobileAgents = ['Android', 'iPhone', 'SymbianOS', 'Windows Phone', 'iPad', 'iPod']
var mobile_flag = false
//根据userAgent判断是否是手机
for (var v = 0; v < mobileAgents.length; v++) {
if (userAgentInfo.indexOf(mobileAgents[v]) > 0) {
mobile_flag = true
break
}
}
var screen_width = window.screen.width
var screen_height = window.screen.height
//根据屏幕分辨率判断是否是手机
if (screen_width < 500 && screen_height < 800) {
mobile_flag = true
}
return mobile_flag
}
let mobile = isMobile()
NProgress.configure({ showSpinner: false }) // NProgress Configuration
// TODO 线上部署在conmponetns/tools/UserMenu.vue的退出登录时需解开代码以及注释代码
@@ -46,7 +72,11 @@ router.beforeEach((to, from, next) => {
store.commit('SET_AVATAR', res.result.userInfo.avatar)
let fullPath = ''
if (to.fullPath == '/') {
fullPath = INDEX_MAIN_PAGE_PATH
if (mobile) {
fullPath = '/phoneSearch'
} else {
fullPath = INDEX_MAIN_PAGE_PATH
}
} else {
fullPath = to.path
}
@@ -64,7 +94,13 @@ router.beforeEach((to, from, next) => {
if (Vue.ls.get(ACCESS_TOKEN)) {
/* has token */
if (to.path === '/user/login') {
next({ path: INDEX_MAIN_PAGE_PATH })
let fullPath = ''
if (mobile) {
fullPath = '/phoneSearch'
} else {
fullPath = INDEX_MAIN_PAGE_PATH
}
next({ path: fullPath })
NProgress.done()
} else {
if (store.getters.permissionList.length === 0) {
@@ -81,7 +117,13 @@ router.beforeEach((to, from, next) => {
// 根据roles权限生成可访问的路由表
// 动态添加可访问路由表
router.addRoutes(store.getters.addRouters)
const redirect = decodeURIComponent(from.query.redirect || to.path)
let redirect = decodeURIComponent(from.query.redirect || to.path)
if (mobile) {
if (redirect == '/'){
redirect = '/phoneSearch'
}
}
if (to.path === redirect) {
// hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
next({ ...to, replace: true })
@@ -103,7 +145,11 @@ router.beforeEach((to, from, next) => {
let fullPath = ''
if (to.fullPath == '/') {
fullPath = INDEX_MAIN_PAGE_PATH
if (mobile) {
fullPath = '/phoneSearch'
} else {
fullPath = INDEX_MAIN_PAGE_PATH
}
} else {
fullPath = to.path
}
+20
View File
@@ -0,0 +1,20 @@
import { Base64 } from 'js-base64'
import { Toast } from 'vant'
let downLoadFileUrl = window._CONFIG['domianPreviewURL'] + '/sys/common/download'
let downLoadImgUrl = window._CONFIG['domianWebImgURL'] + '/sys/common/download'
export function kkFileView(fileName, fileId) {
let index1 = fileName.lastIndexOf('.')
let index2 = fileName.length
let fileSuffix = fileName.substring(index1, index2)
if (fileSuffix == '.docx' || fileSuffix == '.doc' || fileSuffix == '.pdf' || fileSuffix == '.xlsx' || fileSuffix == '.xls') {
let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + Base64.encode(downLoadFileUrl + '/' + fileId + fileSuffix)
window.open(url)
} else if (fileSuffix == '.png' || fileSuffix == '.jpeg' || fileSuffix == '.gif' || fileSuffix == '.jpg') {
let url = window._CONFIG['onlinePreviewDomainURL'] + '?url=' + Base64.encode(downLoadImgUrl + '/' + fileId + fileSuffix)
window.open(url)
} else {
Toast('当前格式不支持预览')
}
}
@@ -55,7 +55,7 @@
</a-table>
</div>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -97,7 +97,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" v-if="!disabled" type="primary" :loading="confirmLoading">{{$t('submit')}}
</a-button>
</div>
@@ -56,7 +56,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -17,7 +17,7 @@
<div class="drawer-bootom-button">
<a-popconfirm :title="$t('AreYouWantDiscardEditing')" @confirm="handleCancel" :okText="$t('determine')"
:cancelText="$t('cancel')">
<a-button style="margin-right: .8rem">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px">{{$t('cancel')}}</a-button>
</a-popconfirm>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
@@ -946,12 +946,14 @@
margin-right: 4px;
color: #01A0AC;
cursor: pointer;
font-size: 14px;
}
.leftconteTdInformation-icon {
color: #01A0AC;
cursor: pointer;
margin-right: 6px;
font-size: 14px;
}
.rightTdInformation {
@@ -17,7 +17,7 @@
:url="url"
/>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -611,7 +611,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" v-if="!disabled" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
<uploadFile ref="uploadFile" :disabled="disabled" @uploadSuccess="uploadSuccess"/>
@@ -159,7 +159,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -51,7 +51,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-modal>
@@ -41,7 +41,7 @@
</a-form>
<!-- </a-spin>-->
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('close')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('close')}}</a-button>
<!-- <a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('close')}}</a-button>-->
</div>
</a-modal>
@@ -77,7 +77,7 @@
</a-form>
</a-spin>
<div v-show="!disableSubmit">
<a-button style="margin-right: .8rem" @confirm="handleCancel">取消</a-button>
<a-button style="margin-right: 8px" @confirm="handleCancel">取消</a-button>
<a-button @click="handleOk" type="primary" :loading="confirmLoading">提交</a-button>
</div>
</a-drawer>
@@ -166,7 +166,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button type="primary" @click="handleSubmit" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -279,7 +279,7 @@ export default {
if (res.success) {
this.confirmLoading = false
this.$message.success(this.$t('OperationSuccessful'))
} else {
this.$message.warning(res.message)
this.confirmLoading = false
@@ -64,7 +64,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -107,7 +107,7 @@
</a-row>
</a-form-model>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-modal>
@@ -64,7 +64,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -97,7 +97,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('determine')}}</a-button>
</div>
</a-modal>
@@ -115,7 +115,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('export')}}</a-button>
</div>
</a-modal>
@@ -85,7 +85,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('export')}}</a-button>
</div>
</a-modal>
@@ -102,7 +102,7 @@
</a-form>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -101,7 +101,7 @@
</a-row>
</a-form-model>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-modal>
@@ -313,7 +313,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -0,0 +1,30 @@
<template>
<div class="header">
<van-nav-bar
title="标题"
left-text="返回"
right-text="按钮"
left-arrow
@click-left="onClickLeft"
@click-right="onClickRight"
/>
</div>
</template>
<script>
export default {
name: 'header',
methods:{
onClickLeft(){
},
onClickRight(){
},
}
}
</script>
<style scoped>
</style>
@@ -0,0 +1,543 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{serial_number}}
</span>
</div>
<div class="header-right">
<div class="header-right-text" @click="subscribeClick">
<img v-if="subscribeFlag == '1'" src="~@/assets/icon_link_document.png" alt="">
<img v-else src="~@/assets/icon_link.png" alt="">
<span :class="{'header-right-text-color':subscribeFlag == '1'?true:false}">{{$t('subscribe')}}</span>
</div>
<div class="header-right-text" @click="collectionClick">
<img v-if="collectFlag == '1'" src="~@/assets/icon_star_document.png" alt="">
<img v-else src="~@/assets/icon_star.png" alt="">
<span :class="{'header-right-text-color':collectFlag == '1'?true:false}">{{$t('Collection')}}</span>
</div>
</div>
<van-collapse class="collapse" v-model="activeNames">
<div v-for="(item,index) in detailList">
<div v-for="val in Object.keys(item)">
<van-collapse-item v-if="val == $t('essentialInformation')" :title="val" name="1">
<div class="content-box-type-box" v-for="(ol,index1) in item[val]">
<div class="content-box-type-num" v-if="ol.field_show_type == 10">
<span class="content-box-left-num">{{ol.db_field_txt}}</span>
<span class="content-box-text-num"
v-if="!ol.list">--</span>
<span class="content-box-text-num"
v-for="valItem in ol.list"
@click="numClick(valItem)"
v-else-if="ol.list && ol.list.length > 0">
{{valItem.title}}
</span>
</div>
<div class="content-box-type-num" v-else-if="ol.field_show_type == 8">
<span class="content-box-left-num">{{ol.db_field_txt}}</span>
<span class="content-box-text-num" style="color: #040B29">
{{ol.value || '--'}}
</span>
</div>
<div class="content-box-type" v-else-if="ol.urlClick">
<span class="content-box-left">{{ol.db_field_txt}}</span>
<span class="content-box-text" style="color: #01A0AC"
@click="urlClick(ol)">{{ol.value || '--'}}</span>
</div>
<div class="content-box-type" v-else>
<span class="content-box-left">{{ol.db_field_txt}}</span>
<span class="content-box-text">{{ol.value || '--'}}</span>
</div>
</div>
</van-collapse-item>
<van-collapse-item v-else-if="val == $t('textInformation')"
:title="val" name="2">
<div class="textInformation" v-for="(ol,index1) in item[val]">
<div class="textInformationText">
{{ol.db_field_txt}}
</div>
<div v-if="ol.value && ol.value.length > 0">
<div class="textInformationFile" @click="fileClick(valItem)" v-for="valItem in ol.value">
{{valItem.fileName}}
</div>
</div>
</div>
</van-collapse-item>
</div>
</div>
<van-collapse-item :title="$t('DetailsPhasedImplementation')" name="3">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="Implementation" v-for="(item,index) in dataGrad" :key="index">
<div class="ImplementationText">{{item.standNumberOrClause}}</div>
<div class="ImplementationBox">
<div class="ImplementationBoxLeft">
{{item.implementationTypeText}}
</div>
<div class="ImplementationBoxRight">
{{item.implementationDate}}
</div>
</div>
<div class="ImplementationButtom">
{{item.remarks}}
</div>
</div>
</van-list>
</van-collapse-item>
</van-collapse>
<van-overlay :show="show">
<van-loading type="spinner">{{textLoading}}</van-loading>
</van-overlay>
</div>
</template>
<script>
import { getAction, postAction, downFile } from '@/api/manage'
import { kkFileView } from '@/utils/kkfileView'
import eventBUs from '../../common/event'
import { Toast } from 'vant'
export default {
name: 'phoneDocumentDetails',
data() {
return {
activeNames: ['1', '2', '3'],
url: {
getInfo: 'document/bussDocumentLibraryEO/getInfoById',
list: 'log/bussLogEO/page',
getTitle: '/document/bussDocumentLibraryEO/getTitle',
getPage: '/document/phasedImplementationDetailsEO/page',
getMenuList: 'document/bussDocumentLibraryEO/getMenuList'
},
show: false,
serial_number: '',
detailList: [],
loading: false,
finished: false,
pageNo: 0,
dataGrad: [],
textLoading: this.$t('loading'),
collectFlag: 0,
subscribeFlag: 0
}
},
mounted() {
document.title = 'NIO GRP'
let _this = this
this.getWdkCollectAndSubscribeInfoByUser()
this.getTitle(function() {
_this.getInfoById()
})
},
watch: {
'$route': function(res) {
let _this = this
this.getWdkCollectAndSubscribeInfoByUser()
this.getTitle(function() {
_this.getInfoById()
})
}
},
methods: {
iconClick() {
if (this.$route.query.goRouter) {
this.$router.push({
path: this.$route.query.goRouter,
query: {
searchValue: this.$route.query.searchValue,
activeTab: this.$route.query.activeTab
}
})
} else {
this.$router.go(-1)
}
},
getWdkCollectAndSubscribeInfoByUser() {
getAction('/phone/search/getWdkCollectAndSubscribeInfoByUser', { id: this.$route.query.id }).then((res) => {
if (res.success) {
if (res.result.subscribeList && res.result.subscribeList.length > 0) {
this.subscribeFlag = '1'
} else {
this.subscribeFlag = '0'
}
if (res.result.collectionList && res.result.collectionList.length > 0) {
this.collectFlag = '1'
} else {
this.collectFlag = '0'
}
}
})
},
getTitle(callback) {
this.show = true
let _id = this.$route.query.id
getAction(this.url.getTitle, { id: _id }).then((res) => {
if (res.success) {
this.serial_number = res.result
callback && callback()
} else {
this.serial_number = ''
}
})
},
getInfoById() {
let _id = this.$route.query.id
getAction(this.url.getInfo, { id: _id }).then((res) => {
if (res.success) {
this.detailList = res.result
this.show = false
} else {
this.detailList = []
}
})
},
collectionClick() {
let url = ''
if (this.collectFlag == 0 || !this.collectFlag) {
url = 'document/bussDocumentLibraryEO/addCollect'
} else {
url = 'document/bussDocumentLibraryEO/cancelCollect'
}
getAction(url, { id: this.$route.query.id }).then((res) => {
if (res.success) {
Toast(this.$t('OperationSuccessful'))
this.getWdkCollectAndSubscribeInfoByUser()
} else {
Toast(this.$t('operationFailed'))
}
})
},
subscribeClick() {
let url = ''
if (this.subscribeFlag == 0 || !this.subscribeFlag) {
url = 'document/bussDocumentLibraryEO/addSubscribe'
} else {
url = 'document/bussDocumentLibraryEO/cancelSubscribe'
}
getAction(url, { id: this.$route.query.id }).then((res) => {
if (res.success) {
Toast(this.$t('OperationSuccessful'))
this.getWdkCollectAndSubscribeInfoByUser()
} else {
Toast(this.$t('operationFailed'))
}
})
},
getPage() {
let query = {
pageNo: this.pageNo,
pageSize: 10,
bussDocumentLibraryId: this.$route.query.id
}
getAction(this.url.getPage, query).then((res) => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.dataGrad = this.dataGrad.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.dataGrad = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.dataGrad = []
}
})
},
onLoad() {
if (this.finished) {
this.dataGrad = []
this.finished = false
} else {
this.pageNo++
this.getPage()
}
},
fileClick(item) {
kkFileView(item.fileName, item.id)
},
urlClick(item) {
window.open(item.value)
},
numClick(item) {
this.$router.push({
path: '/phoneDocumentDetails',
query: {
id: item.id
}
})
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.fixed {
/*position: fixed;*/
/*top: 0;*/
/*left: 0;*/
/*width: 100%;*/
/*z-index: 1000;*/
/*background: #fff;*/
/*padding-top: 0.4rem;*/
}
.header-search {
/*padding-left: 0.4rem;*/
/*padding-right: 0.4rem;*/
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.header-right {
margin-top: 0.4rem;
display: flex;
justify-content: flex-end;
}
.header-right-text {
display: flex;
align-items: center;
margin-right: 0.4rem;
}
.header-right-text:last-child {
margin-right: 0.1rem;
}
.header-right-text img {
width: 0.4rem;
}
.header-right-text span {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #000000;
margin-left: 0.1rem;
}
.collapse {
margin-top: 0.6rem;
}
::v-deep .van-cell {
padding: 0;
}
::v-deep .van-cell::after {
border-bottom: none;
}
::v-deep .van-collapse-item--border::after {
border-top: none;
}
::v-deep .van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
border-width: 0;
}
::v-deep .van-cell__title span {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
}
::v-deep .collapse .van-icon {
font-size: 0.44rem;
color: #040B29;
}
::v-deep .van-collapse-item {
margin-bottom: 0.6rem;
}
.content-box-type-box {
margin-top: 0.08rem;
margin-bottom: 0.4rem;
}
.content-box-type {
display: flex;
}
.content-box-type-box:last-child {
margin-bottom: 0.1rem;
}
.content-box-left {
display: inline-block;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6F7385;
flex: auto;
min-width: 2rem;
}
.content-box-left-num {
display: inline-block;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6F7385;
width: 100%;
flex: none;
}
.content-box-text-num {
text-align: left;
width: 100%;
margin-top: 0.2rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #01A0AC;
word-break: break-all;
flex: none;
display: inline-block;
}
.content-box-text {
text-align: right;
margin-left: 0.3rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
}
::v-deep .van-collapse-item__content {
padding: 0.5rem 0;
}
.textInformation {
padding: 0.2rem 0 0 0;
}
.textInformationText {
margin-bottom: 0.5rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.textInformationFile {
margin-bottom: 0.3rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #01A0AC;
word-break: break-all;
}
.Implementation {
width: 100%;
padding: 0.2rem 0 0.3rem 0;
border-bottom: 1px solid #E6E7EC;
margin-bottom: 0.2rem;
}
.ImplementationText {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.ImplementationBox {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 0.2rem;
margin-bottom: 0.2rem;
}
.ImplementationBoxLeft {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
}
.ImplementationBoxRight {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
}
.ImplementationButtom {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #41475E;
word-break: break-all;
}
::v-deep .van-loading {
color: #fff;
font-size: 0.36rem;
}
::v-deep .van-loading__text {
color: #fff;
font-size: 0.46rem;
}
::v-deep .van-overlay {
z-index: 1001;
text-align: center;
line-height: 30;
display: flex;
align-items: center;
justify-content: center;
}
.header-right-text-color {
color: #01A0AC !important;
}
</style>
@@ -0,0 +1,211 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{$route.query.projectName + ' ' + $t('preHomoFlow')}}
</span>
</div>
<div class="content">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-text" @click="handlingClick(item)" v-for="(item,index) in list">
<div class="content-text-left">
<div class="content-text-top">
<span class="content-text-top-left">
{{item.category}}
</span>
<span class="content-text-top-right">
{{item.inspectionItem}}
</span>
</div>
<div class="content-text-button">
<span>{{item.serialNumber}}</span>
</div>
</div>
<div class="content-text-right">
<van-icon name="arrow"/>
</div>
</div>
</van-list>
</div>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
export default {
name: 'phoneHandlingPage',
data() {
return {
page: '/phone/toDoCenter/queryPreHomoPage',
list: [],
pageNo: 0,
pageSize: 10,
loading: false,
finished: false,
isDisplay:false,
}
},
mounted() {
document.title = 'NIO GRP'
this.isDisplay = JSON.parse(this.$route.query.isDisplay)
},
methods: {
iconClick() {
if (this.$route.query.goRouter) {
this.$router.push({
path: this.$route.query.goRouter,
query: {
searchValue: this.$route.query.searchValue,
activeTab: this.$route.query.activeTab
}
})
} else {
this.$router.go(-1)
}
},
handlingClick(item) {
this.$router.push({
path: '/phonePreHomoMangement',
query: {
taskDefinitionKey: this.$route.query.taskDefinitionKey,
projectName:this.$route.query.projectName,
id: item.id,
isDisplay:this.isDisplay
}
})
},
onLoad() {
if (this.finished) {
this.list = []
this.finished = false
} else {
this.pageNo++
this.getPage()
}
},
getPage() {
let params = {
pageNo: this.pageNo,
pageSize: this.pageSize,
taskDefinitionKey: this.$route.query.taskDefinitionKey,
projectLibraryId: this.$route.query.projectLibraryId
}
getAction(this.page, params).then(res => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.list = this.list.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.list = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.subscribeList = []
}
})
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.header-search {
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content {
margin-top: 0.36rem;
}
.content-text {
padding: 0.3rem 0;
box-sizing: border-box;
display: flex;
align-items: center;
border-bottom: 0.02rem solid #E6E7EC;
}
.content-text-left {
width: calc(100% - 1rem);
}
.content-text-right {
width: 1rem;
text-align: right;
}
.content-text-top {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.content-text-button {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
margin-top: 0.13rem;
}
.content-text-right .van-icon {
font-size: 0.5rem;
color: #040B29;
}
.content-text-top-right {
margin-left: 0.3rem;
}
.content-text-top-left {
word-break: break-all;
}
.content-text-top-right {
word-break: break-all;
}
</style>
+284
View File
@@ -0,0 +1,284 @@
<template>
<div class="box">
<div class="box-header">
<div class="img-header">
<img src="~@/assets/logoOne.png" alt="">
</div>
</div>
<div class="name-header">
{{user.username}}
</div>
<div class="eamil-header">
{{user.email}}
</div>
<div class="content-box-top" @click="recentBrowsingClick">
<img src="~@/assets/icon_eye.png" class="content-box-img" alt="">
<span class="content-box-text">
{{$t('recentBrowsing')}}
</span>
<van-icon class="icon" name="arrow"/>
</div>
<div class="content-box" @click="collectionClick">
<img src="~@/assets/icon_star.png" class="content-box-img" alt="">
<span class="content-box-text">
{{$t('myCollection')}}
</span>
<van-icon class="icon" name="arrow"/>
</div>
<div class="content-box" @click="subscribeClick">
<img src="~@/assets/icon_link.png" class="content-box-img" alt="">
<span class="content-box-text">
{{$t('mySubscription')}}
</span>
<van-icon class="icon" name="arrow"/>
</div>
<!-- <div class="content-box">-->
<!-- <img src="~@/assets/icon_assign.png" class="content-box-img" alt="">-->
<!-- <span class="content-box-text">-->
<!-- 退出登录-->
<!-- </span>-->
<!-- <van-icon class="icon" name="arrow"/>-->
<!-- </div>-->
<div class="content-box">
<img src="~@/assets/yuyan.png" class="content-box-img" alt="">
<span class="content-box-text-one">
{{$t('languageSwitching')}}
</span>
<span class="lang" v-if="checked">En</span>
<span class="lang" v-else>中文</span>
<van-switch @change="checkedChange" :loading="isLoading" v-model="checked"/>
</div>
<van-tabbar v-model="active" @change="onChange">
<van-tabbar-item name="search" icon="search">{{$t('phoneSearch')}}</van-tabbar-item>
<van-tabbar-item name="toDoCenter" icon="bell">{{$t('todocenter')}}</van-tabbar-item>
<van-tabbar-item name="taskData" icon="underway">{{$t('taskStatistics')}}</van-tabbar-item>
<van-tabbar-item name="home" icon="manager">{{$t('mine')}}</van-tabbar-item>
</van-tabbar>
</div>
</template>
<script>
import Vue from 'vue'
import store from '../../store'
import router, { resetRouter } from '../../router'
import moment from 'moment'
import { mapActions, mapGetters, mapState } from 'vuex'
import { getFileAccessHttpUrl, getAction } from '@/api/manage'
import enUS from 'ant-design-vue/lib/locale/en_US'
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN'
import { UI_CACHE_DB_DICT_DATA, ACCESS_TOKEN } from '@/store/mutation-types'
import { generateIndexRouter } from '@/utils/util'
moment.locale('zh-cn')
const EN = 'en-us'
const ZH = 'zh-cn'
export default {
name: 'phoneHome',
data() {
return {
active: 'home',
checked: localStorage.getItem('language') == 'en-us' ? true : false,
isLoading: false,
user: {}
}
},
mounted() {
document.title = 'NIO GRP'
this.user = this.userInfo()
},
methods: {
...mapGetters(['userInfo']),
onChange(value) {
if (value == 'toDoCenter') {
this.$router.push({
path: '/phoneToDoCenter'
})
} else if (value == 'taskData') {
this.$router.push({
path: '/phoneTaskData'
})
} else if (value == 'search') {
this.$router.push({
path: '/phoneSearch'
})
}
},
subscribeClick() {
this.$router.push({
path: '/phoneMySubscribe'
})
},
collectionClick() {
this.$router.push({
path: '/phoneMyCollection'
})
},
recentBrowsingClick() {
this.$router.push({
path: '/phoneRecentBrowsing'
})
},
checkedChange(value) {
if (value) {
this.changeLocale('en-us')
} else {
this.changeLocale('zh-cn')
}
},
changeLocale(localeval) {
this.isLoading = true
switch (localeval) {
case 'zh-cn':
localStorage.setItem('language', 'zh-cn')
break
case 'en-us':
localStorage.setItem('language', 'en-us')
break
}
getAction('/sys/dict/queryAllDictItemsByCut', {}).then((res) => {
if (res.success) {
Vue.ls.remove(UI_CACHE_DB_DICT_DATA)
Vue.ls.set(UI_CACHE_DB_DICT_DATA, res.result, 7 * 24 * 60 * 60 * 1000)
store.dispatch('GetPermissionList').then(res => {
const menuData = res.result.menu
resetRouter()
let constRoutes = []
constRoutes = generateIndexRouter(menuData)
router.addRoutes(constRoutes)
this.$root.Bus.$emit('switchLanguage', localeval)
this.isLoading = false
this.localeval = localeval
if (localeval === EN) {
moment.locale(EN)
this.$i18n.locale = EN
this.locale = enUS
} else {
moment.locale(ZH)
this.$i18n.locale = ZH
this.locale = zhCN
}
})
}
})
}
}
}
</script>
<style scoped>
::v-deep .van-tabbar-item--active {
color: #00B3BE;
}
.box {
padding: 0.4rem;
}
.box-header {
padding-top: 0.8rem;
text-align: center;
display: flex;
justify-content: center;
}
.img-header {
width: 3rem;
height: 3rem;
border-radius: 50%;
background: #D9D9D9;
line-height: 3rem;
text-align: center;
}
.name-header {
font-size: 0.4rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
text-align: center;
margin-top: 0.5rem;
}
.eamil-header {
font-size: 0.36rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #595E72;
text-align: center;
margin-top: 0.2rem;
}
.content-box-top {
border-top: 1px solid #E6E7EC;
margin-top: 0.8rem;
height: 1.6rem;
border-bottom: 1px solid #E6E7EC;
display: flex;
align-items: center;
}
.content-box {
height: 1.6rem;
border-bottom: 1px solid #E6E7EC;
display: flex;
align-items: center;
}
.content-box-img {
width: 0.52rem;
}
.content-box-text {
font-size: 0.4rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
width: calc(100% - 0.9rem);
}
.content-box-text-one {
font-size: 0.4rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
width: calc(100% - 1.8rem);
}
.icon {
font-size: 0.46rem;
font-weight: 500;
color: #040B29;
}
::v-deep .van-switch {
background-color: #BBBDC7;
height: 0.6rem;
width: 1.4rem;
}
::v-deep .van-switch__node {
width: 0.6rem;
height: 0.6rem;
}
::v-deep .van-switch--on {
background-color: #00B3BE;
}
::v-deep .van-switch--on .van-switch__node {
transform: translateX(0.56rem)
}
.lang {
font-size: 0.36rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
display: inline-block;
width: 1rem;
margin-right: 0.2rem;
}
</style>
@@ -0,0 +1,324 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{$t('myCollection')}}
</span>
</div>
<van-tabs v-model="activeTab" @change="activeChange">
<van-tab name="documentLibrary" :title="$t('DocumentLibrary')"></van-tab>
<van-tab name="problemKnowledgeBase" :title="$t('problemKnowledgeBase')"></van-tab>
</van-tabs>
<div class="content" v-if="activeTab == 'documentLibrary'">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-text" @click="collectionClick(item)" v-for="(item,index) in collectionList" :key="index">
<div class="content-text-left">
<div class="content-text-top">
<span class="content-text-top-left">
{{item.serialNumber}}
</span>
</div>
<div class="content-text-button">
<span> {{item.title}}</span>
</div>
</div>
<div class="content-text-right">
<van-icon name="arrow"/>
</div>
</div>
</van-list>
</div>
<div class="content" v-else-if="activeTab == 'problemKnowledgeBase'">
<van-list
v-model="problemLoading"
:finished="problemFinished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="problemOnLoad"
>
<div class="content-text" @click="problemKnowledgeBaseClick(item)" v-for="(item,index) in problemList"
:key="index">
<div class="content-text-left">
<!-- <div class="content-text-top">-->
<!-- <span class="content-text-top-left">-->
<!-- {{item.serialNumber}}-->
<!-- </span>-->
<!-- </div>-->
<div class="content-text-button">
<span> {{item.title}}</span>
</div>
</div>
<div class="content-text-right">
<van-icon name="arrow"/>
</div>
</div>
</van-list>
</div>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
export default {
name: 'phoneMyCollection',
data() {
return {
collectionList: [],
pageNo: 0,
pageSize: 10,
loading: false,
finished: false,
activeTab: 'documentLibrary',
problemList: [],
problemLoading: false,
problemFinished: false,
problemPageNo: 1,
url: {
documentLibraryUrl: 'collection/onlCgformCollection/page',
problemKnowledgeBaseUrl: '/problemKnowledgeBase/problemKnowledgeBaseCollectEO/queryCollectPageList'
}
}
},
mounted() {
document.title = 'NIO GRP'
// this.getCollection()
},
methods: {
iconClick() {
this.$router.go(-1)
},
activeChange() {
if (this.activeTab == 'documentLibrary') {
this.loading = true
this.collectionList = []
this.finished = false
this.pageNo = 1
this.getCollection()
} else if (this.activeTab == 'problemKnowledgeBase') {
this.problemLoading = true
this.problemList = []
this.problemFinished = false
this.problemPageNo = 1
this.getProblem()
}
},
onLoad() {
if (this.finished) {
this.collectionList = []
this.finished = false
} else {
this.pageNo++
this.getCollection()
}
},
problemOnLoad() {
if (this.problemFinished) {
this.problemList = []
this.problemFinished = false
} else {
this.problemPageNo++
this.getProblem()
}
},
getProblem() {
let params = {
pageNo: this.problemPageNo,
pageSize: 10
}
getAction(this.url.problemKnowledgeBaseUrl, params).then(res => {
if (res.success) {
let result = res.result ? res.result.records : []
if (result.length > 0 && this.problemPageNo > 1) {
this.problemList = this.problemList.concat(result)
} else if (result.length > 0 && this.problemPageNo == 1) {
this.problemList = result
} else if (result.length == 0) {
this.problemFinished = true
}
this.problemLoading = false
} else {
this.problemList = []
}
})
},
getCollection() {
let params = {
pageNo: this.pageNo,
pageSize: this.pageSize
}
postAction(this.url.documentLibraryUrl, params).then(res => {
if (res.success) {
let result = res.result ? res.result.records : []
if (result.length > 0 && this.pageNo > 1) {
this.collectionList = this.collectionList.concat(result)
} else if (result.length > 0 && this.pageNo == 1) {
this.collectionList = result
} else if (result.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.collectionList = []
}
})
},
recentBrowseAdd(browseType, id) {
let query = {
browseType: browseType,
browseDataId: id
}
postAction('/phone/recentBrowse/add', query).then((res) => {
})
},
collectionClick(item) {
this.recentBrowseAdd('Document Library', item.documentId)
this.$router.push({
path: '/phoneDocumentDetails',
query: {
id: item.documentId
}
})
},
problemKnowledgeBaseClick(item) {
this.recentBrowseAdd('Knowledge sharing', item.id)
this.$router.push({
path: '/phoneProblemKnowledgeBase',
query: {
id: item.id
}
})
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
::v-deep .van-tabbar-item--active {
color: #00B3BE;
}
.header-search {
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content {
margin-top: 0.26rem;
}
.content-text {
padding: 0.3rem 0;
box-sizing: border-box;
display: flex;
align-items: center;
border-bottom: 0.02rem solid #E6E7EC;
}
.content-text-left {
width: calc(100% - 1rem);
}
.content-text-right {
width: 1rem;
text-align: right;
}
.content-text-top {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.content-text-button {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
margin-top: 0.13rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content-text-right .van-icon {
font-size: 0.5rem;
color: #040B29;
}
.content-text-top-right {
margin-left: 0.3rem;
}
::v-deep .van-tab {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
flex: none;
margin-right: 0.2rem;
}
::v-deep .van-tab--active {
font-size: 0.38rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
}
::v-deep .van-tabs {
margin-top: 0.36rem;
}
::v-deep .van-tabs__line {
background-color: #00B3BE;
}
</style>
@@ -0,0 +1,203 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{$t('mySubscription')}}
</span>
</div>
<div class="content">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-text" @click="collectionClick(item)" v-for="(item,index) in subscribeList" :key="index">
<div class="content-text-left">
<div class="content-text-top">
<span class="content-text-top-left">
{{item.serialNumber}}
</span>
<!-- <span class="content-text-top-right">-->
<!-- 测试检验项目-->
<!-- </span>-->
</div>
<div class="content-text-button">
<span>{{item.title}}</span>
</div>
</div>
<div class="content-text-right">
<van-icon name="arrow"/>
</div>
</div>
</van-list>
</div>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
export default {
name: 'phoneMySubscribe',
data() {
return {
subscribeList: [],
pageNo: 0,
pageSize: 10,
loading: false,
finished: false
}
},
mounted() {
document.title = 'NIO GRP'
// this.getSubscribe()
},
methods: {
iconClick() {
this.$router.go(-1)
},
onLoad() {
if (this.finished) {
this.subscribeList = []
this.finished = false
} else {
this.pageNo++
this.getSubscribe()
}
},
getSubscribe() {
let params = {
pageNo: this.pageNo,
pageSize: this.pageSize
}
postAction(`subscribe/onlCgformSubscribe/page`, params).then(res => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.subscribeList = this.subscribeList.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.subscribeList = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.subscribeList = []
}
})
},
recentBrowseAdd(browseType, id) {
let query = {
browseType: browseType,
browseDataId: id
}
postAction('/phone/recentBrowse/add', query).then((res) => {
})
},
collectionClick(item) {
this.recentBrowseAdd('Document Library', item.documentId)
this.$router.push({
path: '/phoneDocumentDetails',
query: {
id: item.documentId
}
})
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.header-search {
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content {
margin-top: 0.36rem;
}
.content-text {
padding: 0.3rem 0;
box-sizing: border-box;
display: flex;
align-items: center;
border-bottom: 0.02rem solid #E6E7EC;
}
.content-text-left {
width: calc(100% - 1rem);
}
.content-text-right {
width: 1rem;
text-align: right;
}
.content-text-top {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.content-text-button {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
margin-top: 0.13rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content-text-right .van-icon {
font-size: 0.5rem;
color: #040B29;
}
.content-text-top-right {
margin-left: 0.3rem;
}
</style>
@@ -0,0 +1,943 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{$route.query.projectName + ' ' + $t('preHomoFlow')}}
</span>
</div>
<van-collapse class="collapse" v-model="activeNames">
<van-collapse-item :title="$t('essentialInformation')" name="1">
<div class="content-box-type">
<span class="content-box-left">{{$t('category')}}</span>
<span class="content-box-text">{{queryForm.category || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('inspectionItems')}}</span>
<span class="content-box-text">{{queryForm.inspectionItem || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('configurationItem')}}</span>
<span class="content-box-text">{{queryForm.configItem || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">WVTA ID</span>
<span class="content-box-text">{{queryForm.wvtaId || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('standardNo')}}</span>
<span class="content-box-text content-box-text-color"
@click="standardClick(queryForm)">{{queryForm.serialNumber || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('areaOfResponsibility')}}</span>
<span class="content-box-text">{{queryForm.dutyTerritoryName || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('engineeringInterfacePerson')}}</span>
<span class="content-box-text">{{queryForm.sdtName || '--'}}</span>
</div>
</van-collapse-item>
<van-collapse-item :title="$t('TaskRequirements')" name="2">
<div class="content-box-type">
<span class="content-box-left">{{$t('personLiable')}}</span>
<span class="content-box-text">{{queryForm.dutyPersonName || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('cutoffTime')}}</span>
<span class="content-box-text">{{queryForm.endTime || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('typeOfDeliverables')}}</span>
<span class="content-box-text">{{queryForm.deliverableTypeName || '--'}}</span>
</div>
<div class="content-box-type-text">
{{$t('deliverableTemplate')}}
</div>
<div class="content-box-type-text-one"
style="color: #040B29"
v-if="dataSourceFile && dataSourceFile.length == 0">
--
</div>
<div class="content-box-type-text-one"
v-else
@click="deliverablesResultFileClick(item)"
v-for="item in dataSourceFile">
{{item.fileName}}
</div>
<!-- <div class="content-box-type-text">-->
<!-- {{$t('descriptionDeliverables')}}-->
<!-- </div>-->
<!-- <div class="content-box-type-text-Two">-->
<!-- {{queryProject[queryData.remarks] || '&#45;&#45;'}}-->
<!-- </div>-->
</van-collapse-item>
<van-collapse-item v-if="queryForm.deliveryResult"
:title="$t('DeliverablesResult')" name="3">
<!-- v-for="item in deliverablesResultFile"-->
<!-- {{item.fileName}}-->
<div class="content-box-type-text-one"
v-if="queryForm.valueType == 'file'"
v-for="item in deliveryResultList"
@click="deliverablesResultFileClick(item)">
{{item.fileName}}
</div>
<div class="content-box-type-text-one-select"
v-if="queryForm.valueType == 'select'">
{{queryForm.deliveryResult == '1' ? $t('yes') :$t('not')}}
</div>
<div class="content-box-type-text-one-select"
v-if="queryForm.valueType == 'text'">
{{queryForm.deliveryResult}}
</div>
</van-collapse-item>
<van-collapse-item :title="$t('taskHandling')" v-if="!isDisplay" name="4">
<van-form @submit="onSubmit" ref="form">
<div class="resultofhandlingClass"
v-if="$route.query.taskDefinitionKey == 'Task Review' ||
$route.query.taskDefinitionKey == 'Task responsibility confirmation' ||
($route.query.taskDefinitionKey == 'Task handling' && (queryForm.valueType == 'file' ||
queryForm.valueType == 'text' || queryForm.valueType == 'select'))"
style="margin-bottom: 0.1rem">
<span>{{$t('resultofhandling')}}</span>
<span class="requiredClass"
v-if="$route.query.taskDefinitionKey == 'Task Review' ||
$route.query.taskDefinitionKey == 'Task responsibility confirmation'">
*</span>
</div>
<van-field name="disposeResult"
class="uploader"
v-if="$route.query.taskDefinitionKey == 'Task Review' ||
$route.query.taskDefinitionKey == 'Task responsibility confirmation'"
:rules="[{ required: true, message: $t('resultofhandling') + $t('cannotEmpty') }]">
<template #input>
<van-radio-group @change="disposeResultChange" v-model="form.disposeResult" direction="horizontal">
<van-radio name="rzgcssc_tg" v-if="$route.query.taskDefinitionKey == 'Task Review'">
{{$t('reviewAndPass')}}
</van-radio>
<van-radio name="rzgcssc_th" v-if="$route.query.taskDefinitionKey == 'Task Review'">
{{$t('reviewAndReturn')}}
</van-radio>
<van-radio name="zrrjsrw" v-if="$route.query.taskDefinitionKey == 'Task responsibility confirmation'">
{{$t('missionAccepted')}}
</van-radio>
<van-radio name="zrrjjrw" v-if="$route.query.taskDefinitionKey == 'Task responsibility confirmation'">
{{$t('missionRejection')}}
</van-radio>
</van-radio-group>
</template>
</van-field>
<van-field
v-if="form.disposeResult == 'rzgcssc_tg'"
v-model.trim="form.reportNumber"
rows="4"
name="reportNumber"
class="textarea"
autosize
:label="$t('reportNo')"
maxlength="200"
:placeholder="$t('pleaseEnter')+$t('reportNo')"
/>
<van-field
v-if="form.disposeResult == 'rzgcssc_tg'"
v-model.trim="form.productModel"
rows="4"
name="productModel"
class="textarea"
autosize
:label="$t('productModel')"
maxlength="200"
:placeholder="$t('pleaseEnter')+$t('productModel')"
/>
<van-field
v-if="form.disposeResult == 'rzgcssc_tg'"
v-model.trim="form.productionEnterpriseName"
rows="4"
class="textarea productionEnterpriseName"
autosize
name="productionEnterpriseName"
:label="$t('nameOfManufacturer')"
maxlength="200"
:placeholder="$t('pleaseEnter')+$t('nameOfManufacturer')"
/>
<div class="resultofhandlingClass"
v-if="form.disposeResult == 'rzgcssc_th' || form.disposeResult == 'zrrjjrw'">
<span>{{$t('feedback')}}</span>
<span class="requiredClass">*</span>
</div>
<van-field
v-if="form.disposeResult == 'rzgcssc_th' || form.disposeResult == 'zrrjjrw'"
v-model.trim="form.reasonForReturn"
rows="4"
name="reasonForReturn"
class="textarea"
autosize
:show-error="false"
:rules="[{ required: true, message: $t('feedbackMessage') + $t('cannotEmpty') }]"
maxlength="200"
type="textarea"
:placeholder="$t('pleaseEnter')+$t('feedbackMessage')"
/>
<div v-if="$route.query.taskDefinitionKey == 'Task handling'">
<div class="resultofhandlingClass">
<span>{{$t('DeliverablesResult')}}</span>
<span class="requiredClass">*</span>
</div>
<van-field name="uploader" class="uploader"
:rules="[{ required: true, message: $t('DeliverablesResult') + $t('cannotEmpty') }]"
v-if="queryForm.valueType == 'file'">
<template #input>
<van-uploader :preview-image="false"
accept="*"
v-model="form.deliveryResult"
:after-read="upload"
class="uploader-button">
<van-button icon="back-top" type="primary">{{$t('upload1')}}</van-button>
</van-uploader>
</template>
</van-field>
<van-field
v-else-if="queryForm.valueType == 'text'"
:rules="[{ required: true, message: $t('DeliverablesResult') + $t('cannotEmpty') }]"
v-model.trim="form.deliveryResult"
rows="4"
class="textarea"
autosize
:show-error="false"
maxlength="200"
:placeholder="$t('pleaseEnter')+$t('DeliverablesResult')"
/>
<van-field name="disposeResult"
class="uploader"
v-else-if="queryForm.valueType == 'select'"
:rules="[{ required: true, message: $t('DeliverablesResult') + $t('cannotEmpty') }]">
<template #input>
<van-radio-group v-model="form.deliveryResult" direction="horizontal">
<van-radio name="1">
{{$t('yes')}}
</van-radio>
<van-radio name="2">
{{$t('not')}}
</van-radio>
</van-radio-group>
</template>
</van-field>
<div class="file-list"
v-for="(item,index) in fileList"
:key="index">
<span class="file-text">{{item.fileName}}
<van-icon class="file-text-icon" name="passed"/>
</span>
<a-icon @click="fileClick(index)" class="icon-text" type="delete"/>
</div>
</div>
<van-button class="submitButton"
round
block
type="info"
native-type="submit">{{$t('submit')}}
</van-button>
</van-form>
</van-collapse-item>
</van-collapse>
<van-overlay :show="show">
<van-loading type="spinner">{{textLoading}}</van-loading>
</van-overlay>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import { Dialog, Toast } from 'vant'
import Vue from 'vue'
import { ACCESS_TOKEN } from '@/store/mutation-types'
import { kkFileView } from '@/utils/kkfileView'
import axios from 'axios'
export default {
name: 'phonePreHomoMangement',
data() {
return {
activeNames: ['1', '2', '3', '4'],
fileList: [],
show: false,
textLoading: this.$t('loading'),
queryForm: {},
queryData: {},
form: {},
uploadAction: window._CONFIG['domianURL'] + '/sys/common/upload',
queryProject: {},
dataSourceFile: [],
deliverablesResultFile: [],
deliveryResultList: [],
isDisplay: false,
url: {
queryProjectCertificationInventoryById: '/phone/toDoCenter/queryProjectCertificationInventoryById',
saveBatch: '/project/projectCertificationInventoryEO/saveBatch'
}
}
},
mounted() {
document.title = 'NIO GRP'
this.isDisplay = JSON.parse(this.$route.query.isDisplay)
this.getData()
},
methods: {
iconClick() {
this.$router.go(-1)
},
getFileInfos(item) {
getAction('sys/common/getFileInfos', { id: item }).then((res) => {
if (res.success) {
this.deliveryResultList = res.result
this.fileList = []
this.form.deliveryResult = []
this.deliveryResultList.forEach((val) => {
let fileName = val.fileName
let index1 = fileName.lastIndexOf('.')
let index2 = fileName.length
let fileSuffix = fileName.substring(index1, index2)
val.fileSuffix = fileSuffix
this.fileList.push({
id: val.id,
fileName: val.fileName
})
})
this.form.deliveryResult = this.fileList
} else {
this.deliveryResultList = []
}
})
},
getDeliveryResult(item) {
getAction('sys/common/getFileInfos', { id: item }).then((res) => {
if (res.success) {
this.dataSourceFile = res.result
this.dataSourceFile.forEach((val) => {
let fileName = val.fileName
let index1 = fileName.lastIndexOf('.')
let index2 = fileName.length
let fileSuffix = fileName.substring(index1, index2)
val.fileSuffix = fileSuffix
})
} else {
this.dataSourceFile = []
}
})
},
disposeResultChange(value) {
if (value == 'rzgcssc_tg') {
this.form.reasonForReturn = ''
} else if (value == 'rzgcssc_th') {
this.form.productionEnterpriseName = ''
this.form.productModel = ''
this.form.reportNumber = ''
} else if (value == 'zrrjsrw') {
this.form.reasonForReturn = ''
} else if (value == 'zrrjjrw') {
this.form.reasonForReturn = ''
}
this.$nextTick(() => {
this.form = { ...this.form }
})
},
onSubmit() {
this.$refs.form.validate().then(() => {
this.textLoading = this.$t('Submitting')
this.show = true
if (this.$route.query.taskDefinitionKey == 'Task Review') {
if (this.form.disposeResult == 'rzgcssc_tg') {
this.preservationClick()
} else {
this.ApprovedClick()
}
} else if (this.$route.query.taskDefinitionKey == 'Task handling') {
this.submitPreservation()
} else if (this.$route.query.taskDefinitionKey == 'Task responsibility confirmation') {
this.ApprovedClick()
}
})
},
submitClick() {
let query = {
'nodeKey': 'zrrtjrw',
'projectLibraryId': this.queryForm.projectLibraryId,
'ids': this.queryForm.id
}
postAction('/project/projectCertificationInventoryEO/submitTask', query).then((res) => {
if (res.success) {
Toast(this.$t('OperationSuccessful'))
this.$router.go(-1)
this.show = false
} else {
Toast(this.$t('operationFailed'))
}
})
},
submitPreservation() {
let content = []
let fileListId = []
let form = JSON.parse(JSON.stringify(this.form))
if (this.queryForm.valueType == 'file') {
this.fileList.forEach(res => {
fileListId.push(res.id)
})
form.deliveryResult = fileListId.join(',')
}
content[0] = Object.assign(this.queryForm, form)
postAction(this.url.saveBatch, { 'dataList': content }).then((res) => {
if (res.success) {
this.submitClick()
}
})
},
ApprovedClick() {
let query = {
'nodeKey': this.form.disposeResult,
'projectLibraryId': this.queryForm.projectLibraryId,
'ids': this.queryForm.id,
reasonForReturn: this.form.reasonForReturn
}
postAction('/project/projectCertificationInventoryEO/submitTask', query).then((res) => {
if (res.success) {
Toast(this.$t('OperationSuccessful'))
this.$router.go(-1)
this.show = false
} else {
Toast(this.$t('operationFailed'))
}
})
},
//保存
preservationClick() {
let content = []
content[0] = Object.assign(this.queryForm, this.form)
postAction(this.url.saveBatch, { 'dataList': content }).then((res) => {
if (res.success) {
this.ApprovedClick()
}
})
},
getData() {
getAction(this.url.queryProjectCertificationInventoryById, { id: this.$route.query.id }).then((res) => {
if (res.success) {
this.queryForm = res.result || {}
if (this.queryForm.deliveryResult && this.queryForm.valueType == 'file') {
this.getFileInfos(this.queryForm.deliveryResult)
}
if (this.queryForm.deliverableTemplate) {
this.getDeliveryResult(this.queryForm.deliverableTemplate)
}
this.queryForm = { ...this.queryForm }
} else {
this.queryForm = {}
}
})
},
async upload(file) {
// 这时候我们创建一个formData对象实例
const formData = new FormData()
// 通过append方法添加需要的file
// 这里需要注意 append(key, value)来添加数据如果指定的key不存在则会新增一条数据如果key存在则添加到数据的末尾
formData.append('file', file.file)
// 调用uploadFile上传的接口
const res = await this.uploadFile(formData)
this.fileList.push(res)
// 上传文件的guid和后台返回的guid一样通过push方法把上传的文件存放到上传成功才能提交的数组里面
},
uploadFile(formData) {
this.textLoading = this.$t('loading')
this.show = true
return new Promise(resolve => {
const token = Vue.ls.get(ACCESS_TOKEN)
axios({
url: this.uploadAction,
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data', // 文件上传
'X-Access-Token': token
}
}).then((res) => {
resolve(res.data.result)
this.show = false
})
})
},
fileClick(index) {
this.fileList.splice(index, 1)
this.form.deliveryResult.splice(index, 1)
this.form = { ...this.form }
},
deliverablesResultFileClick(item) {
kkFileView(item.fileName, item.id)
},
standardClick(item) {
this.$router.push({
path: '/phoneDocumentDetails',
query: {
id: item.bussDocumentLibraryId
}
})
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.header-search {
/*padding-left: 0.4rem;*/
/*padding-right: 0.4rem;*/
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.collapse {
margin-top: 0.6rem;
}
::v-deep .van-cell {
padding: 0;
}
::v-deep .van-cell::after {
border-bottom: none;
}
::v-deep .van-collapse-item--border::after {
border-top: none;
}
::v-deep .van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
border-width: 0;
}
::v-deep .van-cell--clickable .van-cell__title span {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
}
::v-deep .collapse .van-cell--clickable .van-icon {
font-size: 0.44rem;
color: #040B29;
}
::v-deep .van-collapse-item {
margin-bottom: 0.6rem;
}
.content-box-type {
display: flex;
margin-top: 0.08rem;
margin-bottom: 0.4rem;
}
.content-box-type:last-child {
margin-bottom: 0.1rem;
}
.content-box-left {
display: inline-block;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6F7385;
flex: auto;
min-width: 2rem;
}
.content-box-type-text {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6F7385;
margin-bottom: 0.4rem;
}
.content-box-type-text-one {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #01A0AC;
margin-bottom: 0.4rem;
word-break: break-all;
}
.content-box-type-text-one-select {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
}
.content-box-type-text-one:last-child {
margin-bottom: 0.1rem;
}
.content-box-type-text-Two {
display: inline-block;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
}
.content-box-text {
text-align: right;
margin-left: 0.3rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
}
::v-deep .van-collapse-item__content {
padding: 0.5rem 0;
}
::v-deep .van-step__circle-container .van-icon {
font-size: 0.55rem;
background: #fff;
}
::v-deep .van-step--finish {
color: #00BEBE;
}
::v-deep .van-step--vertical {
padding: 0.26rem 0 0.46rem 0;
}
::v-deep .van-step--vertical:not(:last-child)::after {
border-bottom-width: 0;
}
.vanStepBox {
margin-left: 0.2rem;
}
.van-text {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.van-text-color {
padding: 0.19rem 0.3rem;
color: #26BD4B;
font-size: 0.34rem;
background: rgba(38, 189, 75, 0.12);
border-radius: 0.1rem;
}
.van-time {
font-size: 0.34rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
margin-top: 0.3rem;
}
.van-name {
color: #868A9A;
margin-right: 0.1rem;
font-size: 0.34rem;
}
.van-name-time {
color: #868A9A;
margin-left: 0.1rem;
font-size: 0.34rem;
}
.van-desgin {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #41475E;
margin-top: 0.3rem;
word-break: break-all;
}
.van-file {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #01A0AC;
margin-top: 0.3rem;
word-break: break-all;
}
::v-deep .van-form .van-cell__title {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #595E72;
width: 100%;
}
::v-deep .van-form .van-cell__value {
margin-top: 0.1rem;
}
::v-deep .van-form .van-radio__icon .van-icon {
width: 0.45rem;
height: 0.45rem;
line-height: 0.38rem;
}
::v-deep .van-form .van-radio__icon--checked .van-icon {
background-color: #00BEBE;
border-color: #00BEBE;
}
::v-deep .van-form .van-radio__icon {
height: 0.45rem;
}
::v-deep .van-form .van-radio__label {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
::v-deep .van-form .van-cell {
margin-bottom: 0.3rem;
}
.textarea {
display: block;
}
::v-deep .van-form .textarea .van-field__control {
background: #F5F6F7;
border-radius: 0.12rem;
padding: 0.2rem;
margin-top: 0.1rem;
}
.uploader {
display: block;
}
.uploader-button {
margin-top: 0.2rem;
}
.uploader-button .van-button--primary {
background-color: #fff;
border: 0.03rem solid #00BEBE;
color: #01A0AC;
font-size: 0.38rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
}
.uploader-button .van-button {
height: 0.9rem;
border-radius: 0.12rem;
}
.uploader-button .van-button .van-icon {
font-size: 0.42rem;
font-weight: 500;
}
::v-deep .van-loading {
color: #fff;
font-size: 0.36rem;
}
::v-deep .van-loading__text {
color: #fff;
font-size: 0.46rem;
}
::v-deep .van-overlay {
z-index: 1001;
text-align: center;
line-height: 30;
display: flex;
align-items: center;
justify-content: center;
}
.submitButton {
border-radius: 0.2rem;
background: #00B3BE;
border: none;
margin-top: 1.2rem;
}
::v-deep .van-icon-success:before {
font-size: 0.34rem;
text-align: center;
}
::v-deep .van-radio {
margin-bottom: 0.1rem;
}
.file-list {
width: 100%;
background: #FFFFFF;
border-radius: 0.2rem;
border: 0.02rem solid #E6E7EC;
padding: 0.26rem 0.4rem;
font-size: 0.38rem;
font-weight: 400;
color: #040B29;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.2rem;
}
.file-text {
display: inline-block;
margin-right: 0.3rem;
word-break: break-all;
}
.file-text-icon {
font-size: 0.41rem;
margin-left: 0.2rem;
color: #26BD4B;
font-weight: 600;
float: right;
margin-top: 0.11rem;
}
.icon-text {
font-size: 0.4rem;
color: #040B29;
}
::v-deep .van-field--error .van-field__control::placeholder {
color: #BBBDC7;
}
.van-text-status {
margin-bottom: 0.3rem;
margin-top: 0.3rem;
}
.van-collapse-item:last-child {
margin-bottom: 0;
}
.AcceptedClass {
background: #e9f8ed;
color: #26BD4B;
}
.RejectedClass {
background: #fdeaea;
color: #E83030;
}
.TransferClass {
background: #fff6e8;
color: #FDA71C;
}
.ReturnedClass {
background: #fff6e8;
color: #FDA71C;
}
.AdoptClass {
background: #e9f8ed;
color: #26BD4B;
}
.ComplianceClass {
background: #e9f8ed;
color: #26BD4B;
}
.NonComplianceClass {
background: #fdeaea;
color: #E83030;
}
.trackedClass {
background: #fff6e8;
color: #FDA71C;
}
.NAClass {
background: #f1f1f3;
color: #707486;
}
.content-box-text-color {
color: #01A0AC;
}
.resultofhandlingClass {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #595E72;
width: 100%;
}
.requiredClass {
color: #E83030;
font-size: 0.38rem;
margin-left: 0.02rem;
}
::v-deep .productionEnterpriseName .van-field__error-message {
display: none;
}
</style>
@@ -0,0 +1,694 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{queryForm.title}}
</span>
</div>
<div class="header-buttom" v-if="queryForm.problemTypeNameList && queryForm.problemTypeNameList.length > 0">
<div class="header-buttom-text" v-for="val in queryForm.problemTypeNameList">
{{val}}
</div>
</div>
<div class="problemName">
<div class="problemNameLeft">
<img src="~@/assets/icon_contact.png" class="problemNameLeftImg" alt="">
<span class="problemNameLeftText">{{queryForm.createBy}}</span>
</div>
<div class="problemNameLeft">
<img src="~@/assets/icon_time.png" class="problemNameLeftImg" alt="">
<span class="problemNameLeftText">{{queryForm.createTime}}</span>
</div>
</div>
<div class="content" v-html="queryForm.content">
</div>
<div class="contentFile" v-if="queryForm.accessoryFileNameList && queryForm.accessoryFileNameList.length > 0">
<div class="contentFile-text"
@click="fileClick(item)"
v-for="item in queryForm.accessoryFileNameList">
{{item.fileName}}
</div>
</div>
<div class="iconText">
<div class="iconTextLeft">
<img src="~@/assets/icon_kan.png" alt="">
<span class="iconTextLeft-text">
{{queryForm.browsingHistoryCount}}
</span>
</div>
<div class="iconTextLeft" @click="likeClick()">
<img v-if="!this.isPraise" src="~@/assets/icon_zan.png" alt="">
<img v-else src="~@/assets/dianzan.png" alt="">
<span class="iconTextLeft-text" :class="{'icon-active':this.isPraise}">
{{queryForm.praiseCount}}
</span>
</div>
<div class="iconTextLeft" @click="starClick()">
<img v-if="!this.isCollect" src="~@/assets/icon_shoucang.png" alt="">
<img v-else src="~@/assets/xuanzhong.png" alt="">
<span class="iconTextLeft-text" :class="{'icon-active':this.isCollect}">
{{queryForm.collectCount}}
</span>
</div>
</div>
<div class="comment">
<div class="comment-text" @click="howAboutCommentClick">
{{$t('howAboutComment')}}
</div>
<div class="comment-content" v-for="(item,index) in releaseList" :key="index">
<div class="comment-content-text">
<div class="comment-content-text-left">
<span class="comment-content-text-yuan"></span>
{{item.createBy}}
</div>
<div class="comment-content-text-right">
<span>{{item.createTime}}</span>
</div>
</div>
<div class="comment-text-box">
{{item.commentContent}}
</div>
<div class="comment-text-button">
<div class="commentRight" @click="messageClick(item)">
<img src="~@/assets/icon_reply.png" alt="">
<span>{{$t('answer')}}</span>
</div>
<div class="commentRight"
v-if="administrators || item.createBy == userInfoQuery.username"
@click="deleteClick(item)">
<img src="~@/assets/icon_rubbish.png" alt="">
<span>{{$t('delete')}}</span>
</div>
</div>
<div style="margin-top: 0.3rem"
v-if="item.problemKnowledgeBaseCommentVOList && item.problemKnowledgeBaseCommentVOList.length > 0">
<div class="reply-box" v-for="(val,index1) in item.problemKnowledgeBaseCommentVOList">
<div class="comment-content-text">
<div class="comment-content-text-left">
<span class="comment-content-text-yuan"></span>
{{val.createBy}}
</div>
<div class="comment-content-text-right">
<span>{{val.createTime}}</span>
</div>
</div>
<div class="comment-text-box">
{{val.commentContent}}
</div>
<div class="comment-text-button-one">
<div class="commentRight" @click="messageClick(item)">
<img src="~@/assets/icon_reply.png" alt="">
</div>
<div class="commentRight"
v-if="administrators || val.createBy == userInfoQuery.username"
@click="deleteClick(val)">
<img src="~@/assets/icon_rubbish.png" alt="">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="input-text" v-if="isDisplay">
<van-cell-group>
<van-field rows="1"
class="sendInput"
autosize
type="textarea"
v-model="sendValue"
placeholder="说点什么吧"/>
<van-button type="primary" :disabled="sendDisplay" @click="sendClick">{{$t('send')}}</van-button>
</van-cell-group>
</div>
</div>
</template>
<script>
import { getAction, postAction, putAction } from '@/api/manage'
import { mapGetters } from 'vuex'
import { kkFileView } from '@/utils/kkfileView'
import { deleteAction } from '../../api/manage'
import { Dialog, Toast } from 'vant'
export default {
name: 'phoneProblemKnowledgeBase',
data() {
return {
url: {
queryById: '/problemKnowledgeBase/problemKnowledgeBaseEO/queryById'
},
queryForm: {},
releaseList: [],
isCollect: false,
isPraise: false,
sendValue: '',
isDisplay: false,
commentQuery: {},
sendDisplay: true,
num: 1,
userInfoQuery: {},
administrators: false
}
},
mounted() {
document.title = 'NIO GRP'
this.administrators = false
this.userInfoQuery = this.userInfo()
if (this.userInfo().userRoleList && this.userInfo().userRoleList.length > 0) {
this.userInfo().userRoleList.forEach(res => {
if (res.roleCode == 'admin') {
this.administrators = true
}
})
}
window.addEventListener('scroll', this.scrolling)
window.addEventListener('mousedown', this.handleonmousedown)
this.getQueryBy()
this.releaseData()
this.viewAdd()
},
watch: {
sendValue: function(res) {
if (!res) {
this.sendDisplay = true
} else {
this.sendDisplay = false
}
}
},
destroyed() {
// 离开该页面需要移除这个监听的事件不然会报错
window.removeEventListener('scroll', this.handleScroll)
window.removeEventListener('mousedown', this.handleonmousedown)
},
methods: {
...mapGetters(['userInfo']),
// scrolling() {
// this.isDisplay = false
// },
handleonmousedown(e) {
if (e.srcElement.type == 'textarea' || e.target.type == 'textarea') {
} else if (e.target.innerText == this.$t('send')) {
} else {
this.isDisplay = false
}
},
iconClick() {
if (this.$route.query.goRouter) {
this.$router.push({
path: this.$route.query.goRouter,
query: {
searchValue: this.$route.query.searchValue,
activeTab: this.$route.query.activeTab
}
})
} else {
this.$router.go(-1)
}
},
viewAdd() {
let query = {
problemKnowledgeBaseId: this.$route.query.id,
browsingUserId: this.userInfo().id
}
postAction('/problemKnowledgeBase/problemKnowledgeBaseBrowsingHistoryEO/add', query).then((res) => {
})
},
getQueryBy() {
let query = {
id: this.$route.query.id
}
getAction(this.url.queryById, query).then((res) => {
if (res.success) {
this.queryForm = res.result || {}
this.queryForm = { ...this.queryForm }
if (this.queryForm.praiseEO && this.queryForm.praiseEO.praiseStatus == 'Praise') {
this.isPraise = true
} else {
this.isPraise = false
}
if (this.queryForm.collectEO && this.queryForm.collectEO.collectStatus == 'Collect') {
this.isCollect = true
} else {
this.isCollect = false
}
}
})
},
likeClick() {
if (this.isDisplay) {
this.isDisplay = false
return
}
let praiseStatus = ''
this.isPraise = !this.isPraise
if (this.isPraise) {
praiseStatus = 'Praise'
this.queryForm.praiseCount = this.queryForm.praiseCount + 1
} else {
praiseStatus = 'Cancel praise'
this.queryForm.praiseCount = this.queryForm.praiseCount - 1
}
let query = {
problemKnowledgeBaseId: this.$route.query.id,
praiseUserId: this.userInfo().id,
praiseStatus: praiseStatus,
id: this.queryForm.praiseEO ? this.queryForm.praiseEO.id : undefined
}
putAction('/problemKnowledgeBase/problemKnowledgeBasePraiseEO/edit', query).then((res) => {
if (!this.queryForm.praiseEO || !this.queryForm.praiseEO.id) {
this.queryById()
}
})
},
starClick() {
if (this.isDisplay) {
this.isDisplay = false
return
}
let collectStatus = ''
this.isCollect = !this.isCollect
if (this.isCollect) {
collectStatus = 'Collect'
this.queryForm.collectCount = this.queryForm.collectCount + 1
} else {
collectStatus = 'Cancel Collect'
this.queryForm.collectCount = this.queryForm.collectCount - 1
}
let query = {
problemKnowledgeBaseId: this.$route.query.id,
collectUserId: this.userInfo().id,
collectStatus: collectStatus,
id: this.queryForm.collectEO ? this.queryForm.collectEO.id : undefined
}
putAction('/problemKnowledgeBase/problemKnowledgeBaseCollectEO/edit', query).then((res) => {
if (!this.queryForm.collectEO || !this.queryForm.collectEO.id) {
this.queryById()
}
})
},
releaseData() {
let query = {
problemKnowledgeBaseId: this.$route.query.id
}
getAction('/problemKnowledgeBase/problemKnowledgeBaseCommentEO/list', query).then((res) => {
if (res.success) {
this.releaseList = res.result || []
} else {
this.releaseList = []
}
})
},
deleteClick(item) {
let _this = this
if (this.isDisplay) {
this.isDisplay = false
return
}
function beforeClose(action, done) {
if (action === 'confirm') {
let url = ''
if (item.problemKnowledgeBaseId) {
url = '/problemKnowledgeBase/problemKnowledgeBaseCommentEO/deleteBatch'
} else {
url = '/project/problemKnowledgeBaseReplyEO/deleteBatch'
}
deleteAction(url, { ids: item.id }).then((res) => {
if (res.success) {
Toast(_this.$t('OperationSuccessful'))
_this.releaseData()
done()
} else {
_this.$message.warning(res.message)
}
})
} else {
done()
}
}
Dialog.confirm({
message: this.$t('confirmDeletion') + '?',
beforeClose
})
},
howAboutCommentClick() {
this.isDisplay = true
this.num = 1
this.$nextTick(() => {
let vanField = document.querySelectorAll('.sendInput .van-field__control')[0]
vanField.focus()
})
},
fileClick(item) {
kkFileView(item.fileName, item.id)
},
messageClick(item) {
this.isDisplay = true
this.num = 2
this.commentQuery = item
this.$nextTick(() => {
let vanField = document.querySelectorAll('.sendInput .van-field__control')[0]
vanField.focus()
})
},
sendClick() {
if (this.num == 1) {
let query = {
problemKnowledgeBaseId: this.$route.query.id,
commentContent: this.sendValue,
commentUserId: this.userInfo().id
}
postAction('/problemKnowledgeBase/problemKnowledgeBaseCommentEO/add', query).then((res) => {
if (res.success) {
Toast(this.$t('OperationSuccessful'))
this.releaseData()
this.sendValue = ''
this.isDisplay = false
} else {
Toast(this.$t('operationFailed'))
}
})
} else {
this.handleComment()
}
},
handleComment() {
let query = {
commentId: this.commentQuery.id,
replyContent: this.sendValue
}
postAction('/project/problemKnowledgeBaseReplyEO/add', query).then((res) => {
if (res.success) {
Toast(this.$t('OperationSuccessful'))
this.releaseData()
this.sendValue = ''
this.isDisplay = false
} else {
Toast(this.$t('operationFailed'))
}
})
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.box-showModal {
position: absolute;
height: 100%;
}
.header-search {
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.header-buttom {
margin-top: 0.36rem;
text-align: right;
}
.header-buttom-text {
font-size: 0.34rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #00B3BE;
padding: 0.17rem 0.3rem;
background: rgba(0, 179, 190, 0.12);
border-radius: 0.12rem;
opacity: 1;
display: inline-block;
margin-left: 0.2rem;
}
.problemName {
display: flex;
margin-top: 0.16rem;
height: 1rem;
line-height: 1rem;
}
.problemNameLeft {
margin-right: 0.5rem;
display: flex;
align-items: center;
}
.problemNameLeftImg {
width: 0.42rem;
}
.problemNameLeftText {
font-size: 0.34rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
margin-left: 0.2rem;
margin-top: 0.07rem;
}
.content {
margin-top: 0.1rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #040B29;
word-break: break-all;
}
.contentFile {
margin-top: 0.2rem;
}
.contentFile-text {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #01A0AC;
margin-bottom: 0.2rem;
}
.iconText {
text-align: right;
display: flex;
justify-content: flex-end;
margin-top: 0.4rem;
padding-bottom: 0.6rem;
border-bottom: 0.02rem solid #E6E7EC;
}
.iconTextLeft-text {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #000000;
margin-left: 0.12rem;
}
.iconTextLeft {
display: flex;
align-items: center;
margin-left: 0.4rem;
}
.iconTextLeft img {
width: 0.46rem;
}
.comment {
margin-top: 0.8rem;
}
.comment-text {
width: 100%;
background: #F6F7FA;
border-radius: 0.23rem;
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
text-align: center;
padding: 0.36rem 0;
}
.comment-content {
padding: 0.7rem 0;
box-sizing: border-box;
border-bottom: 0.02rem solid #E6E7EC;
}
.comment-content-text {
display: flex;
justify-content: space-between;
align-items: center;
}
.comment-content-text-left {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #040B29;
display: flex;
align-items: center;
}
.comment-content-text-yuan {
width: 0.2rem;
height: 0.2rem;
display: inline-block;
border-radius: 50%;
background: #01A0AC;
margin-right: 0.2rem;
}
.comment-content-text-right {
font-size: 0.34rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
}
.comment-text-box {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #41475E;
word-break: break-all;
margin-top: 0.3rem;
}
.comment-text-button {
display: flex;
align-items: center;
justify-content: flex-end;
text-align: right;
margin-top: 0.3rem;
/*margin-bottom: 0.3rem;*/
}
.comment-text-button-one {
display: flex;
align-items: center;
justify-content: flex-end;
text-align: right;
margin-top: 0.3rem;
}
.commentRight {
margin-left: 0.4rem;
display: flex;
align-items: center;
}
.commentRight img {
width: 0.44rem;
}
.commentRight span {
font-size: 0.36rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
margin-left: 0.1rem;
}
.reply-box {
background: #F6F7F8;
/*border-radius: 0.16rem;*/
padding: 0.4rem 0.4rem 0 0.4rem;
margin-left: 0.5rem;
}
.reply-box:last-child {
padding-bottom: 0.4rem;
border-bottom-left-radius: 0.16rem;
border-bottom-right-radius: 0.16rem;
}
.reply-box:first-child {
border-top-left-radius: 0.16rem;
border-top-right-radius: 0.16rem;
}
.icon-active {
color: #00B3BE !important;
}
.input-text {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
background: #F6F7FA;
padding: 0.2rem 0.4rem;
}
.input-text .van-cell-group {
display: flex;
background: transparent;
align-items: center;
}
.input-text .van-cell {
width: calc(100% - 1.8rem);
display: inline-block;
border-radius: 0.6rem;
margin-right: 0.3rem;
}
.input-text .van-button {
width: 1.8rem;
height: 1rem;
border-radius: 0.4rem;
background: #01A0AC;
border: none;
}
</style>
@@ -0,0 +1,898 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{queryForm.serialNumber}} {{title}}
</span>
</div>
<van-collapse class="collapse" v-model="activeNames">
<van-collapse-item :title="$t('essentialInformation')" name="1">
<div class="content-box-type">
<span class="content-box-left">{{$t('entryName')}}</span>
<span class="content-box-text">{{queryForm.projectName+'-'+queryForm.projectVersion}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('regulationNo')}}</span>
<span class="content-box-text">{{queryForm.serialNumber || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('title')}}</span>
<span class="content-box-text">{{queryForm.title || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('subtitle')}}</span>
<span class="content-box-text">{{queryForm.subtitle || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('applicableSupplement')}}</span>
<span class="content-box-text">{{queryForm.applicableSupplement || '--'}}</span>
</div>
</van-collapse-item>
<van-collapse-item :title="$t('TaskRequirements')" name="2">
<div class="content-box-type">
<span class="content-box-left">{{$t('Sponsor')}}</span>
<span class="content-box-text">{{queryProject[queryData.Sponsor] || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('personLiable')}}</span>
<span class="content-box-text">{{queryProject[queryData.personLiable] || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('deliveryDate')}}</span>
<span class="content-box-text">{{queryProject[queryData.DueDate] || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left">{{$t('typeOfDeliverables')}}</span>
<span class="content-box-text">{{queryProject[queryData.typeOfDeliverables] || '--'}}</span>
</div>
<div class="content-box-type-text">
{{$t('deliverableTemplate')}}
</div>
<div class="content-box-type-text-Two" v-if="dataSourceFile && dataSourceFile.length == 0">
--
</div>
<div class="content-box-type-text-one"
v-else
@click="dataSourceFileClick(item)"
v-for="item in dataSourceFile">
{{item.fileName}}
</div>
<div class="content-box-type-text">
{{$t('descriptionDeliverables')}}
</div>
<div class="content-box-type-text-Two">
{{queryProject[queryData.remarks] || '--'}}
</div>
</van-collapse-item>
<van-collapse-item :title="$t('Processhistory')" name="3">
<van-steps inactive-icon="passed"
active-icon="passed"
active-color="#00BEBE"
direction="vertical" :active="dataSource.length">
<van-step v-for="(item,index) in dataSource" :key="index">
<div class="vanStepBox">
<div class="van-text">
{{item.name}}
</div>
<div class="van-text-status">
<span class="van-text-color" :class="statusClass[item.operatorResult]" v-if="item.operatorResultName">
{{item.operatorResultName}}
</span>
</div>
<div class="van-time">
<span class="van-name">
{{item.assignee}}
</span>
|
<span class="van-name-time">
{{item.createTime}}
</span>
</div>
<div class="van-desgin">
{{item.approvalOpinion}}
</div>
<div class="van-file" @click="approvalFileClick(item,index1)"
v-if="item.approvalFileName && item.approvalFileName.length > 0"
v-for="(val,index1) in item.approvalFileName" :key="index1">
{{val}}
</div>
</div>
</van-step>
</van-steps>
</van-collapse-item>
<van-collapse-item :title="$t('taskHandling')" name="4" v-if="!queryData.isDisplay">
<van-form @submit="onSubmit" ref="form">
<div class="resultofhandlingClass" style="margin-bottom: 0.1rem">
<span>{{$t('resultofhandling')}}</span>
<span class="requiredClass">*</span>
</div>
<van-field name="disposeResult"
class="uploader"
:rules="[{ required: true, message: $t('resultofhandling') + $t('cannotEmpty') }]">
<template #input>
<van-radio-group v-model="form.disposeResult" direction="horizontal">
<van-radio name="Accepted" v-if="queryData.TaskKey == 'zrrqr' || queryData.TaskKey == 'dezrrqr'">
{{$t('accept')}}
</van-radio>
<van-radio name="Rejected" v-if="queryData.TaskKey == 'zrrqr'">
{{$t('refuse')}}
</van-radio>
<van-radio name="Adopt" :disabled="isAdopt"
v-if="queryData.TaskKey == 'fggcssh' || queryData.TaskKey == 'fggcsbcsh'">
{{$t('adopt')}}
</van-radio>
<van-radio name="Compliance"
v-if="queryData.TaskKey == 'dezrrtjjfw' || queryData.TaskKey == 'zrrtjjfw' || queryData.TaskKey == 'zrrbctjxg'">
{{$t('accord')}}
</van-radio>
<van-radio name="Non-Compliance"
v-if="queryData.TaskKey == 'dezrrtjjfw' || queryData.TaskKey == 'zrrtjjfw' || queryData.TaskKey == 'zrrbctjxg'">
{{$t('nonConformity')}}
</van-radio>
<van-radio name="To be tracked"
v-if="queryData.TaskKey == 'zrrtjjfw' || queryData.TaskKey == 'dezrrtjjfw' || queryData.TaskKey == 'zrrbctjxg'">
{{$t('Tracked')}}
</van-radio>
<van-radio name="NA"
v-if="queryData.TaskKey == 'zrrtjjfw' || queryData.TaskKey == 'dezrrtjjfw' || queryData.TaskKey == 'zrrbctjxg'">
{{$t('notInvolved')}}
</van-radio>
<van-radio name="Returned"
v-if="queryData.TaskKey == 'dezrrqr' || queryData.TaskKey == 'dezrrtjjfw' ||
queryData.TaskKey == 'zrrtjjfw' || queryData.TaskKey == 'fggcssh' || queryData.TaskKey == 'fggcsbcsh'">
{{$t('sendBack')}}
</van-radio>
</van-radio-group>
</template>
</van-field>
<div class="resultofhandlingClass">
<span>{{$t('feedback')}}</span>
<span class="requiredClass">*</span>
</div>
<van-field
v-model.trim="form.approvalOpinion"
rows="4"
class="textarea"
autosize
:show-error="false"
:rules="[{ required: true, message: $t('feedbackMessage') + $t('cannotEmpty') }]"
maxlength="200"
type="textarea"
:placeholder="$t('pleaseEnter')+$t('feedbackMessage')"
/>
<van-field name="uploader" class="uploader"
v-if="queryData.TaskKey == 'dezrrtjjfw' || queryData.TaskKey == 'zrrtjjfw' || queryData.TaskKey == 'fggcssh'
|| queryData.TaskKey == 'zrrbctjxg' || queryData.TaskKey == 'fggcsbcsh'"
:label="$t('attachmentUpload')">
<template #input>
<van-uploader :preview-image="false"
accept="*"
:after-read="upload"
class="uploader-button">
<van-button icon="back-top" type="primary">{{$t('upload1')}}</van-button>
</van-uploader>
</template>
</van-field>
<div class="file-list"
v-for="(item,index) in fileList"
:key="index">
<span class="file-text">{{item.fileName}}
<van-icon class="file-text-icon" name="passed"/>
</span>
<a-icon @click="fileClick(index)" class="icon-text" type="delete"/>
</div>
<van-button class="submitButton"
round
block
type="info"
native-type="submit">{{$t('submit')}}
</van-button>
</van-form>
</van-collapse-item>
</van-collapse>
<van-overlay :show="show">
<van-loading type="spinner">{{textLoading}}</van-loading>
</van-overlay>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile, uploadAction } from '@/api/manage'
import { mapGetters } from 'vuex'
import moment from 'moment'
import axios from 'axios'
import Vue from 'vue'
import { kkFileView } from '@/utils/kkfileView'
import { ACCESS_TOKEN } from '@/store/mutation-types'
export default {
name: 'phoneProcessManagement',
data() {
return {
activeNames: ['1', '2', '3', '4'],
show: false,
form: {},
statusClass: {
'Accepted': 'AcceptedClass',
'Rejected': 'RejectedClass',
'Transfer': 'TransferClass',
'Returned': 'ReturnedClass',
'Adopt': 'AdoptClass',
'Compliance': 'ComplianceClass',
'Non-Compliance': 'NonComplianceClass',
'To be tracked': 'trackedClass',
'NA': 'NAClass'
},
dataSource: [],
url: {
urlFrom: 'project/projectLibraryBase/queryById',
queryProjectLawsInventoryInfoById: 'project/projectLawsInventoryEO/queryProjectLawsInventoryInfoById',
queryTaskDetailByTaskIds: '/task/queryTaskDetailByTaskIds',
edit: '/project/projectTaskInventoryDetailEO/edit',
dreSubmit: '/project/projectTaskInventoryFeedbackEO/dreSubmit',
list: '/project/projectTaskInventoryFeedbackEO/list',
historyList: '/wkflow/processHistoryEO/queryComplianceProcessHistoryList'
},
queryForm: {},
queryProject: {},
queryBy: {},
queryData: {},
title: '',
dataSourceFile: [],
textLoading: '',
fileList: [],
uploadAction: window._CONFIG['domianURL'] + '/sys/common/upload',
examineTitle: '',
isAdopt: false
}
},
mounted() {
document.title = 'NIO GRP'
this.textLoading = this.$t('loading')
this.getData(this.$route.query)
},
methods: {
...mapGetters(['userInfo']),
dataSourceFileClick(item) {
kkFileView(item.fileName, item.id)
},
approvalFileClick(item, index) {
kkFileView(item.approvalFileName[index], item.approvalFile[index])
},
iconClick() {
if (this.$route.query.goRouter) {
this.$router.push({
path: this.$route.query.goRouter,
query: {
searchValue: this.$route.query.searchValue,
activeTab: this.$route.query.activeTab
}
})
} else {
this.$router.go(-1)
}
},
onSubmit() {
this.$refs.form.validate().then(() => {
let handlingTime = moment(new Date()).format('YYYY-MM-DD HH:mm:ss')
let content = []
if (this.fileList && this.fileList.length > 0) {
this.fileList.forEach(res => {
content.push(res.id)
})
}
this.form.approvalFile = content.join(',')
this.completeTask({ operatorTime: handlingTime, ...this.form })
})
},
getData(row) {
this.show = true
this.queryData = row
this.queryData.isDisplay = JSON.parse(this.queryData.isDisplay)
let _this = this
if (row.flowType == '2') {
this.title = this.$t('designTheComplianceProcess')
} else if (row.flowType == '4') {
this.title = this.$t('verifyComplianceProcess')
}
if (row.TaskKey == 'zrrqr' || row.TaskKey == 'dezrrqr' || row.TaskKey == 'zrrtjjfw' || row.TaskKey == 'dezrrtjjfw') {
this.examineTitle = this.$t('personLiableConfirm')
} else {
this.examineTitle = this.$t('sponsorReview')
}
this.getHistoryList()
if (row.taskIds) {
this.queryTaskDetailByTask(function() {
_this.queryProjectLawsInventoryInfo()
})
} else {
this.queryBy.projectLibraryId = row.projectLibraryId
this.queryBy.id = row.projectTaskInventoryId
this.queryProjectLawsInventoryInfo()
}
},
queryTaskDetailByTask(callback) {
this.loading = true
getAction(this.url.queryTaskDetailByTaskIds, { taskIds: this.queryData.taskIds }).then((res) => {
if (res instanceof String) {
this.queryBy = JSON.parse(res) || {}
callback()
} else {
this.queryBy = res || {}
callback()
}
})
},
queryProjectLawsInventoryInfo() {
let query = {
id: this.queryBy.id,
operatorType: 'taskAffirmQuery'
}
this.queryBy.approvalOpinion = ''
this.queryBy.approvalFile = ''
getAction(this.url.queryProjectLawsInventoryInfoById, query).then((res) => {
if (res.success) {
this.queryProject = res.result[0] || {}
if (this.queryBy.disposeResult == 'To be tracked' || this.queryBy.disposeResult == 'Non-Compliance') {
this.isAdopt = true
}
if (this.queryProject[this.queryData.deliverableTemplate]) {
this.getFileInfos(this.queryProject[this.queryData.deliverableTemplate])
}
this.getQueryForm()
} else {
this.queryProject = {}
}
})
},
getHistoryList() {
let query = {
actiProcInstId: this.queryData.actiProcInstId || this.queryData.prcId,
flowType: this.queryData.flowType,
projectLawsInventoryId: this.queryData.projectTaskInventoryId
}
getAction('/wkflow/processHistoryEO/queryComplianceProcessHistoryList', query).then((res) => {
if (res.success) {
this.dataSource = res.result || []
this.dataSource.forEach(val => {
if (val.approvalFileName) {
val.approvalFileName = val.approvalFileName.split(',')
val.approvalFile = val.approvalFile.split(',')
}
})
} else {
this.dataSource = []
}
})
},
getFileInfos(item) {
getAction('sys/common/getFileInfos', { id: item }).then((res) => {
if (res.success) {
this.dataSourceFile = res.result
this.dataSourceFile.forEach((val) => {
let fileName = val.fileName
let index1 = fileName.lastIndexOf('.')
let index2 = fileName.length
let fileSuffix = fileName.substring(index1, index2)
val.fileSuffix = fileSuffix
})
} else {
this.dataSourceFile = []
}
})
},
getQueryForm() {
getAction(this.url.urlFrom, { id: this.queryBy.projectLibraryId }).then((res) => {
if (res.success) {
this.queryForm = res.result[0] || {}
if (this.queryProject) {
this.queryForm = { ...this.queryForm, ...this.queryProject }
}
this.show = false
} else {
this.queryForm = {}
}
})
},
async upload(file) {
// 这时候我们创建一个formData对象实例
const formData = new FormData()
// 通过append方法添加需要的file
// 这里需要注意 append(key, value)来添加数据如果指定的key不存在则会新增一条数据如果key存在则添加到数据的末尾
formData.append('file', file.file)
// 调用uploadFile上传的接口
const res = await this.uploadFile(formData)
this.fileList.push(res)
// 上传文件的guid和后台返回的guid一样通过push方法把上传的文件存放到上传成功才能提交的数组里面
},
uploadFile(formData) {
this.textLoading = this.$t('loading')
this.show = true
return new Promise(resolve => {
const token = Vue.ls.get(ACCESS_TOKEN)
axios({
url: this.uploadAction,
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data', // 文件上传
'X-Access-Token': token
}
}).then((res) => {
resolve(res.data.result)
this.show = false
})
})
},
completeTask(value) {
this.textLoading = this.$t('Submitting')
this.show = true
let json = Object.assign(this.queryBy, value)
let data = JSON.stringify(json).replace(/\"/g, '\'')
Object.keys(value).forEach(res => {
if (value[res] && typeof value[res] == 'string') {
value[res] = value[res].replace(/\"/g, '“')
value[res] = value[res].replace(/\'/g, '')
}
})
let query = {
userid: this.userInfo().id,
taskId: this.queryData.taskId || this.queryData.taskIds,
json: data
}
postAction('/workFlow/completeTask', query).then((res) => {
if (res.success) {
this.$message.success(this.$t('OperationSuccessful'))
this.show = false
this.$router.go(-1)
} else {
this.show = false
this.$message.warning(res.message)
}
})
},
fileClick(index) {
this.fileList.splice(index, 1)
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.header-search {
/*padding-left: 0.4rem;*/
/*padding-right: 0.4rem;*/
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.collapse {
margin-top: 0.6rem;
}
::v-deep .van-cell {
padding: 0;
}
::v-deep .van-cell::after {
border-bottom: none;
}
::v-deep .van-collapse-item--border::after {
border-top: none;
}
::v-deep .van-hairline--top-bottom::after, .van-hairline-unset--top-bottom::after {
border-width: 0;
}
::v-deep .van-cell--clickable .van-cell__title span {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
}
::v-deep .collapse .van-cell--clickable .van-icon {
font-size: 0.44rem;
color: #040B29;
}
::v-deep .van-collapse-item {
margin-bottom: 0.6rem;
}
.content-box-type {
display: flex;
margin-top: 0.08rem;
margin-bottom: 0.4rem;
}
.content-box-type:last-child {
margin-bottom: 0.1rem;
}
.content-box-left {
display: inline-block;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6F7385;
flex: auto;
min-width: 2rem;
}
.content-box-type-text {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #6F7385;
margin-bottom: 0.4rem;
}
.content-box-type-text-one {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #01A0AC;
margin-bottom: 0.4rem;
word-break: break-all;
}
.content-box-type-text-Two {
display: inline-block;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
}
.content-box-text {
text-align: right;
margin-left: 0.3rem;
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
}
::v-deep .van-collapse-item__content {
padding: 0.5rem 0;
}
::v-deep .van-step__circle-container .van-icon {
font-size: 0.55rem;
background: #fff;
}
::v-deep .van-step--finish {
color: #00BEBE;
}
::v-deep .van-step--vertical {
padding: 0.26rem 0 0.46rem 0;
}
::v-deep .van-step--vertical:not(:last-child)::after {
border-bottom-width: 0;
}
.vanStepBox {
margin-left: 0.2rem;
}
.van-text {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
.van-text-color {
padding: 0.19rem 0.3rem;
color: #26BD4B;
font-size: 0.34rem;
background: rgba(38, 189, 75, 0.12);
border-radius: 0.1rem;
}
.van-time {
font-size: 0.34rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
margin-top: 0.3rem;
}
.van-name {
color: #868A9A;
margin-right: 0.1rem;
font-size: 0.34rem;
}
.van-name-time {
color: #868A9A;
margin-left: 0.1rem;
font-size: 0.34rem;
}
.van-desgin {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #41475E;
margin-top: 0.3rem;
word-break: break-all;
}
.van-file {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #01A0AC;
margin-top: 0.3rem;
word-break: break-all;
}
::v-deep .van-form .van-cell__title {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #595E72;
width: 100%;
}
::v-deep .van-form .van-cell__value {
margin-top: 0.1rem;
}
::v-deep .van-form .van-radio__icon .van-icon {
width: 0.45rem;
height: 0.45rem;
line-height: 0.38rem;
}
::v-deep .van-form .van-radio__icon--checked .van-icon {
background-color: #00BEBE;
border-color: #00BEBE;
}
::v-deep .van-form .van-radio__icon {
height: 0.45rem;
}
::v-deep .van-form .van-radio__label {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
}
::v-deep .van-form .van-cell {
margin-bottom: 0.3rem;
}
.textarea {
display: block;
}
::v-deep .van-form .textarea .van-field__control {
background: #F5F6F7;
border-radius: 0.12rem;
padding: 0.2rem;
margin-top: 0.1rem;
}
.uploader {
display: block;
}
.uploader-button {
margin-top: 0.2rem;
}
.uploader-button .van-button--primary {
background-color: #fff;
border: 0.03rem solid #00BEBE;
color: #01A0AC;
font-size: 0.38rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
}
.uploader-button .van-button {
height: 0.9rem;
border-radius: 0.12rem;
}
.uploader-button .van-button .van-icon {
font-size: 0.42rem;
font-weight: 500;
}
::v-deep .van-loading {
color: #fff;
font-size: 0.36rem;
}
::v-deep .van-loading__text {
color: #fff;
font-size: 0.46rem;
}
::v-deep .van-overlay {
z-index: 1001;
text-align: center;
line-height: 30;
display: flex;
align-items: center;
justify-content: center;
}
.submitButton {
border-radius: 0.2rem;
background: #00B3BE;
border: none;
margin-top: 1.2rem;
}
::v-deep .van-icon-success:before {
font-size: 0.34rem;
text-align: center;
}
::v-deep .van-radio {
margin-bottom: 0.1rem;
}
.file-list {
width: 100%;
background: #FFFFFF;
border-radius: 0.2rem;
border: 0.02rem solid #E6E7EC;
padding: 0.26rem 0.4rem;
font-size: 0.38rem;
font-weight: 400;
color: #040B29;
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 0.2rem;
}
.file-text {
display: inline-block;
margin-right: 0.3rem;
word-break: break-all;
}
.file-text-icon {
font-size: 0.41rem;
margin-left: 0.2rem;
color: #26BD4B;
font-weight: 600;
}
.icon-text {
font-size: 0.4rem;
color: #040B29;
}
::v-deep .van-field--error .van-field__control::placeholder {
color: #BBBDC7;
}
.van-text-status {
margin-bottom: 0.3rem;
margin-top: 0.3rem;
}
.van-collapse-item:last-child {
margin-bottom: 0;
}
.AcceptedClass {
background: #e9f8ed;
color: #26BD4B;
}
.RejectedClass {
background: #fdeaea;
color: #E83030;
}
.TransferClass {
background: #fff6e8;
color: #FDA71C;
}
.ReturnedClass {
background: #fff6e8;
color: #FDA71C;
}
.AdoptClass {
background: #e9f8ed;
color: #26BD4B;
}
.ComplianceClass {
background: #e9f8ed;
color: #26BD4B;
}
.NonComplianceClass {
background: #fdeaea;
color: #E83030;
}
.trackedClass {
background: #fff6e8;
color: #FDA71C;
}
.NAClass {
background: #f1f1f3;
color: #707486;
}
.resultofhandlingClass {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #595E72;
width: 100%;
}
.requiredClass {
color: #E83030;
font-size: 0.38rem;
margin-left: 0.06rem;
}
</style>
@@ -0,0 +1,189 @@
<template>
<div class="box">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<span class="header-search-text">
{{$t('recentBrowsing')}}
</span>
</div>
<div class="content">
<div class="content-text" @click="recentBrowsingClick(item)" v-for="(item,index) in recentBrowsingList"
:key="index">
<div class="content-text-left">
<div class="content-text-top">
<span class="content-text-top-left">
{{item.title || '--'}}
</span>
<!-- <span class="content-text-top-right">-->
<!-- 测试检验项目-->
<!-- </span>-->
</div>
<div class="content-text-button">
<span>{{item.browseTypeName}}</span>
</div>
<div class="content-text-button">
<span>{{$t('browsingTime')}}{{item.createTime}}</span>
</div>
</div>
<div class="content-text-right">
<van-icon name="arrow"/>
</div>
</div>
</div>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import { mapGetters } from 'vuex'
import { kkFileView } from '@/utils/kkfileView'
export default {
name: 'phoneRecentBrowsing',
data() {
return {
url: {
page: '/phone/recentBrowse/page'
},
recentBrowsingList: []
}
},
mounted() {
document.title = 'NIO GRP'
this.getRecentBrowsing()
},
methods: {
...mapGetters(['userInfo']),
iconClick() {
this.$router.go(-1)
},
getRecentBrowsing() {
let query = {
createBy: this.userInfo().username,
pageNo: 1,
pageSize: 30
}
getAction(this.url.page, query).then((res) => {
if (res.success) {
this.recentBrowsingList = res.result.records || []
} else {
this.recentBrowsingList = []
}
})
},
recentBrowsingClick(item) {
if (item.browseType == 'Document Library') {
this.$router.push({
path: '/phoneDocumentDetails',
query: {
id: item.browseDataId
}
})
} else if (item.browseType == 'Regulatory Monthly Report') {
kkFileView(item.title, item.fileId)
} else if (item.browseType == 'Knowledge sharing') {
this.$router.push({
path: '/phoneProblemKnowledgeBase',
query: {
id: item.browseDataId
}
})
}
}
}
}
</script>
<style scoped>
.box {
padding: 0 0.4rem 0.4rem 0.4rem;
position: relative;
}
.header-search {
width: 100%;
display: flex;
position: sticky;
top: 0;
padding-top: 0.4rem;
background: #fff;
z-index: 1000;
}
.icon {
font-size: 0.66rem;
width: 0.7rem;
}
.header-search-text {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
margin-left: 0.2rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content {
margin-top: 0.36rem;
}
.content-text {
padding: 0.3rem 0;
box-sizing: border-box;
display: flex;
align-items: center;
border-bottom: 0.02rem solid #E6E7EC;
}
.content-text-left {
width: calc(100% - 1rem);
}
.content-text-right {
width: 1rem;
text-align: right;
}
.content-text-top {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.content-text-button {
font-size: 0.42rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
margin-top: 0.13rem;
}
.content-text-right .van-icon {
font-size: 0.5rem;
color: #040B29;
}
.content-text-top-right {
margin-left: 0.3rem;
}
</style>
+269
View File
@@ -0,0 +1,269 @@
<template>
<div class="box">
<div class="header-box">
<img src="~@/assets/logoOne.png" alt="">
<span class="logoTitle">NIO GRP</span>
</div>
<div class="content-box">
<form action="/">
<van-search v-model="value" @search="onSearch" left-icon="none" right-icon="search"
:placeholder="$t('phoneSearch')"/>
</form>
</div>
<div class="content-box-value">
<div class="left-img">
<img src="~@/assets/wendang.png" alt="">
</div>
<div class="text-left">
<div class="text-left-top">{{$t('DocumentLibrary')}}</div>
<div class="text-left-button">{{$t('stored')+ ' '+documentLibraryTotal+' ' + $t('individual')+$t('document')}}
</div>
</div>
<div class="text-right" @click="documentDetailsClick">
{{$t('goToCheck')}}
</div>
</div>
<div class="content-box-value">
<div class="left-img">
<img src="~@/assets/icon_wiki.png" alt="">
</div>
<div class="text-left">
<div class="text-left-top">{{$t('problemKnowledgeBase')}}</div>
<div class="text-left-button">{{$t('stored')+ ' '+problemKnowledgeBaseTotal+' ' +
$t('individual')+$t('problemKnowledgeBase')}}
</div>
</div>
<div class="text-right" @click="phoneProblemKnowledgeBaseClick">
{{$t('goToCheck')}}
</div>
</div>
<div class="content-box-value">
<div class="left-img">
<img src="~@/assets/yuebao.png" alt="">
</div>
<div class="text-left">
<div class="text-left-top">{{$t('monthlyReportRegulations')}}</div>
<div class="text-left-button">{{$t('stored')+ ' '+monthlyReportRegulationsTotal+' ' +
$t('individual')+$t('monthlyReportRegulations')}}
</div>
</div>
<div class="text-right" @click="processManagementClick">
{{$t('goToCheck')}}
</div>
</div>
<van-tabbar v-model="active" @change="onChange">
<van-tabbar-item name="search" icon="search">{{$t('phoneSearch')}}</van-tabbar-item>
<van-tabbar-item name="toDoCenter" icon="bell">{{$t('todocenter')}}</van-tabbar-item>
<van-tabbar-item name="taskData" icon="underway">{{$t('taskStatistics')}}</van-tabbar-item>
<van-tabbar-item name="home" icon="manager">{{$t('mine')}}</van-tabbar-item>
</van-tabbar>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
export default {
name: 'phoneSearch',
data() {
return {
active: 'search',
value: '',
documentLibraryTotal: 0,
problemKnowledgeBaseTotal: 0,
monthlyReportRegulationsTotal: 0
}
},
mounted() {
document.title = 'NIO GRP'
this.getDataCount()
},
methods: {
onChange(value) {
if (value == 'toDoCenter') {
this.$router.push({
path: '/phoneToDoCenter'
})
} else if (value == 'taskData') {
this.$router.push({
path: '/phoneTaskData'
})
} else if (value == 'home') {
this.$router.push({
path: '/phoneHome'
})
}
},
onSearch(value) {
this.$router.push({
path: '/phoneSearchList',
query: {
searchValue: this.value
}
})
},
documentDetailsClick() {
this.$router.push({
path: '/phoneSearchList',
query: {
activeTab: 'documentLibrary'
}
})
},
processManagementClick() {
this.$router.push({
path: '/phoneSearchList',
query: {
activeTab: 'monthlyReportRegulations'
}
})
},
phoneProblemKnowledgeBaseClick() {
this.$router.push({
path: '/phoneSearchList',
query: {
activeTab: 'problemKnowledgeBase'
}
})
},
getDataCount() {
getAction('/phone/search/getDataCount', {}).then((res) => {
if (res.success) {
this.documentLibraryTotal = res.result.documentLibraryCount || 0
this.problemKnowledgeBaseTotal = res.result.problemKnowledgeBaseCount || 0
this.monthlyReportRegulationsTotal = res.result.lawsMonthlyReportManageCount || 0
} else {
this.documentLibraryTotal = 0
this.problemKnowledgeBaseTotal = 0
this.monthlyReportRegulationsTotal = 0
}
})
}
}
}
</script>
<style scoped>
::v-deep .van-tabbar-item--active {
color: #00B3BE;
}
.box {
padding: 0.4rem;
}
.header-box {
width: 100%;
text-align: center;
padding-top: 2.2rem;
display: flex;
align-items: center;
justify-content: center;
}
.logoTitle {
font-size: 0.64rem;
margin-left: 0.24rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #040B29;
}
::v-deep .van-search {
padding: 0;
}
.content-box {
margin-top: 1.2rem;
}
.content-box .van-search {
width: 100%;
height: 1.3rem;
}
::v-deep .content-box .van-search .van-search__content {
height: 1.3rem;
background: #FFFFFF;
border-radius: 0.24rem 0.24rem 0.24rem 0.24rem;
opacity: 1;
border: 0.06rem solid #040B29;
}
::v-deep .van-search__content .van-cell {
line-height: 0.96rem;
}
::v-deep .van-field__body {
font-size: 0.4rem;
}
::v-deep .van-field__body .van-field__right-icon .van-icon {
font-size: 0.52rem !important;
font-weight: 600 !important;
}
.content-box-value {
margin-top: 0.4rem;
background: #FFFFFF;
border-radius: 0.24rem 0.24rem 0.24rem 0.24rem;
opacity: 1;
border: 0.05rem solid #E6E7EC;
padding: 0.4rem;
box-sizing: border-box;
overflow: hidden;
}
.left-img {
width: 1.1rem;
height: 1.1rem;
background: #F6F7F8;
border-radius: 0.12rem;
text-align: center;
line-height: 1.1rem;
float: left;
}
.left-img img {
width: 0.58rem;
height: 0.58rem;
}
.text-left {
float: left;
margin-left: 0.3rem;
width: calc(100% - 3.4rem);
}
.text-left-top {
font-size: 0.38rem;
font-family: Blue Sky Noto-Bold, Blue Sky Noto;
font-weight: bold;
color: #41475E;
word-break: break-all;
}
.text-left-button {
font-size: 0.32rem;
font-family: Blue Sky Noto-Light, Blue Sky Noto;
font-weight: 300;
color: #595E72;
word-break: break-all;
}
.text-right {
width: 1.8rem;
height: 0.74rem;
background: rgba(0, 179, 190, 0.12);
border-radius: 99px 99px 99px 99px;
opacity: 1;
border: 1px solid rgba(0, 179, 190, 0.12);
float: right;
font-size: 0.3rem;
text-align: center;
line-height: 0.74rem;
font-weight: 500;
color: #00B3BE;
margin-top: 0.22rem;
}
</style>
+735
View File
@@ -0,0 +1,735 @@
<template>
<div class="box">
<div class="fixed">
<div class="header-search">
<van-icon @click="iconClick" class="icon" name="arrow-left"/>
<!-- <van-dropdown-menu v-if="activeTab == 'documentLibrary'">-->
<!-- <van-dropdown-item @change="selectModelChange" v-model="selectModel" :options="option"/>-->
<!-- </van-dropdown-menu>-->
<!-- <van-search v-model="value"-->
<!-- class="search-text"-->
<!-- v-if="activeTab == 'documentLibrary'"-->
<!-- show-action-->
<!-- left-icon="none"-->
<!-- @search="onSearch"-->
<!-- @clear="onClear"-->
<!-- @cancel="onClear"-->
<!-- :action-text="$t('reset')"-->
<!-- :placeholder="$t('phoneSearch')"/>-->
<form action="/" style="width: 100%;">
<van-search v-model="value"
@search="onSearch"
@clear="onClear"
@cancel="onClear"
:placeholder="$t('phoneSearch')"/>
</form>
</div>
<div class="content">
<van-tabs v-model="activeTab" :ellipsis="false" @change="activeChange">
<van-tab name="whole" :title="$t('whole')"></van-tab>
<van-tab name="documentLibrary" :title="$t('DocumentLibrary')"></van-tab>
<van-tab name="problemKnowledgeBase" :title="$t('problemKnowledgeBase')"></van-tab>
<van-tab name="monthlyReportRegulations" :title="$t('monthlyReportRegulations')"></van-tab>
</van-tabs>
</div>
</div>
<div class="content-box">
<div class="search-top">
{{$t('searchScope')}}
<!-- <span v-if="activeTab == 'documentLibrary' && searchValue">-->
<!-- {{selectModelName}}:</span>-->
<span>{{searchValue}}</span>
</div>
<div v-if="activeTab == 'whole'">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-box-content" @click="dataClick(item)" v-for="(item,index) in list" :key="index">
<div v-if="item.module_type_flag == 'WDK'">
<div class="content-box-title" v-html="item.serial_number || '--'">
</div>
<div class="content-box-type">
<span class="content-box-left"
:class="{'content-box-left-En-WDK':language == 'en-us' ? true : false}"
>{{$t('title')}}</span>
<span class="content-box-text" v-html="item.title || '--'"></span>
</div>
<div class="content-box-type">
<span class="content-box-left"
:class="{'content-box-left-En-WDK':language == 'en-us' ? true : false}">{{$t('status')}}</span>
<span class="content-box-text">{{item.state_dictText || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left"
:class="{'content-box-left-En-WDK':language == 'en-us' ? true : false}">{{$t('category')}}</span>
<span class="content-box-text" v-html="item.module_type || '--'"></span>
</div>
</div>
<div v-else-if="item.module_type_flag == 'WTZSK' || item.module_type_flag == 'ZSFX'">
<div class="content-box-title" v-html="item.title || '--'">
</div>
<div class="content-box-type">
<span class="content-box-left-problemKnow"
:class="{'content-box-left-problemKnow-En':language == 'en-us' ? true : false}"
>{{$t('creator')}}</span>
<span class="content-box-text">{{item.create_by || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left-problemKnow"
:class="{'content-box-left-problemKnow-En':language == 'en-us' ? true : false}">
{{$t('phoneCreationTime')}}
</span>
<span class="content-box-text">{{item.create_time_str || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left-problemKnow"
:class="{'content-box-left-problemKnow-En':language == 'en-us' ? true : false}">{{$t('category')}}</span>
<span class="content-box-text" v-html="item.module_type || '--'"></span>
</div>
</div>
<div v-else-if="item.module_type_flag == 'FGYB'">
<div class="content-box-title" v-html="item.title || '--'">
</div>
<div class="content-box-type">
<span class="content-box-left-monthly"
:class="{'content-box-left-monthly-En':language == 'en-us' ? true : false}">{{$t('uploadedBy')}}</span>
<span class="content-box-text">{{item.create_by || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left-monthly"
:class="{'content-box-left-monthly-En':language == 'en-us' ? true : false}">{{$t('uploadTime')}}</span>
<span class="content-box-text">{{item.create_time_str || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left-monthly"
:class="{'content-box-left-monthly-En':language == 'en-us' ? true : false}">{{$t('category')}}</span>
<span class="content-box-text" v-html="item.module_type || '--'"></span>
</div>
</div>
</div>
</van-list>
</div>
<div v-else-if="activeTab == 'documentLibrary'">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-box-content" @click="dataClick(item)" v-for="(item,index) in documentLibraryList"
:key="index">
<div class="content-box-title" v-html="item.serial_number || '--'"></div>
<div class="content-box-type">
<span class="content-box-left"
:class="{'content-box-left-En':language == 'en-us' ? true : false}">{{$t('title')}}</span>
<span class="content-box-text" v-html="item.title || '--'"></span>
</div>
<div class="content-box-type">
<span class="content-box-left"
:class="{'content-box-left-En':language == 'en-us' ? true : false}">{{$t('status')}}</span>
<span class="content-box-text">{{item.state_dictText}}</span>
</div>
</div>
</van-list>
</div>
<div v-else-if="activeTab == 'problemKnowledgeBase'">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-box-content" @click="dataClick(item)" v-for="(item,index) in problemKnowledgeBaseList"
:key="index">
<div class="content-box-title" v-html="item.title || '--'"></div>
<div class="content-box-type">
<span class="content-box-left-problemKnow"
:class="{'content-box-left-problemKnow-En':language == 'en-us' ? true : false}"
>{{$t('creator')}}</span>
<span class="content-box-text">{{item.create_by || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left-problemKnow"
:class="{'content-box-left-problemKnow-En':language == 'en-us' ? true : false}">
{{$t('phoneCreationTime')}}
</span>
<span class="content-box-text">{{item.create_time_str || '--'}}</span>
</div>
</div>
</van-list>
</div>
<div v-else-if="activeTab == 'monthlyReportRegulations'">
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="content-box-content" @click="dataClick(item)" v-for="(item,index) in monthlyReportRegulationsList"
:key="index">
<div class="content-box-title" v-html="item.title || '--'"></div>
<div class="content-box-type">
<span class="content-box-left-monthly"
:class="{'content-box-left-monthly-En':language == 'en-us' ? true : false}">{{$t('uploadedBy')}}</span>
<span class="content-box-text">{{item.create_by || '--'}}</span>
</div>
<div class="content-box-type">
<span class="content-box-left-monthly"
:class="{'content-box-left-monthly-En':language == 'en-us' ? true : false}">{{$t('uploadTime')}}</span>
<span class="content-box-text">{{item.create_time_str || '--'}}</span>
</div>
</div>
</van-list>
</div>
</div>
</div>
</template>
<script>
import { getAction, postAction, downloadFile } from '@/api/manage'
import { Base64 } from 'js-base64'
import { kkFileView } from '@/utils/kkfileView'
export default {
name: 'phoneSearchList',
data() {
return {
value: '',
activeTab: '',
list: [],
documentLibraryList: [],
problemKnowledgeBaseList: [],
monthlyReportRegulationsList: [],
loading: false,
finished: false,
language: localStorage.getItem('language'),
pageNo: 0,
searchValue: '',
downLoadFileUrl: window._CONFIG['domianPreviewURL'] + '/sys/common/download',
downLoadImgUrl: window._CONFIG['domianWebImgURL'] + '/sys/common/download',
url: {
wholeUrl: 'search/document/getFullTextInfoList',
documentLibraryUrl: '/phone/search/getWdkPage',
problemKnowledgeBaseUrl: '/search/document/getProblemKnowledgeBasePage',
monthlyReportRegulationsUrl: '/search/lawsMonthlyReport/page',
queryCondition: 'search/document/queryCondition'
},
selectModel: '',
option: [],
searchOption: [],
selectModelNameSearch: ''
}
},
mounted() {
document.title = 'NIO GRP'
this.getCondition()
if (this.$route.query.searchValue) {
this.value = this.$route.query.searchValue
this.searchValue = this.$route.query.searchValue
}
if (this.$route.query.activeTab) {
this.activeTab = this.$route.query.activeTab
}
},
methods: {
selectModelChange(event) {
let content = this.option.filter((res) => {
return res.value === event
})
if (content && content.length > 0) {
this.selectModelNameSearch = content[0].text
} else {
this.selectModelNameSearch = ''
}
},
getCondition() {
let query = {
flag: 1,
searchFlag: 1
}
getAction(this.url.queryCondition, query).then((res) => {
if (res.success) {
let searchOption = res.result || []
if (searchOption.length > 0) {
this.selectModel = searchOption[0].db_field_name
this.selectModelNameSearch = searchOption[0].db_field_txt
for (let i = 0; i < searchOption.length; i++) {
this.option.push({
text: searchOption[i].db_field_txt,
value: searchOption[i].db_field_name
})
}
}
} else {
this.searchOption = []
}
})
},
iconClick() {
this.$router.push({
path: '/phoneSearch'
})
},
onSearch() {
this.searchValue = this.value
this.selectModelName = this.selectModelNameSearch
if (this.activeTab == 'whole') {
this.list = []
} else if (this.activeTab == 'documentLibrary') {
this.documentLibraryList = []
} else if (this.activeTab == 'problemKnowledgeBase') {
this.problemKnowledgeBaseList = []
} else if (this.activeTab == 'monthlyReportRegulations') {
this.monthlyReportRegulationsList = []
}
this.loading = true
this.finished = false
this.pageNo = 1
this.getList()
},
onClear() {
this.searchValue = ''
this.value = ''
this.selectModelName = ''
if (this.activeTab == 'whole') {
this.list = []
} else if (this.activeTab == 'documentLibrary') {
this.documentLibraryList = []
} else if (this.activeTab == 'problemKnowledgeBase') {
this.problemKnowledgeBaseList = []
} else if (this.activeTab == 'monthlyReportRegulations') {
this.monthlyReportRegulationsList = []
}
this.loading = true
this.finished = false
this.pageNo = 1
this.getList()
},
activeChange() {
this.searchValue = ''
this.value = ''
this.selectModelName = ''
if (this.activeTab == 'whole') {
this.list = []
} else if (this.activeTab == 'documentLibrary') {
this.documentLibraryList = []
} else if (this.activeTab == 'problemKnowledgeBase') {
this.problemKnowledgeBaseList = []
} else if (this.activeTab == 'monthlyReportRegulations') {
this.monthlyReportRegulationsList = []
}
this.loading = true
this.finished = false
this.pageNo = 1
this.getList()
},
recentBrowseAdd(browseType, id) {
let query = {
browseType: browseType,
browseDataId: id
}
postAction('/phone/recentBrowse/add', query).then((res) => {
})
},
dataClick(item) {
if (item.module_type_flag == 'WDK') {
this.recentBrowseAdd('Document Library', item.id.slice(0, 32))
this.$router.push({
path: '/phoneDocumentDetails',
query: {
id: item.id.slice(0, 32),
goRouter: '/phoneSearchList',
searchValue:this.value,
activeTab:this.activeTab
}
})
} else if (item.module_type_flag == 'WTZSK' || item.module_type_flag == 'ZSFX') {
let id = item.id.replace('base', '')
this.recentBrowseAdd('Knowledge sharing', id)
this.$router.push({
path: '/phoneProblemKnowledgeBase',
query: {
id: id,
goRouter: '/phoneSearchList',
searchValue:this.value,
activeTab:this.activeTab
}
})
} else if (item.module_type_flag == 'FGYB') {
this.recentBrowseAdd('Regulatory Monthly Report', item.id)
kkFileView(item.file_name, item.file_id)
}
},
onLoad() {
if (this.finished) {
this.list = []
this.finished = false
} else {
this.pageNo++
this.getList()
}
},
getList() {
let url = ''
let params = {
pageNo: this.pageNo,
pageSize: 10,
selectValue: this.value,
mapOne: {},
mapTwo: {}
}
if (this.activeTab == 'whole') {
url = this.url.wholeUrl
postAction(url, params).then(res => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.list = this.list.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.list = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.list = []
this.loading = false
this.finished = true
}
})
} else if (this.activeTab == 'documentLibrary') {
url = this.url.documentLibraryUrl
this.getDocumentLibrary(url, params)
} else if (this.activeTab == 'problemKnowledgeBase') {
url = this.url.problemKnowledgeBaseUrl
this.getProblemKnowledgeBase(url, params)
} else if (this.activeTab == 'monthlyReportRegulations') {
url = this.url.monthlyReportRegulationsUrl
this.getMonthlyReportRegulations(url, params)
}
},
getDocumentLibrary(url, params) {
getAction(url, params).then(res => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.documentLibraryList = this.documentLibraryList.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.documentLibraryList = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.documentLibraryList = []
this.loading = false
this.finished = true
}
})
},
getProblemKnowledgeBase(url, params) {
postAction(url, params).then(res => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.problemKnowledgeBaseList = this.problemKnowledgeBaseList.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.problemKnowledgeBaseList = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.problemKnowledgeBaseList = []
this.loading = false
this.finished = true
}
})
},
getMonthlyReportRegulations(url, params) {
postAction(url, params).then(res => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.monthlyReportRegulationsList = this.monthlyReportRegulationsList.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.monthlyReportRegulationsList = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.monthlyReportRegulationsList = []
this.loading = false
this.finished = true
}
})
}
}
}
</script>
<style scoped>
::v-deep .van-tabbar-item--active {
color: #00B3BE;
}
.box {
padding-top: 3rem;
overflow: hidden;
}
.header-search {
padding: 0 0.4rem;
display: flex;
align-items: center;
width: 100%;
}
.icon {
font-size: 0.66rem;
}
::v-deep .van-search {
padding: 0 0 0 0.2rem;
}
::v-deep .van-search__action {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
padding: 0 0 0 0.3rem;
height: 1.1rem;
line-height: 1.1rem;
}
.header-search .van-search {
width: 100%;
height: 1.1rem;
}
::v-deep .header-search .van-search .van-search__content {
height: 1.1rem;
background: #F5F6F7;
border-radius: 0.2rem 0.2rem 0.2rem 0.2rem;
opacity: 1;
}
::v-deep .van-search__content .van-cell {
line-height: 0.9rem;
}
::v-deep .van-field__body {
font-size: 0.4rem;
}
::v-deep .van-field__left-icon .van-icon {
font-size: 0.46rem !important;
font-weight: 600 !important;
}
.content {
margin-top: 0.38rem;
position: relative;
background: #fff;
}
::v-deep .van-tabs__line {
background-color: #00B3BE;
}
::v-deep .van-tab {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
flex: none;
margin-right: 0.2rem;
}
::v-deep .van-tab--active {
font-size: 0.38rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
}
::v-deep .van-tabs {
padding: 0 0.4rem;
width: 100%;
}
.search-right {
position: absolute;
right: 0.4rem;
top: 0.07rem;
}
.search-right-icon {
font-size: 0.48rem;
}
.content-box {
padding: 0.4rem 0.4rem;
box-sizing: border-box;
background: #F7F7F8;
}
.content-box-content {
padding: 0.3rem 0.28rem;
background: #fff;
border-radius: 0.2rem;
position: relative;
margin-bottom: 0.4rem;
}
.content-box-title {
font-family: PingFang SC-Semibold, PingFang SC;
font-weight: 600;
color: #040B29;
font-size: 0.42rem;
}
.content-box-type {
font-size: 0.34rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 500;
color: #41475E;
display: flex;
margin-top: 0.08rem;
}
.content-box-left {
display: inline-block;
flex: none;
font-weight: 500;
}
.content-box-text {
margin-left: 0.3rem;
word-break: break-all;
overflow: hidden;
display: -webkit-box;
text-overflow: ellipsis;
/*! autoprefixer: off */
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
/*! autoprefixer: on;*/
text-justify: inter-ideograph;
}
.search-top {
font-size: 0.36rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
margin-bottom: 0.2rem;
}
.search-top span {
color: #040B29;
}
.fixed {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1000;
background: #fff;
padding-top: 0.4rem;
}
::v-deep .van-tabs__nav--line.van-tabs__nav--complete {
padding-left: 0;
}
::v-deep .van-tabs__wrap--scrollable .van-tab {
padding: 0 0.1rem;
}
.content-box-left-problemKnow {
display: inline-block;
font-weight: 500;
width: 1.4rem;
flex: none;
word-break: break-all;
}
.content-box-left-En {
width: 1.1rem;
}
.content-box-left-problemKnow-En {
width: 2.3rem;
}
.content-box-left-En-WDK {
width: 1.5rem;
}
.content-box-left-monthly {
display: inline-block;
font-weight: 500;
width: 1.4rem;
word-break: break-all;
flex: none;
}
.content-box-left-monthly-En {
width: 2.11rem;
}
::v-deep .highlight-class {
color: #21c9cc !important;
}
::v-deep .van-dropdown-menu {
height: 1.1rem;
}
::v-deep .van-dropdown-menu__title--active {
color: #21c9cc;
}
::v-deep .van-dropdown-item__option--active {
color: #21c9cc;
}
::v-deep .van-dropdown-item__option--active .van-dropdown-item__icon {
color: #21c9cc;
}
::v-deep .van-dropdown-menu .van-dropdown-menu__bar {
height: 1.1rem;
background: #F5F6F7;
font-size: 0.38rem;
box-shadow: none;
width: 2rem;
border-top-left-radius: 0.2rem;
border-bottom-left-radius: 0.2rem;
border-right: 0.02rem #E6E7EC solid;
margin-left: 0.2rem;
}
::v-deep .van-dropdown-menu__title::after {
display: none;
}
.search-text {
padding: 0;
}
.search-text .van-search__content {
border-top-left-radius: 0 !important;
border-bottom-left-radius: 0 !important;
}
</style>
+464
View File
@@ -0,0 +1,464 @@
<template>
<div class="box">
<div class="content">
<van-tabs v-model="activeTab" @change="activeChange" :ellipsis="false">
<van-tab name="regulatoryCertification" :title="$t('regulatoryCertificationProcess')"></van-tab>
<van-tab name="parametercollection" :title="$t('authenticationParameterCollection')"></van-tab>
</van-tabs>
</div>
<div class="content-box">
<div class="regulatory" v-if="activeTab == 'regulatoryCertification'">
<!-- <div class="content-box-text">-->
<!-- {{$t('regulatoryCertificationProcessData')}}-->
<!-- </div>-->
<div class="regulatory-box">
<div class="content-box-data" @click="regulationListIssuanceClick">
<div class="content-box-data-text">
{{$t('regulationListIssuance')}}
</div>
<div class="content-box-data-num">
{{publishingCount}}
</div>
</div>
<div class="content-box-data" @click="processClick(2)">
<div class="content-box-data-text">
{{$t('designTheComplianceProcess')}}
</div>
<div class="content-box-data-num">
{{designCount}}
</div>
</div>
<div class="content-box-data" @click="processClick(4)">
<div class="content-box-data-text">
{{$t('verifyComplianceProcess')}}
</div>
<div class="content-box-data-num">
{{verifyCount}}
</div>
</div>
<div class="content-box-data" @click="processClick(21)">
<div class="content-box-data-text">
{{$t('thePreHomeProcess')}}
</div>
<div class="content-box-data-num">
{{preHomoCount}}
</div>
</div>
<div class="content-box-data" @click="regulationListIssuanceClick">
<div class="content-box-data-text">
{{$t('technicalAssessmentOfRegulations')}}
</div>
<div class="content-box-data-num">
{{technologyEvaluationCount}}
</div>
</div>
<div class="content-box-data" @click="regulationListIssuanceClick">
<div class="content-box-data-text">
{{$t('legalOpinionCollection')}}
</div>
<div class="content-box-data-num">
{{opinionCollectionCount}}
</div>
</div>
</div>
</div>
<div class="parameter" v-else-if="activeTab == 'parametercollection'">
<!-- <div class="content-box-text">-->
<!-- {{$t('authenticationParameterCollectionData')}}-->
<!-- </div>-->
<van-list
v-model="loading"
:finished="finished"
:finished-text="$t('noMore')"
:loading-text="$t('loading')"
@load="onLoad"
>
<div class="parame-box" @click="parameClick" v-for="(item,index) in dataSource" :key="index">
<div class="parame-box-top">
<span class="parame-box-top-text-left"
:class="{'parame-box-top-text-left-one':language == 'en-us'? true : false}">
{{$t('phoneRelatedItems')}}</span>
<span class="parame-box-top-text-right"
:class="{'parame-box-top-text-right-one':language == 'en-us'? true : false}">
{{item.projectName}}
</span>
</div>
<div class="parame-box-top">
<span class="parame-box-top-text-left"
:class="{'parame-box-top-text-left-one':language == 'en-us'? true : false}">
{{$t('listHeading')}}
</span>
<span class="parame-box-top-text-right"
:class="{'parame-box-top-text-right-one':language == 'en-us'? true : false}">
{{item.title}}
</span>
</div>
<div class="parame-box-top">
<span class="parame-box-top-text-left"
:class="{'parame-box-top-text-left-one':language == 'en-us'? true : false}">
{{$t('Version')}}
</span>
<span class="parame-box-top-text-right"
:class="{'parame-box-top-text-right-one':language == 'en-us'? true : false}">
{{item.version}}
</span>
</div>
<div class="parame-box-bottom">
<div class="parame-box-bottom-box">
<div class="parame-box-bottom-box-text-top">
{{$t('completednum')}}
</div>
<div class="parame-box-bottom-box-text-num">
{{item.waitFillNum || '--'}}
</div>
</div>
<div class="parame-box-bottom-box">
<div class="parame-box-bottom-box-text-top">
{{$t('filledBy')}}
</div>
<div class="parame-box-bottom-box-text-num">
{{item.waitSdtNum || '--'}}
</div>
</div>
<div class="parame-box-bottom-box">
<div class="parame-box-bottom-box-text-top">
{{$t('parameterToBeInitiated')}}
</div>
<div class="parame-box-bottom-box-text-num">
{{item.waitCollectNum || '--'}}
</div>
</div>
</div>
</div>
</van-list>
</div>
</div>
<van-tabbar v-model="active" @change="onChange">
<van-tabbar-item name="search" icon="search">{{$t('phoneSearch')}}</van-tabbar-item>
<van-tabbar-item name="toDoCenter" icon="bell">{{$t('todocenter')}}</van-tabbar-item>
<van-tabbar-item name="taskData" icon="underway">{{$t('taskStatistics')}}</van-tabbar-item>
<van-tabbar-item name="home" icon="manager">{{$t('mine')}}</van-tabbar-item>
</van-tabbar>
</div>
</template>
<script>
import { getAction, postAction, deleteAction, downloadFile } from '@/api/manage'
import { Toast } from 'vant'
export default {
name: 'phoneTaskData',
data() {
return {
active: 'taskData',
activeTab: 'regulatoryCertification',
language: localStorage.getItem('language'),
pageNo: 0,
pageSize: 10,
loading: false,
finished: false,
dataSource: [],
publishingCount: 0,
preHomoCount: 0,
designCount: 0,
verifyCount: 0,
technologyEvaluationCount: 0,
opinionCollectionCount: 0
}
},
mounted() {
document.title = 'NIO GRP'
this.getProcessDataCount()
},
methods: {
onChange(value) {
if (value == 'toDoCenter') {
this.$router.push({
path: '/phoneToDoCenter'
})
} else if (value == 'search') {
this.$router.push({
path: '/phoneSearch'
})
} else if (value == 'home') {
this.$router.push({
path: '/phoneHome'
})
}
},
regulationListIssuanceClick() {
Toast(this.$t('pleaseProcessThePC'))
},
parameClick() {
Toast(this.$t('pleaseProcessThePC'))
},
processClick(num) {
this.$router.push({
path: '/phoneToDoCenter',
query: {
flowType: num
}
})
},
getProcessDataCount() {
getAction('/phone/taskStatistics/getRegulatoryCertificationProcessDataCount', {}).then((res) => {
if (res.success) {
this.publishingCount = res.result.publishingCount || 0
this.preHomoCount = res.result.preHomoCount || 0
this.designCount = res.result.designCount || 0
this.verifyCount = res.result.verifyCount || 0
this.technologyEvaluationCount = res.result.technologyEvaluationCount || 0
this.opinionCollectionCount = res.result.opinionCollectionCount || 0
} else {
this.publishingCount = 0
this.preHomoCount = 0
this.designCount = 0
this.verifyCount = 0
this.technologyEvaluationCount = 0
this.opinionCollectionCount = 0
}
})
},
activeChange() {
if (this.activeTab == 'regulatoryCertification') {
this.getProcessDataCount()
} else if (this.activeTab == 'parametercollection') {
this.loading = true
this.dataSource = []
this.finished = false
this.pageNo = 1
this.getList()
}
},
onLoad() {
if (this.finished) {
this.dataSource = []
this.finished = false
} else {
this.pageNo++
this.getList()
}
},
getList() {
let query = {
pageNo: this.pageNo,
pageSize: this.pageSize
}
getAction('todoCenter/params/manifest/page', query).then((res) => {
if (res.success) {
if (res.result.records.length > 0 && this.pageNo > 1) {
this.dataSource = this.dataSource.concat(res.result.records)
} else if (res.result.records.length > 0 && this.pageNo == 1) {
this.dataSource = res.result.records
} else if (res.result.records.length == 0) {
this.finished = true
}
this.loading = false
} else {
this.dataSource = []
}
})
}
}
}
</script>
<style scoped>
::v-deep .van-tabbar-item--active {
color: #00B3BE;
}
.box {
padding-top: 1.32rem;
overflow: hidden;
}
.content {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 1000;
background: #fff;
padding-top: 0.16rem;
}
::v-deep .van-tabs__line {
background-color: #00B3BE;
}
::v-deep .van-tab {
font-size: 0.38rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
flex: none;
margin-right: 0.6rem;
}
::v-deep .van-tab--active {
font-size: 0.38rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #040B29;
}
.regulatory {
padding: 0.36rem 0.36rem 0 0.36rem;
background: #fff;
box-shadow: 0.1rem 0.1rem 0.16rem 0 rgba(54, 61, 84, 0.05);
border-radius: 0.2rem;
}
.parameter {
padding: 0.36rem;
background: #fff;
box-shadow: 0.1rem 0.1rem 0.16rem 0 rgba(54, 61, 84, 0.05);
border-radius: 0.2rem;
}
.regulatory-box {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
}
::v-deep .van-tabs {
padding: 0 0.4rem;
}
.content-box {
width: 100%;
padding: 0.4rem;
background: #F7F7F8;
margin-bottom: 1.3rem;
}
.content-box-text {
font-size: 0.4rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 500;
color: #040B29;
margin-bottom: 0.4rem;
margin-top: 0.2rem;
}
.content-box-data {
background: #F7F8FA;
border-radius: 0.2rem;
padding: 0.42rem;
box-sizing: border-box;
width: calc(50% - 0.2rem);
display: inline-block;
margin-right: 0.4rem;
margin-bottom: 0.4rem;
}
.content-box-data:nth-child(even) {
margin-right: 0;
}
.content-box-data-text {
font-size: 0.36rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #41475E;
word-break: break-all;
}
.content-box-data-num {
font-size: 0.44rem;
font-family: PingFang SC-Medium, PingFang SC;
font-weight: 600;
color: #01A0AC;
margin-top: 0.12rem;
}
.parame-box {
padding: 0.36rem;
box-sizing: border-box;
background: #F7F8FA;
border-radius: 0.2rem;
margin-bottom: 0.3rem;
}
.parame-box:last-child {
margin-bottom: 0;
}
.parame-box-top {
display: flex;
margin-bottom: 0.12rem;
}
.parame-box-top-text-left {
font-size: 0.36rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #868A9A;
display: inline-block;
margin-right: 0.12rem;
flex: 1;
word-break: break-all;
}
.parame-box-top-text-left-one {
flex: 1.1;
}
.parame-box-top-text-right {
font-size: 0.36rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #040B29;
flex: 3;
word-break: break-all;
}
.parame-box-top-text-right-one {
flex: 2;
}
.parame-box-bottom {
display: flex;
justify-content: space-between;
margin-top: 0.18rem;
}
.parame-box-bottom-box {
width: calc(33% - 0.16rem);
background: #fff;
display: inline-block;
text-align: center;
padding: 0.26rem 0.16rem;
box-sizing: border-box;
border-radius: 0.2rem;
}
.parame-box-bottom-box-text-top {
font-size: 0.32rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 400;
color: #595E72;
word-break: break-all;
}
.parame-box-bottom-box-text-num {
font-size: 0.44rem;
font-family: PingFang SC-Regular, PingFang SC;
font-weight: 600;
color: #01A0AC;
margin-top: 0.12rem;
}
::v-deep .van-tabs__nav--line.van-tabs__nav--complete {
padding-left: 0;
}
::v-deep .van-tabs__wrap--scrollable .van-tab {
padding: 0 0.1rem;
}
</style>
File diff suppressed because it is too large Load Diff
@@ -92,7 +92,7 @@
</a-row>
</a-form-model>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -258,7 +258,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -571,7 +571,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -533,7 +533,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" v-if="formInline.roleCodeIndex == 0" type="primary" :loading="confirmLoading">
{{$t('submit')}}
</a-button>
@@ -478,7 +478,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
</div>
</a-drawer>
<viewFileModel ref="viewFileModelRef"/>
@@ -151,7 +151,7 @@
<!-- />-->
<!-- </div>-->
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('determine')}}</a-button>
</div>
</a-drawer>
@@ -41,7 +41,7 @@
</div>
<div class="box-content">
<div class="box-content-left">
<div id="main-left"></div>
<div id="main-left-Collect"></div>
</div>
</div>
<responsibilityList @responsibility="responsibility" ref="responsibilityListRef"/>
@@ -186,7 +186,7 @@
this.submitdata = this.submitquantity
this.syncReportdata = this.syncReportquantity
}
var chartDom = document.getElementById('main-left')
var chartDom = document.getElementById('main-left-Collect')
var myChart = echarts.init(chartDom)
var option
var option1
@@ -345,7 +345,7 @@
},
mainLeftEcharts(data, color) {
this.getEcharts('main-left', this.$t('Parametercollection'), color, data, 1)
this.getEcharts('main-left-Collect', this.$t('Parametercollection'), color, data, 1)
},
responsibility(item) {
this.$emit('currentStatus', item)
@@ -367,7 +367,7 @@
border: 2px #eff1f3 solid;
border-radius: 6px;
#main-left {
#main-left-Collect {
width: 100%;
height: 100%;
padding: 24px 20px;
@@ -387,7 +387,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleOk" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -125,7 +125,7 @@
</div>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -61,7 +61,7 @@
/>
</div>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -171,7 +171,7 @@
/>
</div>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -125,7 +125,7 @@
/>
</div>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
<!-- 清单弹框 -->
@@ -95,7 +95,7 @@
<div class="title-text">
<!-- <span class="title-text-text" :title="$t('Required')">{{$t('Required')}}</span>-->
</div>
<a-button style="margin-right: .8rem" @click="addConfiguration(index)" :loading="loading" v-has="'params:config:add'">{{$t('addConfiguration')}}
<a-button style="margin-right: 8px" @click="addConfiguration(index)" :loading="loading" v-has="'params:config:add'">{{$t('addConfiguration')}}
</a-button>
<a-button @click="deleteConfiguration(item.id,index)" v-has="'params:config:delete'" type="primary" :loading="confirmLoading">
{{$t('deleteConfiguration')}}
@@ -107,7 +107,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -87,7 +87,7 @@
/>
</div>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>
</div>
</div>
@@ -45,7 +45,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="handleSubmit" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>
@@ -93,7 +93,7 @@
</div>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
</div>
</a-drawer>
<responsibilityList ref="responsibilityListRef"/>
@@ -151,7 +151,7 @@
</a-button>
</div>
<!-- <div class='drawer-bootom-button'>-->
<!-- <a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>-->
<!-- <a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('submit') }}</a-button>-->
<!-- </div>-->
</div>
@@ -46,9 +46,9 @@
</a-button>
</a-dropdown>
<a-popconfirm title="确定放弃编辑?" @confirm="close" okText="确定" cancelText="取消">
<a-button style="margin-right: .8rem">取消</a-button>
<a-button style="margin-right: 8px">取消</a-button>
</a-popconfirm>
<a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost style="margin-right: 0.8rem">仅保存</a-button>
<a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost style="margin-right: 8px">仅保存</a-button>
<a-button @click="handleSubmit(true)" type="primary" :loading="loading">保存并关闭</a-button>
</div>
<dept-role-datarule-modal ref="datarule"></dept-role-datarule-modal>
@@ -41,7 +41,7 @@
</a-button>
</a-dropdown>
<a-popconfirm :title="$t('AreYouWantDiscardEditing')" @confirm="close" :okText="$t('determine')" :cancelText="$t('cancel')">
<a-button style="margin-right: .8rem">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px">{{$t('cancel')}}</a-button>
</a-popconfirm>
<a-button @click="handleSubmit(true)" type="primary">{{$t('preservation')}}</a-button>
</div>
@@ -59,7 +59,7 @@
</a-form-model>
</a-spin>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('determine') }}</a-button>
</div>
</div>
@@ -216,7 +216,7 @@
<div class="drawer-bootom-button" v-show="!disableSubmit">
<!-- <a-popconfirm :title="$t('AreYouWantDiscardEditing')" @confirm="handleCancel" :okText="$t('determine')"-->
<!-- :cancelText="$t('cancel')">-->
<a-button style="margin-right: .8rem" @click="handleSubmit">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleSubmit">{{$t('cancel')}}</a-button>
<!-- </a-popconfirm>-->
<a-button @click="handleSubmitOk" type="primary" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
@@ -43,10 +43,10 @@
</a-button>
</a-dropdown>
<!-- <a-popconfirm title="确定放弃编辑?" @confirm="close" okText="确定" cancelText="取消">-->
<!-- <a-button style="margin-right: .8rem">取消</a-button>-->
<!-- <a-button style="margin-right: 8px">取消</a-button>-->
<!-- </a-popconfirm>-->
<a-button @click="close()" type="primary" :loading="loading" ghost style="margin-right: 0.8rem">取消</a-button>
<a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost style="margin-right: 0.8rem">仅保存</a-button>
<a-button @click="close()" type="primary" :loading="loading" ghost style="margin-right: 8px">取消</a-button>
<a-button @click="handleSubmit(false)" type="primary" :loading="loading" ghost style="margin-right: 8px">仅保存</a-button>
<a-button @click="handleSubmit(true)" type="primary" :loading="loading">保存并关闭</a-button>
</div>
@@ -34,7 +34,7 @@
</a-form-model>
</a-spin>
<div class='drawer-bootom-button'>
<a-button style='margin-right: .8rem' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button style='margin-right: 8px' @click='handleCancel'>{{ $t('cancel') }}</a-button>
<a-button @click='handleSubmit' type='primary' :loading='confirmLoading'>{{ $t('determine') }}</a-button>
</div>
</div>
@@ -117,7 +117,7 @@
width: 170
},
{
title: this.$t('relatedVersion'),
title: this.$t('Version'),
align: 'left',
dataIndex: 'version',
ellipsis: true,
@@ -116,7 +116,7 @@
</a-form-model>
</div>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button @click="determineClick" type="primary">{{$t('determine')}}</a-button>
</div>
</a-drawer>
+31 -21
View File
@@ -148,12 +148,12 @@
</a-col>
</a-row>
<a-row>
<a-col :span="13">
<a-col :span="12">
<a-form-item>
<a-checkbox v-decorator="['rememberMe', {initialValue: true, valuePropName: 'checked'}]">自动登录</a-checkbox>
</a-form-item>
</a-col>
<a-col :span="6">
<a-col :span="12" style="text-align: right">
<a-form-item>
<a-button type="primary" @click="ssoLogin">sso登录</a-button>
</a-form-item>
@@ -194,8 +194,8 @@
import Vue from 'vue'
import { putAction, postAction, getAction } from '@/api/manage'
import { getRSAPublicKey } from '@/api/login.js'
import { login, logout, phoneLogin, thirdLogin } from "@/api/login"
import { ACCESS_TOKEN, USER_NAME,USER_INFO,UI_CACHE_DB_DICT_DATA } from "@/store/mutation-types"
import { login, logout, phoneLogin, thirdLogin } from '@/api/login'
import { ACCESS_TOKEN, USER_NAME, USER_INFO, UI_CACHE_DB_DICT_DATA } from '@/store/mutation-types'
const Base64 = require('js-base64').Base64
import { JSEncrypt } from 'jsencrypt'
@@ -229,7 +229,7 @@
randCodeImage: '',
requestCodeSuccess: false,
rsaPublicKey: '',
code:''
code: ''
}
},
created() {
@@ -237,12 +237,12 @@
Vue.ls.remove(ACCESS_TOKEN)
this.handleChangeCheckCode()
let query =[]
if(this.$route.query.redirect){
query=this.$route.query.redirect.includes('code=')?this.$route.query.redirect.split('code='):[]
this.code=query[1]
let query = []
if (this.$route.query.redirect) {
query = this.$route.query.redirect.includes('code=') ? this.$route.query.redirect.split('code=') : []
this.code = query[1]
}
if(this.code){
if (this.code) {
this.ssoLoginSuccess()
}
this.getRouterData()
@@ -358,7 +358,13 @@
if (!langCn) {
localStorage.setItem('language', 'zh-cn')
}
this.$router.push({ path: '/dashboard/analysis' }).catch((res) => {
let fullPath = ''
if (this.mobile) {
fullPath = '/phoneSearch'
} else {
fullPath = '/dashboard/analysis'
}
this.$router.push({ path: fullPath }).catch((res) => {
})
this.$notification.success({
message: '欢迎',
@@ -413,11 +419,11 @@
})
},
//sso登录跳转
ssoLogin(){
ssoLogin() {
window.open('https://signin-test.nio.com/oauth2/authorize?client_id=100679&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fdashboard%2Fanalysis&response_type=code', '_blank')
},
//sso登录
ssoLoginSuccess(){
ssoLoginSuccess() {
let that = this
let loginParams = {}
loginParams.checkKey = that.currdatetime
@@ -425,24 +431,28 @@
// 新建JSEncrypt对象
let encrypt = new JSEncrypt()
encrypt.setPublicKey(loginParams.rsaPublicKey)
getAction(`opensso/callback`,{code:this.code}).then(res=>{
if(res.success){
getAction(`opensso/callback`, { code: this.code }).then(res => {
if (res.success) {
Vue.ls.set(ACCESS_TOKEN, res.result.token, 7 * 24 * 60 * 60 * 1000)
Vue.ls.set(USER_NAME, res.result.userInfo.username, 7 * 24 * 60 * 60 * 1000)
Vue.ls.set(USER_INFO, res.result.userInfo, 7 * 24 * 60 * 60 * 1000)
Vue.ls.set(UI_CACHE_DB_DICT_DATA, res.result.sysAllDictItems, 7 * 24 * 60 * 60 * 1000)
this.$store.commit('SET_TOKEN', res.result.token)
this.$store.commit('SET_INFO', res.result.userInfo)
this.$store.commit('SET_NAME', { username: res.result.userInfo.username,realname: res.result.userInfo.realname, welcome: welcome() })
this.$store.commit('SET_NAME', {
username: res.result.userInfo.username,
realname: res.result.userInfo.realname,
welcome: welcome()
})
this.$store.commit('SET_AVATAR', res.result.userInfo.avatar)
this.loginSuccess()
}else if(res.message=='单点登录获取access_token失败'){
} else if (res.message == '单点登录获取access_token失败') {
this.ssoLogin()
}else{
} else {
this.$message.error(res.message)
}
})
},
}
}
}
@@ -529,9 +539,9 @@
height: 46% !important;
background: transparent;
min-height: 0;
padding: 0 2rem 0 2rem;
padding: 0 0.4rem 0 0.4rem;
position: absolute;
top: 50%;
top: 3.6rem;
margin-top: 6rem;
transform: translateY(-50%);
@@ -185,7 +185,7 @@
</a-form-model>
</a-spin>
<div class="drawer-bootom-button">
<a-button style="margin-right: .8rem" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button style="margin-right: 8px" @click="handleCancel">{{$t('cancel')}}</a-button>
<a-button type="primary" @click="handleSubmit" :loading="confirmLoading">{{$t('submit')}}</a-button>
</div>
</a-drawer>

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