You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
556 lines
14 KiB
556 lines
14 KiB
2 years ago
|
import { inputSync, nextTick, doAfterLogin } from "@utils/tools";
|
||
|
import {
|
||
|
wxShowModal,
|
||
|
wxUploadFile,
|
||
|
wxRequestPost,
|
||
|
wxChooseImage,
|
||
|
} from "@utils/promise-wx-api";
|
||
|
import getLocation from "@utils/location";
|
||
|
import validate from "@utils/validate/index.js";
|
||
|
|
||
|
const app = getApp();
|
||
|
|
||
|
Page({
|
||
|
data: {
|
||
|
groupId: "",
|
||
|
topicId: "",
|
||
|
|
||
|
showedHint: false,
|
||
|
|
||
|
tabRecord: false,
|
||
|
|
||
|
textHeight: "320rpx",
|
||
|
viewHeight: "100%",
|
||
|
|
||
|
// not-started underway success failed
|
||
|
submitStatus: "not-started",
|
||
|
|
||
|
placeholderText: `1、发起您的话题,请将话题描述清晰。
|
||
|
2、在小组得到帮助、建议,能有助于更快的解决问题。
|
||
|
3、还有机会被转发到【党群议事】,让问题更快解决`,
|
||
|
|
||
|
fmData: {
|
||
|
wx_form_id: "",
|
||
|
gridId: "",
|
||
|
customerId: "",
|
||
|
groupId: "",
|
||
|
topicDraftId: "", // 草稿id
|
||
|
topicContent: "",
|
||
|
longitude: "",
|
||
|
dimension: "",
|
||
|
province: "",
|
||
|
city: "",
|
||
|
area: "",
|
||
|
address: "",
|
||
|
videoList: [],
|
||
|
voiceList: [], // 语音文件
|
||
|
docList: [], // 文档
|
||
|
imageList: [],
|
||
|
locateAddress: "",
|
||
|
locateLongitude: "",
|
||
|
locateDimension: "",
|
||
|
},
|
||
|
// 本地选择作品图片路径数组
|
||
|
imgList: [
|
||
|
// {
|
||
|
// tempFilePath: '', // 本地录制文件临时路径
|
||
|
// src: '', // 上传路径
|
||
|
// valid: true, // 是否合法
|
||
|
// }
|
||
|
],
|
||
|
// 最大上传图片数量
|
||
|
maxLimitImg: 3,
|
||
|
|
||
|
submitBtnIsAllowed: false,
|
||
|
dialogVisible: false,
|
||
|
templateList: [], //消息模板列表
|
||
|
},
|
||
|
|
||
|
// 更新data数据后需主动触发
|
||
|
$afterUpdateData() {
|
||
|
this.computeSubmitBtnIsAllowed();
|
||
|
if (this.data.fmData.voiceList.length > 0)
|
||
|
this.setData({ submitBtnIsAllowed: true });
|
||
|
},
|
||
|
|
||
|
computeSubmitBtnIsAllowed(isQuiet = true) {
|
||
|
const { fmData, submitStatus } = this.data,
|
||
|
vlt = validate(fmData, {
|
||
|
topicContent: [
|
||
|
{
|
||
|
rule: "required",
|
||
|
message: "请输入话题内容",
|
||
|
},
|
||
|
],
|
||
|
address: [
|
||
|
{
|
||
|
rule: "required",
|
||
|
message: "请输入定位地址",
|
||
|
},
|
||
|
],
|
||
|
voiceList: [],
|
||
|
});
|
||
|
if (!vlt.valid) {
|
||
|
if (!isQuiet) {
|
||
|
wx.showToast({
|
||
|
title: vlt.error,
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
}
|
||
|
this.setData({
|
||
|
submitBtnIsAllowed: false,
|
||
|
});
|
||
|
return false;
|
||
|
} else {
|
||
|
this.setData({
|
||
|
submitBtnIsAllowed: submitStatus !== "success",
|
||
|
});
|
||
|
return true;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
async onLoad(query) {
|
||
|
wx.showLoading({
|
||
|
title: "",
|
||
|
mask: true,
|
||
|
});
|
||
|
|
||
|
await doAfterLogin();
|
||
|
|
||
|
const { gid, tid } = query;
|
||
|
this.setData({ groupId: gid, topicId: tid });
|
||
|
if (tid) {
|
||
|
this.getInfo();
|
||
|
}
|
||
|
this.getTemplate();
|
||
|
this.getLocation();
|
||
|
|
||
|
wx.hideLoading();
|
||
|
},
|
||
|
|
||
|
onShow() {},
|
||
|
onReady() {
|
||
|
// this.requestMsg = this.selectComponent('#requestMsg')
|
||
|
this.computedViewHeight();
|
||
|
},
|
||
|
inputSync,
|
||
|
|
||
|
// 强行获取地址信息,或打扰用户给予授权
|
||
|
toughGetLocation() {
|
||
|
this.getLocation(false);
|
||
|
wx.chooseLocation({
|
||
|
success: (res) => {
|
||
|
console.log("resadddres", res);
|
||
|
const { fmData } = this.data;
|
||
|
this.setData({
|
||
|
fmData: {
|
||
|
...fmData,
|
||
|
address: res.address,
|
||
|
longitude: res.longitude,
|
||
|
dimension: res.latitude,
|
||
|
},
|
||
|
});
|
||
|
},
|
||
|
});
|
||
|
},
|
||
|
// 获取话题详情
|
||
|
async getInfo() {
|
||
|
const { topicId } = this.data;
|
||
|
|
||
|
const {
|
||
|
data: {
|
||
|
data: { code, data },
|
||
|
},
|
||
|
msg,
|
||
|
} = await wxRequestPost(
|
||
|
"resi/group/topicdraft/detail",
|
||
|
{
|
||
|
topicDraftId: topicId,
|
||
|
},
|
||
|
{
|
||
|
// isMock: true
|
||
|
}
|
||
|
);
|
||
|
|
||
|
if (msg === "success" && code === 0) {
|
||
|
let { fmData, imgList } = this.data;
|
||
|
for (var n in data) {
|
||
|
fmData[n] = data[n];
|
||
|
}
|
||
|
imgList = fmData.imageList.map((item) => {
|
||
|
return {
|
||
|
tempFilePath: item,
|
||
|
src: item,
|
||
|
valid: true,
|
||
|
};
|
||
|
});
|
||
|
console.log("datafffff", data);
|
||
|
this.setData({ fmData, imgList });
|
||
|
}
|
||
|
},
|
||
|
// 获取地理位置信息
|
||
|
async getLocation(isQuiet = true) {
|
||
|
const { msg, data } = await getLocation(isQuiet);
|
||
|
console.log(msg, data);
|
||
|
if (msg === "success") {
|
||
|
const { fmData } = this.data;
|
||
|
this.setData({
|
||
|
fmData: {
|
||
|
...fmData,
|
||
|
address: data.address,
|
||
|
province: data.province,
|
||
|
city: data.city,
|
||
|
area: data.district,
|
||
|
longitude: data.longitude,
|
||
|
dimension: data.latitude,
|
||
|
locateAddress: data.address,
|
||
|
locateLongitude: data.longitude,
|
||
|
locateDimension: data.latitude,
|
||
|
},
|
||
|
});
|
||
|
this.computeSubmitBtnIsAllowed();
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// 点击查看作品图集
|
||
|
previewImg(e) {
|
||
|
const {
|
||
|
target: {
|
||
|
dataset: { index },
|
||
|
},
|
||
|
} = e;
|
||
|
const { imgList } = this.data,
|
||
|
currentImg = imgList[index].tempFilePath,
|
||
|
imgArr = imgList.map((item) => item.tempFilePath);
|
||
|
wx.previewImage({
|
||
|
current: currentImg,
|
||
|
urls: imgArr,
|
||
|
});
|
||
|
},
|
||
|
|
||
|
delImg(e) {
|
||
|
const {
|
||
|
target: {
|
||
|
dataset: { index },
|
||
|
},
|
||
|
} = e;
|
||
|
let { imgList } = this.data;
|
||
|
imgList.splice(index, 1);
|
||
|
this.setData({
|
||
|
imgList,
|
||
|
});
|
||
|
// this.computeSubmitBtnIsAllowed();
|
||
|
},
|
||
|
|
||
|
async addImg() {
|
||
|
const { imgList, maxLimitImg } = this.data,
|
||
|
len = imgList.length;
|
||
|
if (len >= maxLimitImg) {
|
||
|
return wx.showToast({
|
||
|
title: `最多上传 ${maxLimitImg} 张图片。`,
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
} else {
|
||
|
const { msg, data } = await wxChooseImage({
|
||
|
count: maxLimitImg - len,
|
||
|
sizeType: ["compressed"],
|
||
|
});
|
||
|
if (msg === "success") {
|
||
|
const { tempFilePaths } = data;
|
||
|
let newImgList = tempFilePaths.map((tempFilePath) => {
|
||
|
return {
|
||
|
tempFilePath,
|
||
|
src: "",
|
||
|
valid: true,
|
||
|
};
|
||
|
});
|
||
|
this.setData({
|
||
|
imgList: imgList.concat(newImgList),
|
||
|
});
|
||
|
// this.computeSubmitBtnIsAllowed();
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
// 上传图片
|
||
|
async uploadImgs() {
|
||
|
if (this.data.imgList.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
// 必须先开了,否则可能会冲突
|
||
|
wx.showLoading({
|
||
|
title: "上传图片中",
|
||
|
mask: true,
|
||
|
});
|
||
|
|
||
|
// 上传图片,返回地址
|
||
|
const uploadedImgList = await new Promise(async (reslove) => {
|
||
|
let { imgList } = this.data,
|
||
|
residueNum = imgList.length;
|
||
|
imgList.forEach(async (img, index) => {
|
||
|
if (img.src == "") {
|
||
|
const {
|
||
|
data: { data },
|
||
|
msg,
|
||
|
} = await wxUploadFile("oss/file/uploadimg", img.tempFilePath, {
|
||
|
// isMock: true
|
||
|
});
|
||
|
if (msg === "success" && data.code === 0) {
|
||
|
img.src = data.data.url;
|
||
|
img.valid = true;
|
||
|
}
|
||
|
}
|
||
|
imgList[index] = img;
|
||
|
|
||
|
residueNum -= 1;
|
||
|
if (residueNum === 0) {
|
||
|
reslove(imgList);
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
|
||
|
wx.hideLoading();
|
||
|
|
||
|
console.log(uploadedImgList);
|
||
|
|
||
|
this.setData({ imgList: uploadedImgList });
|
||
|
|
||
|
const imgsValid = uploadedImgList.every((item) => item.valid),
|
||
|
imgsAllUploaded = uploadedImgList.every((item) => item.src != "");
|
||
|
if (!imgsValid) {
|
||
|
wx.showToast({
|
||
|
title: "图片可能包含非法内容",
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
return Promise.reject();
|
||
|
} else if (!imgsAllUploaded) {
|
||
|
wx.showToast({
|
||
|
title: "上传图片出错,请重试",
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
return Promise.reject();
|
||
|
} else {
|
||
|
return;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// 提交话题
|
||
|
async submit(e) {
|
||
|
// this.setData({ dialogVisible: true }) return
|
||
|
const { fmData, groupId, imgList } = this.data;
|
||
|
if (!this.computeSubmitBtnIsAllowed(false) && fmData.voiceList.length === 0) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
fmData.topicContent = fmData.topicContent.trim();
|
||
|
console.log("topicContent", fmData.topicContent.length);
|
||
|
if (fmData.topicContent === "" && fmData.voiceList.length === 0) {
|
||
|
console.log("fmData.voiceList.length", fmData.voiceList.length);
|
||
|
return wx.showToast({
|
||
|
title: "话题内容或话题语音不能为空",
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
const retConfirm = await wxShowModal({
|
||
|
title: "确认提交?",
|
||
|
});
|
||
|
if (retConfirm.msg !== "success" || !retConfirm.data.confirm) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
await this.uploadImgs();
|
||
|
|
||
|
// 获取 formId 用于发送模板消息
|
||
|
if (e.detail.formId) {
|
||
|
fmData.wx_form_id = e.detail.formId;
|
||
|
}
|
||
|
fmData.groupId = groupId;
|
||
|
fmData.gridId = app.globalData.gridId;
|
||
|
fmData.customerId = app.globalData.customerId;
|
||
|
fmData.imageList = imgList.map((item) => {
|
||
|
return item.src;
|
||
|
});
|
||
|
// fmData.attachmentList = imgList.map(item => {
|
||
|
// return item.src;
|
||
|
// });
|
||
|
this.setData({ fmData });
|
||
|
|
||
|
wx.showLoading({
|
||
|
title: "正在提交中",
|
||
|
mask: true,
|
||
|
});
|
||
|
// topicdraft/createtopic topic/createtopic attachmentList
|
||
|
const {
|
||
|
data: { data },
|
||
|
msg,
|
||
|
} = await wxRequestPost("resi/group/topicdraft/createtopic", fmData, {
|
||
|
// isMock: true
|
||
|
});
|
||
|
wx.hideLoading();
|
||
|
|
||
|
if (msg === "success" && data.code === 0) {
|
||
|
this.setData({
|
||
|
dialogVisible: true,
|
||
|
});
|
||
|
|
||
|
// await this.requestMsg.handleMsg()
|
||
|
}
|
||
|
},
|
||
|
// 获取订阅消息列表
|
||
|
async getTemplate() {
|
||
|
const {
|
||
|
data: {
|
||
|
data: { code, data },
|
||
|
},
|
||
|
msg,
|
||
|
} = await wxRequestPost(
|
||
|
"message/wxmpmessage/templatelistv2",
|
||
|
{
|
||
|
app: "resi",
|
||
|
customerId: app.globalData.customerId,
|
||
|
},
|
||
|
{
|
||
|
// isMock: true
|
||
|
}
|
||
|
);
|
||
|
console.log("ddddatattt", data);
|
||
|
if (msg === "success" && code === 0) {
|
||
|
this.setData({
|
||
|
templateList: data,
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
handleRequestMsg() {
|
||
|
const { templateList } = this.data;
|
||
|
let hasAgree = false;
|
||
|
wx.requestSubscribeMessage({
|
||
|
tmplIds: templateList.map((item) => item.templateId),
|
||
|
success: (res) => {
|
||
|
console.log("res", res);
|
||
|
if (res.errMsg === "requestSubscribeMessage:ok") {
|
||
|
templateList.forEach((item) => {
|
||
|
if (res[item.templateId] === "accept") hasAgree = true;
|
||
|
});
|
||
|
if (hasAgree) {
|
||
|
wx.showToast({
|
||
|
title: "订阅成功",
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
}
|
||
|
console.log("successss", res);
|
||
|
}
|
||
|
},
|
||
|
fail: (err) => {
|
||
|
console.log("err", err);
|
||
|
wx.showToast({
|
||
|
title: err.errMsg,
|
||
|
icon: "none",
|
||
|
duration: 1500,
|
||
|
});
|
||
|
},
|
||
|
complete: async () => {
|
||
|
this.setData({
|
||
|
submitStatus: "success",
|
||
|
});
|
||
|
if (this.data.topicId) {
|
||
|
wx.reLaunch({
|
||
|
url: "/subpages/mine/pages/works/topic-part/start-topic/index",
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
// this.computeSubmitBtnIsAllowed();
|
||
|
|
||
|
await nextTick(1000);
|
||
|
|
||
|
wx.navigateBack({
|
||
|
delta: 1,
|
||
|
});
|
||
|
},
|
||
|
});
|
||
|
},
|
||
|
async submitComfire() {
|
||
|
this.setData({
|
||
|
dialogVisible: false,
|
||
|
});
|
||
|
if (this.data.templateList && this.data.templateList.length > 0) {
|
||
|
await this.handleRequestMsg();
|
||
|
} else {
|
||
|
this.setData({
|
||
|
submitStatus: "success",
|
||
|
});
|
||
|
if (this.data.topicId) {
|
||
|
wx.reLaunch({
|
||
|
url: "/subpages/mine/pages/works/topic-part/start-topic/index",
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
// this.computeSubmitBtnIsAllowed();
|
||
|
|
||
|
await nextTick(1000);
|
||
|
|
||
|
wx.navigateBack({
|
||
|
delta: 1,
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
// 动态计算轮播高度
|
||
|
computedViewHeight(height = 0) {
|
||
|
let that = this;
|
||
|
let query = wx.createSelectorQuery().in(this);
|
||
|
const ress = wx.getSystemInfoSync();
|
||
|
let _height = height || 20;
|
||
|
query
|
||
|
.selectAll(".btn, .topic-record")
|
||
|
.boundingClientRect(function (res) {
|
||
|
|
||
|
console.log(ress.windowHeight, res[0].height, res[1].height);
|
||
|
let _h = 0;
|
||
|
_h = ress.windowHeight - res[0].height - _height - 50;
|
||
|
if (res[1].height) _h = ress.windowHeight - res[1].height - _height;
|
||
|
|
||
|
console.log("++++++", _h);
|
||
|
that.setData({
|
||
|
viewHeight: _h + "px",
|
||
|
});
|
||
|
})
|
||
|
.exec();
|
||
|
},
|
||
|
handleTapRecord() {
|
||
|
this.setData({
|
||
|
tabRecord: !this.data.tabRecord,
|
||
|
});
|
||
|
this.computedViewHeight();
|
||
|
},
|
||
|
handleRecordFinish(e) {
|
||
|
let {
|
||
|
fmData: { voiceList },
|
||
|
} = this.data;
|
||
|
const { url, duration } = e.detail;
|
||
|
voiceList.push({ url, duration });
|
||
|
console.log("eeeeee", e.detail);
|
||
|
this.setData({
|
||
|
"fmData.voiceList": voiceList,
|
||
|
tabRecord: false,
|
||
|
submitBtnIsAllowed: true,
|
||
|
});
|
||
|
this.computedViewHeight();
|
||
|
},
|
||
|
handleAudioDel() {
|
||
|
let {
|
||
|
fmData: { voiceList },
|
||
|
} = this.data;
|
||
|
voiceList.shift();
|
||
|
this.setData({
|
||
|
"fmData.voiceList": voiceList,
|
||
|
});
|
||
|
this.computeSubmitBtnIsAllowed();
|
||
|
console.log("dddddddddel");
|
||
|
},
|
||
|
});
|