From e6acb39a2475e211f2c1decc45a95c868239c25f Mon Sep 17 00:00:00 2001 From: liukangdong <898885815@qq.com> Date: 星期五, 18 十月 2024 14:28:32 +0800 Subject: [PATCH] ll --- h5/pages/staff/vehicle/shiwai.vue | 17 h5/pages/staff/vehicle/sendACar.vue | 17 h5/pages/staff/vehicle/shinei.vue | 2 admin/src/api/system/sms.js | 17 admin/src/components/system/role/PermissionConfigWindow.vue | 35 admin/src/components/operation/OperCarUseBookParamWindow.vue | 39 h5/pages/staff/task/visitorApprove.vue | 3 h5_meeting/unpackage/release/apk/会议室.apk | 0 h5/pages/staff/task/driver.vue | 1 admin/src/components/common/CommonHeader.vue | 28 h5/pages/staff/memberSel.vue | 5 admin/src/components/system/role/OperaSystemRoleDataWindow.vue | 84 +- h5/manifest.json | 40 + admin/src/views/login.vue | 91 ++ h5/pages/staff/meetingSubOrder.vue | 2 h5/pages/staff/task/visitorReport.vue | 1 h5/pages/staff/index.vue | 161 ++--- h5/pages/staff/meetingSel.vue | 5 admin/src/components/common/GlobalAlertWindow.vue | 1 h5/pages/staff/task/index.vue | 11 admin/src/views/system/publicMsg.vue | 159 ++++ h5/App.vue | 13 h5/pages/staff/vehicle/sendACarDetail.vue | 1144 +++++++++++++++++------------------ h5/pages/staff/vehicle/applePeo.vue | 4 admin/src/views/meeting/components/OperaBookingsWindow.vue | 3 pda/unpackage/release/apk/pda.apk | 0 26 files changed, 1,071 insertions(+), 812 deletions(-) diff --git a/admin/src/api/system/sms.js b/admin/src/api/system/sms.js index 9a34d4d..6c3eedb 100644 --- a/admin/src/api/system/sms.js +++ b/admin/src/api/system/sms.js @@ -16,3 +16,20 @@ } }) } + +// 鍏紬鍙烽�氱煡 鍒嗛〉鍒楄〃 +export function getH5List (data) { + return request.post('/visitsAdmin/cloudService/business/wxNoticeConfig/page', data) +} +// 鍏紬鍙烽�氱煡 鐘舵�佹洿鏂� +export function H5StatusUpdate (data) { + return request.post('/visitsAdmin/cloudService/business/wxNoticeConfig/updateById', data) +} +// 鍏紬鍙烽�氱煡 鎵归噺鐘舵�佹洿鏂� +export function H5StatussUpdate (data) { + return request.get('/visitsAdmin/cloudService/business/wxNoticeConfig/updateStatus/batch', { + params: { + ...data + } + }) +} \ No newline at end of file diff --git a/admin/src/components/common/CommonHeader.vue b/admin/src/components/common/CommonHeader.vue index cab4be2..8af6eef 100644 --- a/admin/src/components/common/CommonHeader.vue +++ b/admin/src/components/common/CommonHeader.vue @@ -119,7 +119,8 @@ { required: true, message: '璇疯緭鍏ュ師濮嬪瘑鐮�' } ], newPwd: [ - { required: true, message: '璇疯緭鍏ユ柊瀵嗙爜' } + { required: true, message: '璇疯緭鍏ュ瘑鐮�', trigger: 'blur' }, + { validator: this.validatePassword, trigger: 'blur' }, ], confirmPwd: [ { required: true, message: '璇峰啀娆¤緭鍏ユ柊瀵嗙爜' } @@ -133,6 +134,10 @@ // title () { // return this.$route.meta.title // } + }, + mounted() { + console.log('userInfo',this.userInfo); + }, filters: { // 灞曠ず鍚嶇О @@ -154,6 +159,26 @@ this.$nextTick(() => { this.$refs.changePwdDataForm.resetFields() }) + }, + validatePassword(rule, value, callback) { + if (!value) { + callback(new Error('璇疯緭鍏ュ瘑鐮�')); + } else { + const lengthValid = /^.{6,20}$/.test(value); + const hasLetter = /[a-zA-Z]/.test(value); + const hasNumber = /[0-9]/.test(value); + const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value); + + const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length; + + if (!lengthValid) { + callback(new Error('瀵嗙爜闀垮害闇�涓�6鍒�20涓瓧绗�')); + } else if (typesCount < 2) { + callback(new Error('瀵嗙爜闇�鍖呭惈瀛楁瘝銆佹暟瀛楀強鐗规畩瀛楃涓殑鑷冲皯涓ょ')); + } else { + callback(); // 楠岃瘉閫氳繃 + } + } }, getHeaderNav(type){ getAppHeaderNav(type).then(res => { @@ -277,6 +302,7 @@ background: url("../../assets/images/top_ic_bolang@2x.png") no-repeat; flex-shrink: 0; text-align: right; + cursor: pointer; .el-dropdown { top: 2px; color: #fff; diff --git a/admin/src/components/common/GlobalAlertWindow.vue b/admin/src/components/common/GlobalAlertWindow.vue index 53b0597..0907de8 100644 --- a/admin/src/components/common/GlobalAlertWindow.vue +++ b/admin/src/components/common/GlobalAlertWindow.vue @@ -6,6 +6,7 @@ :with-header="true" :width="width" :close-on-press-escape="false" + :close-on-click-modal="false" :wrapper-closable="false" :append-to-body="true" @close="close" diff --git a/admin/src/components/operation/OperCarUseBookParamWindow.vue b/admin/src/components/operation/OperCarUseBookParamWindow.vue index 64f9063..980be80 100644 --- a/admin/src/components/operation/OperCarUseBookParamWindow.vue +++ b/admin/src/components/operation/OperCarUseBookParamWindow.vue @@ -107,7 +107,7 @@ title="閫夋嫨鐢ㄨ溅鏃堕棿" :visible.sync="isShowTime" append-to-body - width="600px" + width="640px" > <el-form :model="form" ref="modalRef" class="el_form" :rules="rules"> <el-form-item label="鐢ㄨ溅鏃ユ湡" prop="dateDay"> @@ -587,32 +587,41 @@ div { line-height: 28px; } - } + } } .time_list { display: flex; - justify-content: space-between; flex-wrap: wrap; .item { - width: 154px; - height: 32px; - line-height: 32px; - text-align: center; - background: #f7f7f7; - border-radius: 4px; - margin-bottom: 10px; + margin-right: 8px; + margin-bottom: 8px; + font-size: 14px; + font-weight: 400; + line-height: 14px; + width: 124px; + height: 36px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 5px; + color: #111; + border: #cccccc solid 1px; + cursor: pointer; } .active { - background-color: $primary-color; - color: #fff; + border-color: $primary-color; + background-color: #f6f9fe; + color: $primary-color; } .disable { + color: #fff; + border-color: #cccccc; background-color: #cccccc; - color: #999999; } .hasSub { - color: #fff; - background: #cccccc; + border-color: #bed6f9; + background-color: #bed6f9; + color: #fff; } } .color_op { diff --git a/admin/src/components/system/role/OperaSystemRoleDataWindow.vue b/admin/src/components/system/role/OperaSystemRoleDataWindow.vue index 9528a0b..5727a97 100644 --- a/admin/src/components/system/role/OperaSystemRoleDataWindow.vue +++ b/admin/src/components/system/role/OperaSystemRoleDataWindow.vue @@ -1,32 +1,16 @@ <template> - <GlobalWindow - :title="title" - width="60%" - :visible.sync="visible" - :confirm-working="isWorking" - @confirm="confirm" - > - <p class="tip">姝e湪涓鸿鑹层�� <em>{{role.name || '-'}}</em>銆� 閰嶇疆鏁版嵁鏉冮檺</p> + <GlobalWindow :title="title" width="80%" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm"> + <p class="tip">姝e湪涓鸿鑹层�� <em>{{ role.name || '-' }}</em>銆� 閰嶇疆鏁版嵁鏉冮檺</p> <p class="tip-warn"><i class="el-icon-warning"></i>鎻愰啋锛氭潈闄愰厤缃悗闇�閲嶆柊鐧诲綍鍚庣敓鏁�</p> <el-form :model="form" ref="form" style="margin-top:15px"> <el-form-item label="鏉冮檺绫诲瀷锛�" prop="type"> <el-select v-model="form.type" clearable filterable placeholder="璇烽�夋嫨鏉冮檺绫诲瀷"> - <el-option - v-for="(item, index) in options" - :key="index" - :label="item.name" - :value="item.id" - > + <el-option v-for="(item, index) in options" :key="index" :label="item.name" :value="item.id"> </el-option> </el-select> </el-form-item> <el-form-item v-if="form.type == 4" label="鑷畾涔夐儴闂細" prop="customData"> - <el-cascader - :options="departments" - v-model="form.customData" - :props=defaultProps - clearable - ></el-cascader> + <el-cascader :options="departments" v-model="form.customData" :props=defaultProps clearable></el-cascader> </el-form-item> </el-form> @@ -38,13 +22,13 @@ import GlobalWindow from '@/components/common/GlobalWindow' import { createRoleDataPermission } from '@/api/system/role' import { fetchList } from '@/api/business/company' - // import the styles +// import the styles import '@riophae/vue-treeselect/dist/vue-treeselect.css' export default { name: 'OperaSystemRoleWindow', extends: BaseOpera, components: { GlobalWindow }, - data () { + data() { return { options: [ { name: '鍏ㄩ儴', id: 0 }, @@ -71,11 +55,11 @@ value: 'id', emitPath: false }, - role:{}, + role: {}, departments: [] } }, - created () { + created() { this.config({ api: '/system/role', 'field.id': 'id' @@ -84,18 +68,18 @@ }, methods: { // 閮ㄩ棬鏍戠姸缁撴瀯鏁版嵁 - treeComList () { + treeComList() { fetchList() .then(res => { // this.departments = this.tree([res]) - this.departments =this.newTree(res) + this.departments = this.newTree(res) }) }, - open (title, target,role) { + open(title, target, role) { // console.log(title, target) this.title = title this.visible = true - this.role=role + this.role = role // 鏂板缓 if (target == null) { this.$nextTick(() => { @@ -109,33 +93,33 @@ for (const key in this.form) { this.form[key] = target[key] } - console.log(target); - if (target.customData === undefined ||target.customData === null || target.customData === '') { + console.log(target) + if (target.customData === undefined || target.customData === null || target.customData === '') { this.form.customData = [] } else { - const customD = this.form.customData.split(',') + const customD = this.form.customData.split(',') this.form.customData = customD.map((item) => { return parseInt(item) }) } }) }, newTree(tree) { - if(tree ==null){ + if (tree == null) { return [] } return tree.map(item => { - let newItem = {...item} - if(newItem){ - newItem.children=newItem.childList + let newItem = { ...item } + if (newItem) { + newItem.children = newItem.childList } if (item.children && item.children.length == 0) { - this.$delete( newItem, 'children' ) + this.$delete(newItem, 'children') } else { newItem.children = this.newTree(newItem.children) } return newItem - }); + }) }, - __confirmCreate () { + __confirmCreate() { // console.log(JSON.stringify(this.form.customData)); // return this.$refs.form.validate((valid) => { @@ -164,7 +148,7 @@ }) }) }, - __confirmEdit () { + __confirmEdit() { // console.log(JSON.stringify(this.form.customData)); // return this.$refs.form.validate((valid) => { @@ -196,3 +180,25 @@ } } </script> +<style scoped lang="scss"> +.transfer { + height: 600px; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + + ::v-deep .el-transfer-panel { + flex: 1; + height: 100%; + } + + ::v-deep .el-transfer-panel__body { + height: 500px; + } + + ::v-deep .el-transfer-panel__list.is-filterable { + height: 480px; + } +} +</style> diff --git a/admin/src/components/system/role/PermissionConfigWindow.vue b/admin/src/components/system/role/PermissionConfigWindow.vue index 63f4835..4a08fbf 100644 --- a/admin/src/components/system/role/PermissionConfigWindow.vue +++ b/admin/src/components/system/role/PermissionConfigWindow.vue @@ -1,25 +1,12 @@ <template> - <GlobalWindow - :visible.sync="visible" - :confirm-working="isWorking" - width="582px" - title="閰嶇疆瑙掕壊鏉冮檺" - @confirm="confirm" - > - <p class="tip" v-if="role != null">涓鸿鑹� <em>{{role.name}}</em> 閰嶇疆鏉冮檺</p> + <GlobalWindow :visible.sync="visible" :confirm-working="isWorking" width="80%" title="閰嶇疆瑙掕壊鏉冮檺" @confirm="confirm"> + <p class="tip" v-if="role != null">涓鸿鑹� <em>{{ role.name }}</em> 閰嶇疆鏉冮檺</p> <p class="tip-warn"><i class="el-icon-warning"></i>鎻愰啋锛氭潈闄愰厤缃悗闇�閲嶆柊鐧诲綍鍚庣敓鏁�</p> - <el-transfer - ref="permissionTransfer" - v-model="selectedIds" - filterable - class="transfer" - :filter-method="filterPermissions" - :titles="['鏈巿鏉冩潈闄�', '宸叉巿鏉冩潈闄�']" - :props="{ + <el-transfer ref="permissionTransfer" v-model="selectedIds" filterable class="transfer" + :filter-method="filterPermissions" :titles="['鏈巿鏉冩潈闄�', '宸叉巿鏉冩潈闄�']" :props="{ key: 'id', label: 'name' - }" - :data="permissions"> + }" :data="permissions"> </el-transfer> </GlobalWindow> </template> @@ -31,7 +18,7 @@ export default { name: 'PermissionConfigWindow', components: { GlobalWindow }, - data () { + data() { return { visible: false, isWorking: false, @@ -47,7 +34,7 @@ /** * @role 瑙掕壊瀵硅薄 */ - open (role) { + open(role) { if (this.$refs.permissionTransfer) { this.$refs.permissionTransfer.clearQuery('left') this.$refs.permissionTransfer.clearQuery('right') @@ -72,7 +59,7 @@ }) }, // 纭閫夋嫨鏉冮檺 - confirm () { + confirm() { this.isWorking = true createRolePermission({ roleId: this.role.id, @@ -91,7 +78,7 @@ }) }, // 鎼滅储鏉冮檺 - filterPermissions (query, item) { + filterPermissions(query, item) { const lowerCaseQuery = query.toLowerCase() return item.code.toLowerCase().indexOf(lowerCaseQuery) > -1 || item.name.toLowerCase().indexOf(lowerCaseQuery) > -1 } @@ -101,6 +88,7 @@ <style scoped lang="scss"> @import "@/assets/style/variables.scss"; + .global-window { .tip { em { @@ -109,10 +97,12 @@ font-weight: bold; } } + .tip-warn { margin: 4px 0 12px 0; font-size: 12px; color: #999; + i { color: orange; margin-right: 4px; @@ -122,6 +112,7 @@ } } } + .transfer { height: 600px; width: 100%; diff --git a/admin/src/views/login.vue b/admin/src/views/login.vue index 652081b..d0312a4 100644 --- a/admin/src/views/login.vue +++ b/admin/src/views/login.vue @@ -6,39 +6,55 @@ <div class="h3">鏅烘収鐗╂祦鍥尯瀹夋秷涓�浣撳寲绯荤粺</div> </div> <div class="form_wrap"> - <!-- <div class="tabs"> - <div class="tab active"> + <div class="tabs"> + <div class="tab" @click="tabClick('0')" :class="{ active: activeTab == '0' }"> <div class="name">甯愬彿鐧诲綍</div> <div class="icon"></div> </div> - <div class="tab"> + <div class="tab" @click="tabClick('1')" :class="{ active: activeTab == '1' }"> <div class="name">鎵嬫満鐧诲綍</div> <div class="icon"></div> </div> - </div> --> - <div class="df_ac"> - <div class="label">甯愬彿</div> - <div class="line"> - <el-input v-model="username" placeholder="璇疯緭鍏ュ笎鍙�" maxlength="50" v-trim /> - </div> </div> - <div class="df_ac"> - <div class="label">瀵嗙爜</div> - <div class="line"> - <el-input v-model="password" placeholder="璇疯緭鍏ュ瘑鐮�" type="password" maxlength="30" show-password /> + <template v-if="activeTab == '0'"> + <div class="df_ac"> + <div class="label">甯愬彿</div> + <div class="line"> + <el-input v-model="username" placeholder="璇疯緭鍏ュ笎鍙�" maxlength="50" v-trim /> + </div> </div> - </div> + <div class="df_ac"> + <div class="label">瀵嗙爜</div> + <div class="line"> + <el-input v-model="password" placeholder="璇疯緭鍏ュ瘑鐮�" type="password" maxlength="30" show-password /> + </div> + </div> + <div class="df_ac"> + <div class="label">楠岃瘉鐮�</div> + <div class="line"> + <el-input v-model="captcha.value" placeholder="璇疯緭鍏ラ獙璇佺爜" maxlength="4" @keypress.enter.native="login" /> + <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha"> + <span v-else><i class="el-icon-loading"></i></span> + </div> + </div> + </template> + <template v-if="activeTab == '1'"> + <div class="df_ac"> + <div class="label">鎵嬫満鍙�</div> + <div class="line"> + <el-input v-model="password" placeholder="璇疯緭鍏ユ墜鏈哄彿" type="password" maxlength="30" show-password /> + </div> + </div> + <div class="df_ac"> + <div class="label">楠岃瘉鐮�</div> + <div class="line"> + <el-input v-model="captcha.value" placeholder="璇疯緭鍏ラ獙璇佺爜" maxlength="4" @keypress.enter.native="login" /> + <span class="code_get" @click="getCode">鑾峰彇楠岃瘉鐮�</span> + </div> + </div> + </template> - <div class="df_ac"> - <div class="label">楠岃瘉鐮�</div> - <div class="line"> - <el-input v-model="captcha.value" placeholder="璇疯緭鍏ラ獙璇佺爜" maxlength="4" @keypress.enter.native="login" /> - <img v-if="!captcha.loading" class="code_image" :src="captcha.uri" @click="refreshCaptcha"> - <span v-else><i class="el-icon-loading"></i></span> - </div> - </div> - <el-button :loading="loading" type="primary" class="login_btn" - @click.native.prevent="login">绔嬪嵆鐧诲綍</el-button> + <el-button :loading="loading" type="primary" class="login_btn" @click.native.prevent="login">绔嬪嵆鐧诲綍</el-button> <div class="btn_wrap"> <el-checkbox v-model="isRemPsd"> <span style="font-size: 13px; font-weight: 400" class="placeholder9">璁颁綇瀵嗙爜</span> @@ -66,6 +82,7 @@ isRemPsd: false, username: '', password: '', + activeTab: '1', // 楠岃瘉鐮� captcha: { loading: false, @@ -120,6 +137,13 @@ .finally(() => { this.loading = false }) + }, + getCode() { + console.log('getCode'); + + }, + tabClick(val) { + this.activeTab = val }, // 鍒锋柊楠岃瘉鐮� refreshCaptcha() { @@ -221,7 +245,7 @@ background-color: #fff; box-sizing: border-box; /* padding: 50px 80px 20px; */ - padding: 80px 80px 20px; + padding: 50px 80px 20px; position: relative; .tabs { @@ -236,6 +260,7 @@ flex-direction: column; justify-content: center; align-items: center; + cursor: pointer; .icon { width: 36px; @@ -287,10 +312,11 @@ margin-bottom: 17px; display: flex; width: 100%; - + align-items: center; + position: relative; .el-input { height: 40px; - + flex: 1; // font-size: 14px; ::v-deep .el-input__inner { height: 40px !important; @@ -301,6 +327,17 @@ width: 100px; margin-left: 10px; } + .code_get{ + position: absolute; + top: 10px; + right: 10px; + font-size: 14px; + width: 72px; + z-index: 11; + margin-left: 10px; + cursor: pointer; + color: $primary-color; + } } .forget { diff --git a/admin/src/views/meeting/components/OperaBookingsWindow.vue b/admin/src/views/meeting/components/OperaBookingsWindow.vue index 2d9a785..3f5b2c7 100644 --- a/admin/src/views/meeting/components/OperaBookingsWindow.vue +++ b/admin/src/views/meeting/components/OperaBookingsWindow.vue @@ -466,7 +466,6 @@ .time-item { margin-right: 8px; margin-bottom: 8px; - border: #cccccc solid 1px; font-size: 14px; font-weight: 400; line-height: 14px; @@ -477,6 +476,8 @@ align-items: center; border-radius: 5px; color: #111; + border: #cccccc solid 1px; + cursor: pointer; } .time-item-sel { border-color: $primary-color; diff --git a/admin/src/views/system/publicMsg.vue b/admin/src/views/system/publicMsg.vue new file mode 100644 index 0000000..085dbd0 --- /dev/null +++ b/admin/src/views/system/publicMsg.vue @@ -0,0 +1,159 @@ +<template> + <div class="main_app"> + <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getList(1)" @clear="clear"> + </QueryForm> + <div class="pt16 mb10"> + <el-button type="primary" @click="batchStatus(0)" v-permissions="['business:platformjob:update']">鎵归噺鍚敤</el-button> + <el-button @click="batchStatus(1)" v-permissions="['business:platformjob:update']">鎵归噺绂佺敤</el-button> + </div> + <el-table @selection-change="handleSelectionChange" class="mb20" v-loading="loading" :data="list" stripe> + <el-table-column align="center" type="selection" width="55"> + </el-table-column> + <el-table-column prop="titile" label="娑堟伅鏍囬" min-width="160" show-overflow-tooltip /> + <el-table-column prop="objCode" label="娑堟伅缂栫爜" min-width="150" show-overflow-tooltip /> + <el-table-column prop="tempId" label="妯℃澘ID" min-width="300" show-overflow-tooltip /> + <el-table-column label="鐘舵��" width="120" align="center" fixed="right"> + <template v-slot="scope"> + <el-switch v-permissions="['business:platformjob:update']" v-model="scope.row.status" + @change="changeStatus(scope.row)" :active-value="0" :inactive-value="1"> + </el-switch> + </template> + </el-table-column> + </el-table> + <Pagination @size-change="handleSizeChange" @current-change="getList" :pagination="pagination" /> + </div> +</template> + +<script> +import Pagination from '@/components/common/Pagination' +import QueryForm from '@/components/common/QueryForm' +import { getH5List, H5StatusUpdate, H5StatussUpdate } from '@/api/system/sms' + +import GlobalWindow from '@/components/common/GlobalWindow' +import { Message } from 'element-ui' +import dayjs from 'dayjs' +export default { + components: { + Pagination, + QueryForm, + GlobalWindow, + }, + data() { + return { + ids: [], + isShowDetail: false, + exLoading: false, + loading: false, + pagination: { + pageSize: 10, + page: 1, + total: 0 + }, + filters: {}, + list: [], + queryFormConfig: { + formItems: [ + { + filed: 'titile', + type: 'input', + label: '娑堟伅鏍囬' + }, + { + filed: 'status', + type: 'select', + label: '鍚敤鐘舵��', + options: [ + { value: 0, label: '鍚敤' }, + { value: 1, label: '绂佺敤' }, + ] + }, + { + filed: 'objCode', + type: 'input', + label: '娑堟伅缂栫爜' + } + ], + online: true + }, + } + }, + created() { + this.getList() + }, + methods: { + handleSelectionChange(val) { + this.ids = val.map(i => i.id) + console.log('ids', this.ids) + }, + batchStatus(status) { + const { ids } = this + if (ids.length == 0) return Message.error('璇峰厛閫夋嫨瑕佹洿鏀圭殑鐭俊閫氱煡') + this.$confirm(`纭畾${status == 0 ? '鍚敤' : '绂佺敤'}閫変腑鐨勬墍鏈夌煭淇¢�氱煡鍚�?`, '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + H5StatussUpdate({ + ids: ids.join(','), + status + }).then(res => { + Message.success('鎵归噺鏇存柊鎴愬姛') + this.getList() + }, () => { + this.getList() + }) + }) + + }, + changeStatus(row) { + console.log('row', row) + H5StatusUpdate({ + ...row + }).then(res => { + Message.success('鐘舵�佹洿鏂版垚鍔�') + }, () => { + this.getList() + }) + }, + getList(page) { + const { pagination, filters } = this + this.loading = true + getH5List({ + model: { + ...filters, + }, + capacity: pagination.pageSize, + page: page || pagination.page, + }).then(res => { + this.loading = false + this.list = res.records || [] + this.list.forEach(item => { + item.inTypeTemp = item.inType == 0 ? '鏁存墭鐩�' : '浠剁儫' + item.taskOrigin = 'WMS鑾峰彇' + }) + this.pagination.total = res.total || 0 + }, () => { + this.loading = false + }) + }, + + + clear() { + this.pagination.page = 1 + this.filters = {} + this.getList() + }, + handleSizeChange(capacity) { + this.pagination.pageSize = capacity + } + } +} +</script> +<style lang="scss" scoped> +.param_title { + font-size: 18px; + font-weight: 600; + color: #000000; + margin-bottom: 15px; +} +</style> \ No newline at end of file diff --git a/h5/App.vue b/h5/App.vue index 137957d..487c8ad 100644 --- a/h5/App.vue +++ b/h5/App.vue @@ -29,7 +29,18 @@ max-width: 800rpx; overflow-y: auto; } - +.empty_wrap{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + color: #666666; + min-height: 600rpx; + image{ + width: 300rpx; + height: 300rpx; + } +} .doumee-container .ivu-tabs-nav { width: 100%; } diff --git a/h5/manifest.json b/h5/manifest.json index bde4892..aa547f7 100644 --- a/h5/manifest.json +++ b/h5/manifest.json @@ -41,9 +41,45 @@ ] }, /* ios鎵撳寘閰嶇疆 */ - "ios" : {}, + "ios" : { + "dSYMs" : false + }, /* SDK閰嶇疆 */ - "sdkConfigs" : {} + "sdkConfigs" : { + "ad" : {} + }, + "icons" : { + "android" : { + "hdpi" : "", + "xhdpi" : "", + "xxhdpi" : "", + "xxxhdpi" : "" + }, + "ios" : { + "appstore" : "", + "ipad" : { + "app" : "", + "app@2x" : "", + "notification" : "", + "notification@2x" : "", + "proapp@2x" : "", + "settings" : "", + "settings@2x" : "", + "spotlight" : "", + "spotlight@2x" : "" + }, + "iphone" : { + "app@2x" : "", + "app@3x" : "", + "notification@2x" : "", + "notification@3x" : "", + "settings@2x" : "", + "settings@3x" : "", + "spotlight@2x" : "", + "spotlight@3x" : "" + } + } + } } }, /* 蹇簲鐢ㄧ壒鏈夌浉鍏� */ diff --git a/h5/pages/staff/index.vue b/h5/pages/staff/index.vue index bc60368..a4c96ae 100644 --- a/h5/pages/staff/index.vue +++ b/h5/pages/staff/index.vue @@ -20,7 +20,15 @@ </view> <view class="title_wrap"><view class="name">涓氬姟鍔炵悊</view></view> <view class="container1"> - <view class="left"> + <view class="list"> + <block v-for="item in list1" :key="item.name"> + <view v-if="checkAuth(item.auth)" class="item" @click="jump(item.url)"> + <image :src="item.img" class="icon" /> + <view class="name">{{item.name}}</view> + </view> + </block> + </view> +<!-- <view class="left"> <view class="img_wrap img1" @click="jump('/pages/staff/visitorReport')"> <image src="@/static/staff/ic_fangkebaobei.png" class="img"></image> <view class="h1">璁垮鎶ュ</view> @@ -54,12 +62,19 @@ <view class="h1">淇敼瀵嗙爜</view> <view class="h2">CHANGE PASSWORD</view> </view> - </view> + </view> --> </view> <!-- --> <view class="title_wrap"><view class="name">涓氬姟鏌ヨ</view></view> <view class="container2"> - <view class="img_wrap" @click="jump('/pages/staff/task/index')"> + <view class="list"> + <view class="item" @click="jump(item.url)" v-for="item in list2" :key="item.name"> + <image :src="item.img" class="icon" /> + <view class="name">{{item.name}}</view> + </view> + </view> + +<!-- <view class="img_wrap" @click="jump('/pages/staff/task/index')"> <image class="img" src="@/static/staff/ic_renwuzhongxin.png"></image> <view class="h1">浠诲姟涓績</view> <view class="h2">TASK CENTER</view> @@ -81,7 +96,7 @@ <image class="img" src="@/static/staff/ic_huiyishiguanli.png"></image> <view class="h1">浼氳瀹ょ鐞�</view> <view class="h2">MANAGE MEETING ROOMS</view> - </view> + </view> --> </view> <view class="copyright"> <image src="@/static/logo_s@2x.png" mode="widthFix" /> @@ -95,8 +110,23 @@ export default { data() { return { - userInfo: uni.getStorageSync('userInfo'), - taskInfo: 0 + userInfo: uni.getStorageSync('userInfo') || {permissions: []}, + taskInfo: 0, + list1: [ + { name: '璁垮鎶ュ', url: '/pages/staff/visitorReport', img: require('@/static/home/ic_fangkebaobei@3x.png'),auth: 'weixin:menu:visitcar' }, + { name: '闅愭偅闅忔墜鎷�', url: '/pages/staff/snapshot', img: require('@/static/home/ic_yinhuansuishoupai@3x.png'),auth: 'weixin:menu:hiddendanger' }, + { name: '鐢ㄨ溅鐢宠', url: '/pages/staff/vehicle/index', img: require('@/static/home/ic_yongcheshenqing@3x.png'),auth: 'weixin:menu:usecar' }, + { name: '棰勭害浼氳瀹�', url: '/pages/staff/meetingSub', img: require('@/static/home/ic_yuyuehuiyishi@3x.png'),auth: 'weixin:menu:meeting' }, + { name: '淇敼瀵嗙爜', url: '/pages/changePassword/changePassword', img: require('@/static/home/ic_xiugaimima@3x.png'),auth: 'weixin:menu:password' }, + { name: '鍛樺伐鑰冨嫟', url: '', img: require('@/static/home/ic_kaoqin@3x.png'),auth: 'weixin:menu:attendance' }, + ], + list2: [ + { name: '浠诲姟涓績', url: '/pages/staff/task/index', img: require('@/static/home/ic_renwuzhongxin@3x.png'),auth: 'weixin:menu:taskcenter' }, + { name: '鎴戠殑浼氳鏃ュ巻', url: '/pages/staff/meetingCalendar', img: require('@/static/home/ic_wodehuiyi@3x.png'),auth: 'weixin:menu:meetingcalendar' }, + { name: '娲捐溅璁板綍', url: '/pages/staff/vehicle/sendACar', img: require('@/static/home/ic_paichejilu@3x.png'),auth: 'weixin:menu:usecarrecord' }, + { name: '浼氳瀹ょ鐞�', url: '/pages/staff/meetingManager', img: require('@/static/home/ic_huiyishiguanli@3x.png'),auth: 'weixin:menu:meetingmanage' } + ], + } }, onLoad() { @@ -152,6 +182,7 @@ console.log('----'); this.getTaskInfo() }) + console.log('aaa', this.userInfo.permissions.indexOf('system:user:create')); }, methods: { jump(path) { @@ -159,6 +190,10 @@ url: path }) }, + checkAuth(str) { + const permissions = this.userInfo.permissions + return permissions.indexOf(str) > -1 + }, loginOut() { this.$store.commit('empty') logoutPost() @@ -203,6 +238,25 @@ .main_app { padding-top: 12rpx; } +.list{ + display: flex; + width: 100%; + flex-wrap: wrap; + .item{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 25%; + margin-bottom: 40rpx; + font-size: 26rpx; + image{ + width: 88rpx; + height: 88rpx; + margin-bottom: 20rpx; + } + } +} .banner_wrap { padding: 54rpx 44rpx; color: #fff; @@ -227,107 +281,22 @@ .container1 { display: flex; flex-wrap: wrap; - view { - width: 336rpx; - } - .left { - margin-right: 18rpx; - } - .img_wrap { - position: relative; - padding: 24rpx 0rpx 0 28rpx; - border-radius: 8rpx; - overflow: hidden; - .h1 { - font-weight: 600; - font-size: 32rpx; - color: #222222; - line-height: 48rpx; - margin-bottom: 4rpx; - } - .h2 { - font-size: 22rpx; - color: #7b9da1; - line-height: 34rpx; - } - .img { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - z-index: -1; - } - } - .img1 { - width: 336rpx; - height: 296rpx; - margin-bottom: 16rpx; - } - .img2 { - width: 336rpx; - height: 140rpx; - margin-bottom: 16rpx; - } + padding: 10rpx 0 10rpx; } .container2 { display: flex; flex-wrap: wrap; - .img_wrap { - width: 336rpx; - height: 140rpx; - margin-bottom: 16rpx; - position: relative; - border-radius: 8rpx; - overflow: hidden; - padding: 24rpx 0rpx 0 28rpx; - &:nth-of-type(2n) { - margin-left: 18rpx; - } - .task_num { - position: absolute; - left: 168rpx; - top: 26rpx; - width: 52rpx; - height: 52rpx; - border-radius: 50%; - /* border: 1px solid; */ - background-color: #fff; - color: #db534c; - display: flex; - align-items: center; - justify-content: center; - font-size: 24rpx; - } - .h1 { - font-weight: 600; - font-size: 32rpx; - color: #222222; - line-height: 48rpx; - margin-bottom: 4rpx; - } - .h2 { - font-size: 22rpx; - color: #7b9da1; - line-height: 34rpx; - } - .img { - width: 100%; - height: 100%; - position: absolute; - top: 0; - left: 0; - z-index: -1; - } - } } .copyright { display: flex; align-items: center; justify-content: center; - margin-top: 44rpx; font-size: 24rpx; color: #666666; + position: fixed; + width: 100%; + left: 0; + bottom: 88rpx; image { width: 40rpx; height: 40rpx; diff --git a/h5/pages/staff/meetingSel.vue b/h5/pages/staff/meetingSel.vue index 9fb133c..a5b2594 100644 --- a/h5/pages/staff/meetingSel.vue +++ b/h5/pages/staff/meetingSel.vue @@ -22,7 +22,10 @@ mode="widthFix" class="checked"></image> <text></text> </view> - <view class="empty"></view> + <view v-if="memberList.length == 0" class="empty"> + <image src="@/static/empty.png" mode=""></image> + <text>鏆傛棤鏁版嵁</text> + </view> </view> <!-- --> <view class="sub_wrap"> diff --git a/h5/pages/staff/meetingSubOrder.vue b/h5/pages/staff/meetingSubOrder.vue index 1d82d33..a99b6a1 100644 --- a/h5/pages/staff/meetingSubOrder.vue +++ b/h5/pages/staff/meetingSubOrder.vue @@ -80,7 +80,7 @@ /> </view> </view> - <view class="item"> + <view class="item" v-if="info.projectList && info.projectList.length > 0"> <view class="name">閫夋嫨鏈嶅姟椤�</view> <view class="line"> <view class="label"> diff --git a/h5/pages/staff/memberSel.vue b/h5/pages/staff/memberSel.vue index 8405ca0..0ec93ae 100644 --- a/h5/pages/staff/memberSel.vue +++ b/h5/pages/staff/memberSel.vue @@ -35,7 +35,10 @@ <text></text> </view> </checkbox-group> - <view class="empty"></view> + <view v-if="memberList.length == 0" class="empty_wrap"> + <image src="../../static/empty.png"></image> + <text>鏆傛棤鏁版嵁</text> + </view> </view> <!-- --> <!-- <view class="sub_wrap"> diff --git a/h5/pages/staff/task/driver.vue b/h5/pages/staff/task/driver.vue index 7018b5d..9726ae1 100644 --- a/h5/pages/staff/task/driver.vue +++ b/h5/pages/staff/task/driver.vue @@ -70,6 +70,7 @@ <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" /> <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img" src="@/static/staff/ic_shenpiren@2x.png" /> + <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image> <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span> <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png" mode="widthFix" /> diff --git a/h5/pages/staff/task/index.vue b/h5/pages/staff/task/index.vue index 8ee559c..56ed2e0 100644 --- a/h5/pages/staff/task/index.vue +++ b/h5/pages/staff/task/index.vue @@ -242,6 +242,7 @@ }, headData: {}, dataList: [], + total: 0, cateList: [ { name: '璁垮鐢宠', id: 0 }, { name: '璁垮鎶ュ', id: 1 }, @@ -258,9 +259,12 @@ // this.getList() // }, onReachBottom() { - // this.pagination.page = 0 - // this.dataList = [] - this.getList() + const { total, dataList} = this + if(dataList.length < total){ + this.getList() + } else { + this.showToast('鏆傛棤鏇村鏁版嵁') + } }, onBackPress(options) { setTimeout(()=>{ @@ -316,6 +320,7 @@ } }).then(res => { this.dataList = [...this.dataList, ...res.data.records] + this.total = res.data.total this.dataList.forEach(i => { if (i.param1) { i.param1 = JSON.parse(i.param1) diff --git a/h5/pages/staff/task/visitorApprove.vue b/h5/pages/staff/task/visitorApprove.vue index d695e11..da9ddc3 100644 --- a/h5/pages/staff/task/visitorApprove.vue +++ b/h5/pages/staff/task/visitorApprove.vue @@ -68,7 +68,8 @@ <view class="avatar"> <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" /> <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img" - src="@/static/staff/ic_shenpiren@2x.png" /> + src="@/static/staff/ic_shenpiren@2x.png" /> + <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image> <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span> <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png" mode="widthFix" /> diff --git a/h5/pages/staff/task/visitorReport.vue b/h5/pages/staff/task/visitorReport.vue index 15e713a..afe5576 100644 --- a/h5/pages/staff/task/visitorReport.vue +++ b/h5/pages/staff/task/visitorReport.vue @@ -63,6 +63,7 @@ <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" /> <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img" src="@/static/staff/ic_shenpiren@2x.png" /> + <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image> <span v-else class="img_name">{{ item.memberName && item.memberName.slice(0, 1) }}</span> <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png" mode="widthFix" /> diff --git a/h5/pages/staff/vehicle/applePeo.vue b/h5/pages/staff/vehicle/applePeo.vue index 42e4a0e..58ec92a 100644 --- a/h5/pages/staff/vehicle/applePeo.vue +++ b/h5/pages/staff/vehicle/applePeo.vue @@ -15,7 +15,7 @@ /> </view> <view class="member_list"> - <view v-for="(item, index) in memberList" :key="item.id" class="line"> + <view @click="changeMem(item, index)" v-for="(item, index) in memberList" :key="item.id" class="line"> <image v-if="item.faceImgFull" :src="item.faceImgFull" @@ -31,14 +31,12 @@ <view class="depart">{{ item.companyName }}</view> </view> <image - @click="changeMem(item, index)" v-if="item.checked" src="@/static/checkbox_sel@2x.png" mode="widthFix" class="checked" ></image> <image - @click="changeMem(item, index)" v-if="!item.checked" src="@/static/meeting/icon/ic_choose@2x.png" mode="widthFix" diff --git a/h5/pages/staff/vehicle/sendACar.vue b/h5/pages/staff/vehicle/sendACar.vue index 997a031..bcf1fcc 100644 --- a/h5/pages/staff/vehicle/sendACar.vue +++ b/h5/pages/staff/vehicle/sendACar.vue @@ -96,7 +96,7 @@ minDate: '', pagination: { page: 0, - capacity: 10 + capacity: 6 }, total: 0, dataList: [], @@ -109,9 +109,12 @@ this.initData() }, onReachBottom() { - if (this.total > 10) { + console.log('onReachBottom'); + if (this.total > this.dataList.length) { this.getList() - } + }else { + this.showToast('鏆傛棤鏇村鏁版嵁') + } }, methods: { getList() { @@ -125,11 +128,7 @@ ...pagination, model: { ...param } }).then(res => { - if (pagination.page === 1) { - this.dataList = res.data.records - } else { - this.dataList = [...list, ...res.data.records] - } + this.dataList = [...this.dataList, ...res.data.records] this.total = res.data.total }) }, @@ -167,7 +166,7 @@ }, initData() { getCarsList({ - type: 1 + type: 0 }).then(res => { this.carsList = [res.data] }) diff --git a/h5/pages/staff/vehicle/sendACarDetail.vue b/h5/pages/staff/vehicle/sendACarDetail.vue index da13b54..6e62334 100644 --- a/h5/pages/staff/vehicle/sendACarDetail.vue +++ b/h5/pages/staff/vehicle/sendACarDetail.vue @@ -1,538 +1,506 @@ -<template> - <view class="main_app"> - <view class="status_wrap"> - <view class="name">{{ info.memberName }}鐨勭敤杞︾敵璇�</view> - <view class="placeholder9">{{ info.companyName }}</view> - <view - class="desc" - :class="{ - gray: info.businessStatus == '2' || info.businessStatus == '3' || info.businessStatus == '4', - }" - >{{ infoStatus }}</view - > - <view class="status"> - <text class="loading" :class="{ - grr: info.status == 1 || info.status == 2 || info.status == 4, - error: info.status == 3 - }" v-if="info.status == '0'">{{statusMap[info.status]}}</text> - </view> - </view> - <!-- --> - <view class="emyty"></view> - <view class="module_list"> - <view class="item"> - <view class="label">棰勮鐢ㄨ溅鏃舵</view> - <view class="value" v-if="info.startTime" - >{{ info.startTime.slice(0, 16) }}鑷硔{ - info.endTime.slice(0, 16) - }}</view - > - </view> - <view class="item"> - <view class="label">棰勮鍑哄彂鏃堕棿</view> - <view class="value">{{ info.planUseDate }}</view> - </view> - <view class="item"> - <view class="label">涔樿溅浜哄憳</view> - <view class="value">{{ info.memberNames }}</view> - </view> - <view class="item"> - <view class="label">鐩殑鍦�</view> - <view class="value" - >{{ info.type == "1" ? "甯傚" : "瀹ゅ唴" }}锛歿{ info.addr }}</view - > - </view> - <view class="item"> - <view class="label">鐢ㄨ溅浜嬬敱</view> - <view class="value">{{ info.content }}</view> - </view> - <view class="item"> - <view class="label">杞﹁締淇℃伅</view> - <view class="value">{{ info.carCode }}</view> - </view> - <view class="item"> - <view class="label">鍙告満淇℃伅</view> - <view class="value">{{ info.driverName }} {{ info.driverPhone }}</view> - </view> - </view> - <!-- 娴佺▼ --> - <view class="flow_wrap"> - <view class="flow_title">娴佺▼</view> - <view - class="list" - v-if=" - info.approveDateVO != null && info.approveDateVO.approveList != null - " - > - <view - class="item" - v-for="(item, index) in info.approveDateVO.approveList" - :key="item.id" - > - <view class="separate"></view> - <view class="avatar"> - <image - v-if="item.type == 1" - class="img" - src="@/static/staff/ic_chaosong@2x.png" - /> - <image - v-else-if="item.approveType == 1 || item.approveType == 0" - class="img" - src="@/static/staff/ic_shenpiren@2x.png" - /> - <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span> - <image - v-if="item.status == 2" - class="status" - src="@/static/staff/liucheng_success@2x.png" - mode="widthFix" - /> - <image - v-if="item.status == 3" - class="status" - src="@/static/staff/liucheng_fail@2x.png" - mode="widthFix" - /> - </view> - <view class="content"> - <view class="head"> - <view class="event">{{ item.title }}</view> - <view class="time">{{ item.checkDate }}</view> - </view> - <view class="name_wrap"> - <text - >{{ item.memberName - }}<text class="status" v-if="item.statusInfo" - >({{ item.statusInfo }})</text - ></text - > - </view> - <view v-if="item.checkInfo" class="remark">{{ - item.checkInfo - }}</view> - <!-- 鎶勯�佷汉 --> - <view v-if="item.approveType == 1" class="children"> - <view - class="child" - v-for="child in item.approveList" - :key="child.id" - > - <image - class="child_img" - :src=" - child.faceImg - ? child.faceImg - : require('@/static/meeting/common/default_user@2x.png') - " - /> - <view>{{ child.memberName }}</view> - </view> - </view> - </view> - </view> - </view> - </view> - <view class="emyty"></view> - <view - class="main_footer" - v-if=" - info.approveDateVO != null && - info.approveDateVO.canBeApproved != null && - info.approveDateVO.canBeApproved == 1 - " - > - <template v-if="appr == '1'"> - <view class="btn" @click="handleSub(3)">鎷掔粷</view> - <view class="btn agree" @click="handleSub(2)">鍚屾剰</view> - </template> - <view v-else class="btn agree" @click="isShowBack = true">鎾ら攢鐢ㄨ溅</view> - </view> - - <!-- 鎾ら攢 --> - <u-popup - :show="isShowBack" - :round="10" - :safeAreaInsetBottom="true" - mode="bottom" - @close="isShowBack = false" - > - <view class="appr_modal"> - <view class="title">鎾ら攢鐢ㄨ溅</view> - <view class="line"> 鎾ら攢璇存槑 </view> - <textarea - v-model="backParam.info" - placeholder="闈炲繀濉�" - placeholder-class="placeholder9" - /> - <view class="main_footer"> - <view class="btn agree" @click="onSubBack">鎻愪氦</view> - </view> - </view> - </u-popup> - <!-- --> - <u-popup - :show="showApprModal" - :round="10" - :safeAreaInsetBottom="true" - mode="bottom" - @close="showApprModal = false" - > - <view class="appr_modal"> - <view class="title">{{ param.status == 2 ? "鍚屾剰" : "鎷掔粷" }}</view> - <view v-if="param.status == 2" class="line" @click="isShowDrive = true"> - <text v-if="param.driverName">{{ param.driverName }}</text> - <text v-else class="placeholder9">娲捐溅鍙告満</text> - <u-icon class="ml12" name="arrow-right" color="#999999" /> - </view> - <textarea - v-model="param.checkInfo" - :placeholder=" - param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑锛屽繀濉�' - " - placeholder-class="placeholder9" - /> - <view class="main_footer"> - <view class="btn" @click="showApprModal = false">鍙栨秷</view> - <view class="btn agree" @click="onSubmit">鎻愪氦</view> - </view> - </view> - </u-popup> - <!-- 鍙告満 --> - <u-picker - keyName="name" - :show="isShowDrive" - @close="isShowDrive = false" - :closeOnClickOverlay="true" - :columns="driveList" - @confirm="seletedDrive" - @cancel="isShowDrive = false" - ></u-picker> - </view> -</template> - -<script> -import { carUseBookDetail, carUseBookAppr, driveListPost, carUseBookBack } from '@/api' -export default { - data() { - return { - showApprModal: false, - isShowBack: false, - backParam: {}, - isShowDrive: false, - id: '', - appr: '', - infoStatus: '', - info: {}, - param: { - status: '' - }, - statusMap: { - 0: '寰呭鎵�', - 1: '瀹℃壒涓�', - 2: '宸查�氳繃', - 3: '鎾ゅ洖鐢宠', - 4: '宸插彇娑�', - }, - driveList: [] - - } - }, - onLoad(option) { - this.id = option.id - this.appr = option.appr || '' - this.infoStatus = option.info - this.getDetail() - }, - methods: { - getDetail() { - const { id } = this - carUseBookDetail(id).then(res => { - this.info = { ...res.data } - }) - }, - onSubBack() { - carUseBookBack({ - id: this.id, - info: this.backParam.info - }).then(res => { - if (res.code === 200) { - uni.showToast({ - title: '鎾ら攢鎴愬姛', - icon: 'success', - duration: 2000 - }) - this.isShowBack = false - setTimeout(() => { - uni.navigateBack() - }, 1000) - } - }) - }, - onSubmit() { - const { param, info } = this - carUseBookAppr({ - status: param.status, - objType: info.type == 1 ? 4 : 3, - objId: this.id, - driverId: param.driverId, - checkInfo: param.checkInfo - }).then(res => { - if (res.code === 200) { - this.showApprModal = false - setTimeout(() => { - uni.showToast({ - title: '鎿嶄綔鎴愬姛', - icon: 'success' - }) - }) - uni.navigateBack() - } - }) - }, - handleSub(status) { - // this.param.flag = - this.param = { - status - } - this.showApprModal = true - if (status === 2) { // 鍚屾剰 - this.getDriveList() - } else { - - } - this.showApprModal = true - }, - getDriveList() { - driveListPost({}).then(res => { - this.driveList = [res.data] - }) - }, - seletedDrive(e) { - console.log(e.value[0]) - this.$set(this.param, 'driverId', e.value[0].id) - this.$set(this.param, 'driverName', e.value[0].name) - this.isShowDrive = false - }, - }, -} -</script> -<style> -page { - background-color: #f7f7f7; -} -</style> -<style lang="scss"> -.main_app { - background-color: #fff; - padding-bottom: 0; - - .flow_wrap { - padding: 30rpx 0; - - .flow_title { - font-weight: 600; - font-size: 32rpx; - color: #222222; - margin-bottom: 24rpx; - } - - .list { - .item { - display: flex; - margin-bottom: 48rpx; - position: relative; - .separate { - position: absolute; - width: 4rpx; - height: 100%; - background-color: #eeeeee; - left: 40rpx; - transform: translate(-50%, 0); - top: 80rpx; - } - .avatar { - width: 80rpx; - height: 80rpx; - position: relative; - margin-right: 20rpx; - display: flex; - align-items: center; - justify-content: center; - .img { - width: 80rpx; - height: 80rpx; - border-radius: 50%; - } - .img_name{ - font-size: 32rpx; - color: #FFFFFF; - } - .status { - width: 28rpx; - height: 28rpx; - border-radius: 50%; - position: absolute; - right: 0; - bottom: 0; - } - } - - .content { - flex: 1; - - .head { - display: flex; - justify-content: space-between; - margin-bottom: 4rpx; - - .event { - font-size: 30rpx; - } - - .time { - font-size: 26rpx; - color: #999999; - } - } - - .name_wrap { - font-size: 26rpx; - color: #777777; - - .status { - color: $uni-color-primary; - } - } - .children { - display: flex; - flex-wrap: wrap; - margin-top: 12rpx; - .child { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin-right: 12rpx; - font-size: 26rpx; - color: #777777; - .child_img { - width: 48rpx; - height: 48rpx; - border-radius: 50%; - margin-bottom: 2rpx; - } - .child_name{ - margin-bottom: 2rpx; - width: 48rpx; - height: 48rpx; - text-align: center; - justify-content: center; - padding-top: 4rpx; - font-size: 28rpx; - border-radius: 50%; - color: #FFFFFF; - background-color: $uni-color-primary; - } - } - } - - .remark { - margin-top: 12rpx; - background-color: #f7f7f7; - padding: 14rpx 20rpx; - border-radius: 8rpx; - font-size: 26rpx; - color: #666666; - line-height: 36rpx; - } - } - .carbon { - display: flex; - width: 590rpx; - overflow-x: auto; - margin-top: 12rpx; - .carbon_item { - text-align: center; - flex-shrink: 0; - width: 100rpx; - image { - width: 60rpx; - height: 60rpx; - margin: 0 auto; - } - view { - font-size: 26rpx; - color: #777777; - } - } - } - &:nth-last-child(1) { - .separate { - height: 0; - } - } - } - } - } - - .module_list { - .item { - padding: 30rpx 0; - border-bottom: 1rpx solid #e5e5e5; - - .label { - font-size: 26rpx; - color: #666666; - margin-bottom: 20rpx; - } - - .value { - font-size: 30rpx; - display: flex; - align-items: center; - - .avatar { - margin-right: 20rpx; - width: 120rpx; - height: 120rpx; - border-radius: 8rpx; - border: 2rpx solid #e5e5e5; - } - - .info { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - font-size: 26rpx; - color: #666666; - - .name { - font-size: 30rpx; - color: #333333; - } - } - } - } - } - - .status_wrap { +<template> + <view class="main_app"> + <view class="status_wrap"> + <view class="name">{{ info.createMemberName }}鎻愪氦鐨勭敤杞︾敵璇�</view> + <view + class="desc" + :class="{ + gray: info.status == '2' || info.status == '3' || info.status == '4', + }" + >{{ infoStatus }}</view + > + <view v-if="info.status == '0' || info.status == '1'" class="status">{{ + statusMap[info.status] + }}</view> + <image v-if="info.status == '2'" src="@/static/ic_passed@2x.png" mode="widthFix" class="status_img"></image> + <image v-if="info.status == '3' || info.status == '6'" src="@/static/ic_refused@2x.png" mode="widthFix" + class="status_img"></image> + </view> + <!-- --> + <view class="emyty"></view> + <view class="module_list"> + <view class="item"> + <view class="label">棰勮鐢ㄨ溅鏃舵</view> + <view class="value" v-if="info.startTime">{{ info.startTime.slice(0, 16) }}鑷硔{ + info.endTime.slice(0, 16) + }}</view> + </view> + <view class="item"> + <view class="label">棰勮鍑哄彂鏃堕棿</view> + <view class="value">{{ info.planUseDate }}</view> + </view> + <view class="item"> + <view class="label">涔樿溅浜哄憳</view> + <view class="value">{{ info.memberNames }}</view> + </view> + <view class="item"> + <view class="label">鐩殑鍦�</view> + <view class="value">{{ info.type == "1" ? "甯傚" : "甯傚唴" }}锛歿{ info.addr }}</view> + </view> + <view class="item"> + <view class="label">鐢ㄨ溅浜嬬敱</view> + <view class="value">{{ info.content }}</view> + </view> + <view class="item"> + <view class="label">杞﹁締淇℃伅</view> + <view class="value">{{ info.carCode }}</view> + </view> + <view class="item"> + <view class="label">鍙告満淇℃伅</view> + <view class="value">{{ info.driverName }} {{ info.driverPhone }}</view> + </view> + </view> + <!-- 娴佺▼ --> + <view class="flow_wrap"> + <view class="flow_title">娴佺▼</view> + <view class="list" v-if=" + info.approveDateVO != null && info.approveDateVO.approveList != null + "> + <view class="item" v-for="(item, index) in info.approveDateVO.approveList" :key="item.id"> + <view class="separate"></view> + <view class="avatar"> + <image v-if="item.type == 1" class="img" src="@/static/staff/ic_chaosong@2x.png" /> + <image v-else-if="item.approveType == 1 || item.approveType == 0" class="img" + src="@/static/staff/ic_shenpiren@2x.png" /> + <image v-else-if="item.faceImg" :src="item.faceImg" class="img"></image> + <span v-else class="img_name">{{item.memberName && item.memberName.slice(0,1)}}</span> + <image v-if="item.status == 2" class="status" src="@/static/staff/liucheng_success@2x.png" + mode="widthFix" /> + <image v-if="item.status == 3" class="status" src="@/static/staff/liucheng_fail@2x.png" mode="widthFix" /> + </view> + <view class="content"> + <view class="head"> + <view class="event">{{ item.title }}</view> + <view class="time">{{ item.checkDate }}</view> + </view> + <view class="name_wrap"> + <text>{{ item.memberName + }}<text :class="{ status: item.statusInfo == '澶勭悊涓�' || item.status == '1' }" + v-if="item.statusInfo">({{ item.statusInfo }})</text></text> + </view> + <view v-if="item.checkInfo" class="remark">{{ + item.checkInfo + }}</view> + <!-- 鎶勯�佷汉 --> + <view v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="children"> + <view class="child" v-for="child in item.approveList" :key="child.id"> + <image v-if="child.faceImg" class="child_img" :src="child.faceImg" /> + <view v-else class="child_name">{{ child.memberName && child.memberName.slice(0,1) }}</view> + <view>{{ child.memberName }}</view> + </view> + </view> + </view> + </view> + </view> + </view> + <view class="emyty"></view> + <view class="main_footer" v-if=" + info.approveDateVO != null && + info.approveDateVO.canBeApproved != null && + info.approveDateVO.canBeApproved == 1 + "> + <template v-if="appr == '1'"> + <view class="btn" @click="handleSub(3)">鎷掔粷</view> + <view class="btn agree" @click="handleSub(2)">鍚屾剰</view> + </template> + <view v-else class="btn agree" @click="isShowBack = true">鎾ら攢鐢ㄨ溅</view> + </view> + + <!-- 鎾ら攢 --> + <u-popup :show="isShowBack" :round="10" :safeAreaInsetBottom="true" mode="bottom" @close="isShowBack = false"> + <view class="appr_modal"> + <view class="title">鎾ら攢鐢ㄨ溅</view> + <view class="line"> 鎾ら攢璇存槑 </view> + <textarea v-model="backParam.info" placeholder="闈炲繀濉�" placeholder-class="placeholder9" /> + <view class="main_footer"> + <view class="btn agree" @click="onSubBack">鎻愪氦</view> + </view> + </view> + </u-popup> + <!-- --> + <u-popup :show="showApprModal" :round="10" :safeAreaInsetBottom="true" mode="bottom" @close="showApprModal = false"> + <view class="appr_modal"> + <view class="title">{{ param.status == 2 ? "鍚屾剰" : "鎷掔粷" }}</view> + <view v-if="param.status == 2" class="line" @click="isShowDrive = true"> + <text v-if="param.driverName">{{ param.driverName }}</text> + <text v-else class="placeholder9">娲捐溅鍙告満</text> + <u-icon class="ml12" name="arrow-right" color="#999999" /> + </view> + <textarea v-model="param.checkInfo" :placeholder=" + param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑锛屽繀濉�' + " placeholder-class="placeholder9" /> + <view class="main_footer"> + <view class="btn" @click="showApprModal = false">鍙栨秷</view> + <view class="btn agree" @click="onSubmit">鎻愪氦</view> + </view> + </view> + </u-popup> + <!-- 鍙告満 --> + <u-picker keyName="name" :show="isShowDrive" @close="isShowDrive = false" :closeOnClickOverlay="true" + :columns="driveList" @confirm="seletedDrive" @cancel="isShowDrive = false"></u-picker> + </view> +</template> + +<script> + import { + carUseBookDetail, + carUseBookAppr, + driveListPost, + carUseBookBack + } from '@/api' + export default { + data() { + return { + showApprModal: false, + isShowBack: false, + backParam: {}, + isShowDrive: false, + id: '', + appr: '', + infoStatus: '', + info: {}, + param: { + status: '' + }, + statusMap: { + 0: '寰呭鎵�', + 1: '瀹℃壒涓�', + 2: '宸查�氳繃', + 3: '鎾ゅ洖鐢宠', + 4: '宸插彇娑�', + }, + driveList: [] + + } + }, + onLoad(option) { + this.id = option.id + this.appr = option.appr || '' + this.infoStatus = option.info + this.getDetail() + }, + methods: { + getDetail() { + const { + id + } = this + carUseBookDetail(id).then(res => { + this.info = { + ...res.data + } + if (this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0) { + this.info.approveDateVO.approveList.forEach(item => { + if (item.approveList && item.approveList.length == 1 && item.type !== 1) { + item.title = item.approveList[0].title + item.faceImg = item.approveList[0].faceImg + item.memberName = item.approveList[0].memberName + item.statusInfo = item.approveList[0].statusInfo + item.status = item.approveList[0].status + item.approveList = [] + } + }) + } + }) + }, + onSubBack() { + carUseBookBack({ + id: this.id, + info: this.backParam.info + }).then(res => { + if (res.code === 200) { + uni.showToast({ + title: '鎾ら攢鎴愬姛', + icon: 'success', + duration: 2000 + }) + this.isShowBack = false + setTimeout(() => { + uni.navigateBack() + }, 1000) + } + }) + }, + onSubmit() { + const { + param, + info + } = this + carUseBookAppr({ + status: param.status, + objType: info.type == 1 ? 4 : 3, + objId: this.id, + driverId: param.driverId, + checkInfo: param.checkInfo + }).then(res => { + if (res.code === 200) { + this.showApprModal = false + setTimeout(() => { + uni.showToast({ + title: '鎿嶄綔鎴愬姛', + icon: 'success' + }) + }) + uni.navigateBack() + } + }) + }, + handleSub(status) { + // this.param.flag = + this.param = { + status + } + this.showApprModal = true + if (status === 2) { // 鍚屾剰 + this.getDriveList() + } else { + + } + this.showApprModal = true + }, + getDriveList() { + driveListPost({}).then(res => { + this.driveList = [res.data] + }) + }, + seletedDrive(e) { + console.log(e.value[0]) + this.$set(this.param, 'driverId', e.value[0].id) + this.$set(this.param, 'driverName', e.value[0].name) + this.isShowDrive = false + }, + }, + } +</script> +<style> + page { + background-color: #f7f7f7; + } +</style> +<style lang="scss"> + .main_app { + background-color: #fff; + padding-bottom: 0; + + .flow_wrap { + padding: 30rpx 0; + + .flow_title { + font-weight: 600; + font-size: 32rpx; + color: #222222; + margin-bottom: 24rpx; + } + + .list { + .item { + display: flex; + margin-bottom: 48rpx; + position: relative; + + .separate { + position: absolute; + width: 4rpx; + height: 100%; + background-color: #eeeeee; + left: 40rpx; + transform: translate(-50%, 0); + top: 80rpx; + } + + .avatar { + width: 80rpx; + height: 80rpx; + position: relative; + margin-right: 20rpx; + display: flex; + align-items: center; + justify-content: center; + + .img { + width: 80rpx; + height: 80rpx; + border-radius: 50%; + } + + .img_name { + font-size: 32rpx; + color: #FFFFFF; + } + + .status { + width: 28rpx; + height: 28rpx; + border-radius: 50%; + position: absolute; + right: 0; + bottom: 0; + } + } + + .content { + flex: 1; + + .head { + display: flex; + justify-content: space-between; + margin-bottom: 4rpx; + + .event { + font-size: 30rpx; + } + + .time { + font-size: 26rpx; + color: #999999; + } + } + + .name_wrap { + font-size: 26rpx; + color: #777777; + + .status { + color: $uni-color-primary; + } + } + + .children { + display: flex; + flex-wrap: wrap; + margin-top: 12rpx; + + .child { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-right: 12rpx; + font-size: 26rpx; + color: #777777; + + .child_img { + width: 48rpx; + height: 48rpx; + border-radius: 50%; + margin-bottom: 2rpx; + } + + .child_name { + margin-bottom: 2rpx; + width: 48rpx; + height: 48rpx; + text-align: center; + justify-content: center; + padding-top: 4rpx; + font-size: 28rpx; + border-radius: 50%; + color: #FFFFFF; + background-color: $uni-color-primary; + } + } + } + + .remark { + margin-top: 12rpx; + background-color: #f7f7f7; + padding: 14rpx 20rpx; + border-radius: 8rpx; + font-size: 26rpx; + color: #666666; + line-height: 36rpx; + } + } + + .carbon { + display: flex; + width: 590rpx; + overflow-x: auto; + margin-top: 12rpx; + + .carbon_item { + text-align: center; + flex-shrink: 0; + width: 100rpx; + + image { + width: 60rpx; + height: 60rpx; + margin: 0 auto; + } + + view { + font-size: 26rpx; + color: #777777; + } + } + } + + &:nth-last-child(1) { + .separate { + height: 0; + } + } + } + } + } + + .module_list { + .item { + padding: 30rpx 0; + border-bottom: 1rpx solid #e5e5e5; + + .label { + font-size: 26rpx; + color: #666666; + margin-bottom: 20rpx; + } + + .value { + font-size: 30rpx; + display: flex; + align-items: center; + + .avatar { + margin-right: 20rpx; + width: 120rpx; + height: 120rpx; + border-radius: 8rpx; + border: 2rpx solid #e5e5e5; + } + + .info { + flex: 1; + display: flex; + flex-direction: column; + justify-content: space-between; + font-size: 26rpx; + color: #666666; + + .name { + font-size: 30rpx; + color: #333333; + } + } + } + } + } + + .status_wrap { position: relative; padding: 30rpx 0; .name { font-weight: 600; font-size: 32rpx; - margin-bottom: 16rpx; + margin-bottom: 20rpx; color: #222222; } .desc { font-size: 26rpx; color: #ed4545; - margin-top: 16rpx; } + .gray { color: #999999; } @@ -548,67 +516,75 @@ background-color: #e9edff; color: $uni-color-primary; } - } - .main_footer { - padding-bottom: 64rpx; - display: flex; - justify-content: space-between; - - .btn { - flex: 1; - height: 88rpx; - line-height: 88rpx; - background: #ffffff; - border-radius: 44rpx; - border: 1rpx solid #999999; - font-size: 32rpx; - text-align: center; - margin: 16rpx; + .status_img { + position: absolute; + right: 0rpx; + top: 20rpx; + width: 120rpx; } - - .agree { - background: $uni-color-primary; - color: #fff; - border: 1rpx solid $uni-color-primary; - } - } - - .appr_modal { - padding: 36rpx 30rpx 0; - .line { - height: 90rpx; - display: flex; - align-items: center; - justify-content: space-between; - border-bottom: 1rpx solid #e4e4e4; - margin-bottom: 20rpx; - } - .title { - font-weight: 600; - font-size: 32rpx; - color: #222222; - margin-bottom: 40rpx; - text-align: center; - } - - textarea { - box-sizing: border-box; - width: 690rpx; - background-color: #f7f7f7; - font-size: 28rpx; - color: #333333; - padding: 24rpx; - border-radius: 8rpx; - margin-bottom: 30rpx; - } - } - - .emyty { - width: 750rpx; - height: 20rpx; - background-color: #f7f7f7; - margin: 0 -30rpx; - } -} -</style> + } + .main_footer { + padding-bottom: 64rpx; + display: flex; + justify-content: space-between; + + .btn { + flex: 1; + height: 88rpx; + line-height: 88rpx; + background: #ffffff; + border-radius: 44rpx; + border: 1rpx solid #999999; + font-size: 32rpx; + text-align: center; + margin: 16rpx; + } + + .agree { + background: $uni-color-primary; + color: #fff; + border: 1rpx solid $uni-color-primary; + } + } + + .appr_modal { + padding: 36rpx 30rpx 0; + + .line { + height: 90rpx; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 1rpx solid #e4e4e4; + margin-bottom: 20rpx; + } + + .title { + font-weight: 600; + font-size: 32rpx; + color: #222222; + margin-bottom: 40rpx; + text-align: center; + } + + textarea { + box-sizing: border-box; + width: 690rpx; + background-color: #f7f7f7; + font-size: 28rpx; + color: #333333; + padding: 24rpx; + border-radius: 8rpx; + margin-bottom: 30rpx; + } + } + + .emyty { + width: 750rpx; + height: 20rpx; + background-color: #f7f7f7; + margin: 0 -30rpx; + } + } +</style> \ No newline at end of file diff --git a/h5/pages/staff/vehicle/shinei.vue b/h5/pages/staff/vehicle/shinei.vue index 5413edf..35e29fe 100644 --- a/h5/pages/staff/vehicle/shinei.vue +++ b/h5/pages/staff/vehicle/shinei.vue @@ -226,7 +226,7 @@ }, initData() { getCarsList({ - type: 1 + type: 0 }).then(res => { this.carsList = [res.data] }) diff --git a/h5/pages/staff/vehicle/shiwai.vue b/h5/pages/staff/vehicle/shiwai.vue index ff51cda..8470ad9 100644 --- a/h5/pages/staff/vehicle/shiwai.vue +++ b/h5/pages/staff/vehicle/shiwai.vue @@ -83,7 +83,7 @@ @confirm="seletedCar" @cancel="isShowCar = false" ></u-picker> - <u-datetime-picker + <!-- <u-datetime-picker mode="datetime" :show="isShowDate" :filter="timeFilter" @@ -93,11 +93,20 @@ :closeOnClickOverlay="true" @confirm="seletedDate" @cancel="isShowDate = false" - /> + /> --> + <u-datetime-picker + mode="datetime" + :show="isShowDate" + title="寮�濮嬫椂闂�" + :minDate="minDate" + @close="isShowDate = false" + :closeOnClickOverlay="true" + @confirm="seletedDate" + @cancel="isShowDate = false" + /> <u-datetime-picker mode="datetime" :show="isShowEndDate" - :filter="timeFilter" title="缁撴潫鏃堕棿" :minDate="new Date(param.startTime || null).getTime()" @close="endtimeClose" @@ -204,7 +213,7 @@ }, initData() { getCarsList({ - type: 1 + type: 0 }).then(res => { this.carsList = [res.data] }) diff --git "a/h5_meeting/unpackage/release/apk/\344\274\232\350\256\256\345\256\244.apk" "b/h5_meeting/unpackage/release/apk/\344\274\232\350\256\256\345\256\244.apk" new file mode 100644 index 0000000..eff3492 --- /dev/null +++ "b/h5_meeting/unpackage/release/apk/\344\274\232\350\256\256\345\256\244.apk" Binary files differ diff --git a/pda/unpackage/release/apk/pda.apk b/pda/unpackage/release/apk/pda.apk new file mode 100644 index 0000000..b25044c --- /dev/null +++ b/pda/unpackage/release/apk/pda.apk Binary files differ -- Gitblit v1.9.3