Browse Source

feat: 增加位置信息并传参给内嵌插件

test2
xuesinan 4 years ago
parent
commit
fe5fe4e7d0
  1. 13
      App.vue
  2. 3
      CHANGELOG.md
  3. 1
      components/Plugin/Plugin.vue
  4. 4
      components/Render/Render.vue
  5. 4
      manifest.json
  6. 43
      plugins/p-deliver-second/p-deliver-second.vue
  7. 299
      plugins/p-deliver-upload-second/p-deliver-upload-second.vue
  8. 20
      store/index.js

13
App.vue

@ -17,6 +17,7 @@ export default {
// console.log('onLaunch options: ', options);
this.checkNetwork(); //
this.getSystemInfo(); //
this.getLocation(); //
const token = this.$store.state.user.token || this.$storage.getStorageSync('anyringToken') || '';
if (token) {
@ -177,6 +178,18 @@ export default {
});
},
getLocation() {
let that = this;
uni.getLocation({
type: 'wgs84',
success: function (res) {
that.$store.commit('setLongitude', res.longitude);
that.$store.commit('setLatitude', res.latitude);
}
});
},
//
async signin() {
try {

3
CHANGELOG.md

@ -1,4 +1,4 @@
# 1.0.0 (2022-04-07)
# 1.0.0 (2022-04-08)
### 🌟 新功能
范围|描述|commitId
@ -153,6 +153,7 @@
- | 退出登录 | [6922f24](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/6922f24)
- | 未登录时查询成员列表出错,导致角色任务获取出错问题 | [04fddb7](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/04fddb7)
- | 向上查向下查 | [1933e1b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/1933e1b)
- | 项目列表不能正常滚动 | [3c26b50](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/3c26b50)
- | 项目列表排序 | [ad0ce75](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/ad0ce75)
- | 消息id | [f79918b](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/f79918b)
- | 小红点、上传项目刷新项目列表 | [02d933e](https://101.201.226.163:50022/TALL/TALL-MUI-4/commits/02d933e)

1
components/Plugin/Plugin.vue

@ -21,6 +21,7 @@
<!-- 交付物插件 -->
<p-deliver v-else-if="pluginId === '15'" />
<!-- <p-deliver-second v-else-if="pluginId === '15'" /> -->
<p-source-manage v-else-if="pluginId === '16'" class="p-2" />
<p-finance-audit v-else-if="pluginId === '17'" class="p-2" />
<p-finance v-else-if="pluginId === '18'" class="p-2" />

4
components/Render/Render.vue

@ -18,6 +18,8 @@
:prop="pluginInfo"
:change:prop="projectRender.renderDom"
:data-url="domain"
:data-longitude="longitude"
:data-latitude="latitude"
></view>
</view>
</template>
@ -42,7 +44,7 @@ export default {
},
computed: {
...mapState(['domain']),
...mapState(['allPlugin', 'businessPlugin']),
...mapState(['allPlugin', 'businessPlugin', 'longitude', 'latitude']),
...mapState('role', ['roleId']),
...mapState('user', ['token']),
...mapGetters('project', ['projectId']),

4
manifest.json

@ -1,8 +1,8 @@
{
"name" : "时物链条2",
"appid" : "__UNI__6207504",
"appid" : "__UNI__3CBCFFF",
"description" : "",
"versionName" : "1.0.11",
"versionName" : "1.0.12",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */

43
plugins/p-deliver-second/p-deliver-second.vue

@ -0,0 +1,43 @@
<template>
<view>
<!-- 上传提交 v-if="isMine && deliver" -->
<!-- TODO: 2022年春节为了演示所有人都能看到交付物插件 -->
<p-deliver-upload-second v-if="deliver" @upload-success="getDeliverData" class="p-2" @edit-success="getDeliverData"></p-deliver-upload-second>
<p-deliver-check
v-if="deliver && deliver.details && deliver.details.length"
@check-success="getDeliverData"
class="p-2"
></p-deliver-check>
</view>
</template>
<script setup>
import { useStore } from 'vuex';
import { ref, inject, provide, computed, watch } from 'vue';
const store = useStore();
const task = inject('task');
const pluginInfo = inject('pluginInfo');
const deliver = ref(null); //
const isMine = computed(() => store.getters['role/isMine']); //
// const remindData = computed(() => store.state.socket.remindData); //
deliver.value = pluginInfo && pluginInfo.data ? JSON.parse(pluginInfo.data) : null;
provide('deliver', deliver);
// id
async function getDeliverData() {
try {
const { id: taskId } = task;
if (!taskId) return;
const param = { taskId };
const data = await uni.$u.api.getDeliverByTaskId(param);
deliver.value = data;
} catch (error) {
console.log('error: ', error);
}
}
// getDeliverData();
</script>

299
plugins/p-deliver-upload-second/p-deliver-upload-second.vue

@ -0,0 +1,299 @@
<template>
<!-- 是自己的任务 且该任务有交付物 才显示提交组件 -->
<view class="bg-white px-2 rounded-md relative" @longpress.prevent="showMask = true">
<!-- 插件名称输入和提交 -->
<view class="flex item-center justify-between py-2">
<view class="flex-1">
<view v-if="deliver.deliverName" class="relative inline-block">
{{ deliver.deliverName }}
<!-- <u-badge
size="mini"
:is-dot="true"
style="transform: translate3d(2em, -1em, 0)"
v-show="!deliver.details || !deliver.details.length"
></u-badge> -->
</view>
</view>
<!-- 提交 -->
<u-button
type="primary"
size="mini"
@click="submit"
class="self-center"
:disabled="submitState"
:ripple="true"
:loading="submitBtnLoading"
>
提交
</u-button>
<!-- 查看提交历史的按钮 -->
<!-- <u-icon name="arrow-right" class="ml-3" @click="openDeliverHistory"></u-icon> -->
</view>
<!-- 插件上传方式 -->
<view>
<view class="link-box">
<u-input v-model="linkValue" type="text" :border="true" placeholder="请输入交付物地址/链接" class="input"></u-input>
</view>
<view class="mt-3">
<u-button size="mini" :plain="true" type="primary" class="mr-3" @click="paste">粘贴</u-button>
<u-button size="mini" :plain="true" type="primary" class="mr-3" @click="uploadFile">文件</u-button>
<u-button size="mini" :plain="true" type="primary" class="mr-3" @click="uploadPhoto">拍照</u-button>
</view>
</view>
<!-- 编辑和删除的遮罩层 -->
<view class="mask flex items-center justify-center bg-grey" v-show="showMask" @click="showMask = false">
<view class="bg-yellow-500 text-white w-12 h-12 text-center leading-12 rounded-w-12 mx-8" @click.stop="showEditModal = true">
修改
</view>
<view class="bg-red-500 text-white w-12 h-12 text-center leading-12 rounded-w-12 mx-8" @click.stop="showDeleteModal = true">
删除
</view>
<!-- 删除的二次提示modal -->
<u-modal v-model="showDeleteModal" :content="content" :show-cancel-button="true" @confirm="confirmDelete"></u-modal>
</view>
<!-- 编辑交付物标题的modal -->
<u-mask :show="showEditModal" @click="showEditModal = false">
<view class="modal-content-wrap" @click.stop>
<view class="modal-content-head">交付物标题名称</view>
<view class="modal-content-body">
<u-input :border="true" placeholder="请输入交付物名称" v-model="newInputRef"></u-input>
</view>
<view class="modal-content-foot">
<view class="cancel" @click="showEditModal = false">取消</view>
<view class="confirm" @click="confirmEditDeliverName">确定</view>
</view>
</view>
</u-mask>
<view class="border border-solid border-gray-300 rounded-md mt-3 px-2" @click="collapsed = !collapsed">
<view class="top flex justify-between">
<view class="mr-3 py-2 text-sm">工作量时长</view>
<!-- 时长 -->
<view class="flex item-center justify-end flex-1 text-sm">
<u-input v-model="duration" type="text" :border="none" placeholder="请输入工作量时长" class="input" style="text-align: right;"></u-input>
</view>
</view>
</view>
<view class="foot mt-2 flex flex-wrap">
<u-button :type="checkedIndex === 0 ? 'primary' : 'default'" size="mini" class="my-1 ml-0 mr-3" @click="handleSelectTime(0)">
半小时
</u-button>
<u-button :type="checkedIndex === 1 ? 'primary' : 'default'" size="mini" class="my-1 ml-0 mr-3" @click="handleSelectTime(1)">
1小时
</u-button>
<u-button :type="checkedIndex === 2 ? 'primary' : 'default'" size="mini" class="my-1 ml-0 mr-3" @click="handleSelectTime(2)">
2小时
</u-button>
</view>
<!-- 插件审核人员选择 -->
<Reviewer ref="reviewerRef" />
</view>
</template>
<script setup>
import { ref, computed, inject } from 'vue';
import { useStore } from 'vuex';
import { UPLOAD_URL } from '@/config/index';
import { UPLOAD_EXTENSION } from '@/config/deliver';
const deliver = inject('deliver');
const task = inject('task');
const store = useStore();
const emits = defineEmits(['upload-success', 'edit-success']);
const reviewerRef = ref(null);
const submitBtnLoading = ref(false);
const linkValue = ref(''); //
const showMask = ref(false); //
const showEditModal = ref(false); // modal
const newInputRef = ref(''); //
const showDeleteModal = ref(false); // modal
const content = '是否确定删除';
const showBadge = ref(false); // u-badge
const duration = ref('2小时'); //
const checkedIndex = ref(2); //
//
const submitState = computed(() => !linkValue.value);
const projectId = computed(() => store.getters['project/projectId']);
const roleId = computed(() => store.state.role.roleId);
//
function validateDeliverForm(checkedCheckers) {
const reg = /[a-zA-z]+:\/\/[^\s]*/;
if (!reg.test(linkValue.value)) {
// toast
uni.$ui.showToast('请输入正确的链接');
return false;
}
//
if (!checkedCheckers || !checkedCheckers.length) {
uni.$ui.showToast('请选择检查人');
return false;
}
return true;
}
//
async function submit() {
const { checkedCheckers } = reviewerRef.value; //
//
if (!validateDeliverForm(checkedCheckers)) return;
submitBtnLoading.value = true; // loading
//
try {
const checkerList = [];
checkedCheckers.forEach(item => {
checkerList.push(item.memberId);
});
const param = {
projectId: projectId.value,
roleId: roleId.value,
deliverId: deliver.value.deliverId,
fileList: [linkValue.value],
checkerList,
duration: duration.value,
msgId: task.msgId,
};
await uni.$u.api.submitDeliverInfo(param);
uni.$ui.showToast('提交交付物信息成功');
resetControlState(); //
emits('upload-success');
} catch (error) {
console.log('error: ', error);
uni.$ui.showToast('提交交付物信息失败');
}
}
//
function resetControlState() {
submitBtnLoading.value = false; // loading
linkValue.value = ''; //
reviewerRef.value.collapsed = true; //
}
//
function openDeliverHistory() {
const { deliverId } = deliver.value;
// console.log(deliverId)
uni.navigateTo({ url: `/pages/submitLog/submitLog?deliverId=${deliverId}` });
}
//
function paste() {
uni.getClipboardData({
success(res) {
linkValue.value = res.data;
},
});
}
//
async function uploadFile() {
// #ifdef APP-PLUS
uni.$ui.showToast('APP暂不支持上传文件');
// #endif
// #ifdef H5
try {
const data = await uni.$upload.chooseAndUpload(UPLOAD_URL, {}, UPLOAD_EXTENSION, 'files');
// console.log(data[0]);
linkValue.value = data[0].visitUrl;
} catch (error) {
console.error('error: ', error);
}
// #endif
}
//
function uploadPhoto() {
uni.$ui.hideLoading();
let timer = null;
clearTimeout(timer);
uni.chooseImage({
count: 1, // 9
sizeType: ['original', 'compressed'], //
sourceType: ['album', 'camera'], //
success: res => {
if (!timer) {
timer = setTimeout(() => {
uni.$ui.showLoading('正在上传...');
timer = null;
}, 800);
}
const { tempFilePaths } = res;
uni.uploadFile({
url: UPLOAD_URL, //
filePath: tempFilePaths[0],
name: 'files',
formData: {},
success: res => {
clearTimeout(timer);
uni.$ui.hideLoading();
const data = JSON.parse(res.data);
if (data.code === 200) {
linkValue.value = data.data[0].visitUrl;
}
},
fail: error => {
clearTimeout(timer);
uni.$ui.hideLoading();
console.error('error', error);
},
});
},
});
}
//
async function confirmEditDeliverName() {
if (!newInputRef.value) {
uni.$ui.showToast('输入不能为空');
}
try {
const param = {
projectId: projectId.value,
taskId: task.id,
deliverName: newInputRef.value,
};
await uni.$u.api.editDeliverName(param);
// uni.$ui.showToast('');
emits('edit-success');
//
showEditModal.value = false;
showMask.value = false;
showBadge.value = false;
newInputRef.value = '';
} catch (error) {
console.error('error: ', error);
uni.$ui.showToast('修改交付物名称失败');
}
}
//
async function confirmDelete() {
try {
showDeleteModal.value = true;
deliverRef.value = false;
await uni.$u.api.deleteDeliver();
uni.$ui.showToast('删除交付物成功');
} catch (error) {
console.error('error: ', error);
uni.$ui.showToast('删除交付物失败');
}
}
function handleSelectTime(data) {
checkedIndex.value = data;
duration.value = data === 0 ? '半小时' : data === 1 ? '1小时' : '2小时';
}
</script>

20
store/index.js

@ -22,6 +22,8 @@ const state = {
allPlugin: '', // 所有插件
firstOpenApp: false, // 是否是第一次打开APP或者引导页有更新,false表示从未打开过,true表示打开过
isOpenApp: true, // 是否打开APP
longitude: '', // 经度
latitude: '', // 纬度
};
const getters = {
@ -51,6 +53,24 @@ const mutations = {
state.systemInfo = data;
},
/**
* 设置当前位置经度
* @param {object} state
* @param {object | null} data 获取到的数据
*/
setLongitude(state, data) {
state.longitude = data;
},
/**
* 设置当前位置纬度
* @param {object} state
* @param {object | null} data 获取到的数据
*/
setLatitude(state, data) {
state.latitude = data;
},
/**
* 设置主题
* @param {object} state

Loading…
Cancel
Save