min-project/pages/projectMy/projectMy.js
2024-12-12 12:14:09 +08:00

953 lines
26 KiB
JavaScript

// pages/projectMy/projectMy.js
var miucms = require('../../utils/miucms.js');
let app = getApp()
const util = require('../../utils/util')
const common = require('../../utils/commonMethod')
Page({
/**
* 页面的初始数据
*/
data: {
informationState: false, // 授权后可能需要弹出完成信息框 个人背景那些
islogin: false,
isloginBtnState: false,
isFirstPattern: true,
classify: "vs", // vs manage '' 代表都没有数据
move: 0,
manageHintState: false, // 底部的提示的显示状态
list: [],
listCount: 0,
page: 1,
stateObj: {
0: "待定",
1: "主申",
2: "冲刺",
3: "保底",
},
isloading: false, // 项目管理获取 item 高度是否完成
headTop: 0, // 项目管理头部的高度
dragging: null, // 是否在拖拽中
arrHeight: 0, // 项目管理的高度
quickList: [], // 快速对比 列表
quickMoreState: false, // 快速对比 的 全部显示状态
typeList: [],
typeIndex: 0,
typeid: "", // 项目管理
projectPage: 1,
projectList: [], // 项目对比
projectCount: [], // 项目对比 数量
selectList: [], // 选中列表
// allQuickHeight: 0,
vsBottom: false, // 底部显示状态
// isInitFinish: false,
},
/**
* 生命周期函数--监听页面加载
*/
rpx30: 30,
rpx219: 219,
options: {},
onLoad(options) {
this.options = options
this.deleteWidth = util.rpxTopx(180 + 30)
miucms.pageStart(app).then(() => {
// 判断是否需要显示底部提示
let manageHintState = true
if (wx.getStorageSync("PMState")) manageHintState = false
const islogin = app.globalData.user.uid > 0 ? true : false
const screen_data = app.globalData.screen_data
this.setData({
screen_data,
islogin,
manageHintState,
// isInitFinish: true,
})
this.windowHeight = screen_data.windowHeight || 812
// if (!this.indexSidebar) this.indexSidebar = this.selectComponent('#index-sidebar')
if (!islogin) this.openLoginBtnState()
this.rpx30 = util.rpxTopx(30)
this.rpx219 = util.rpxTopx(219)
this.getList().then(res => {
if (res.code != 200) return
const data = res.data
const nums = data.nums || {}
let classify = 'vs'
if (nums['contrast'] == 0 && nums['manage'] == 0) {
classify = ''
} else if (nums['contrast'] == 0 && nums['manage'] != 0) {
classify = 'manage'
this.handleUserProjectData(res)
} else {
this.getQuickList()
this.handleProjectListData(res)
}
this.setData({
classify,
})
})
}).catch(res => {})
},
// 公共的获取列表 方法
getList(obj = {}) {
return new Promise((resolve, reject) => {
wx.showLoading({
title: '加载中...',
})
util.wxpost("/api/project.user", {
limit: 2000,
page: obj.page || 1,
typeid: obj.typeid || '',
}).then(res => resolve(res)).finally(() => wx.hideLoading())
})
},
getProjectList() {
if (this.data.projectPage == 0) return
this.getList({
page: this.data.projectPage,
}).then(res => {
console.log("getUserProject");
this.handleProjectListData(res)
})
},
handleProjectListData(res) {
if (res.code != 200) return
const data = res.data
let list = data.data || []
let projectCount = 0
list.forEach(element => {
if (element.status == 1) projectCount++
})
let projectList = this.data.projectList.concat(list)
this.setData({
projectCount: projectCount + this.data.projectCount,
projectList,
projectPage: data.count > data.limit * data.page ? this.data.projectPage + 1 : 0,
})
},
// 获取快速列表
getQuickList() {
util.wxget("/api/project.contrast/getQuickList", {}).then(res => {
if (res.code != 200) return
const data = res.data
const quickList = data || []
this.setData({
quickList,
quickMoreState: quickList.length > 3 ? false : true,
vsBottom: quickList.length == 0 ? true : false,
})
// 计算 快速对比的高度的 隐藏高度
if (quickList.length > 3) this.calculateQuickHeight()
this.listeningNode()
})
},
// 获取项目管理
getUserProject() {
if (this.data.page == 0) return
this.getList({
page: this.data.page,
typeid: this.data.typeid
}).then(res => {
console.log("getUserProject");
this.handleUserProjectData(res)
})
},
handleUserProjectData(res) {
if (res.code != 200) return
const data = res.data
let list = this.data.list.concat(data.data || [])
list.forEach((element, index) => {
element['sortKey'] = index
})
this.setData({
list,
typeList: data.typeList,
page: data.count > data.limit * data.page ? this.data.page + 1 : 0,
listCount: data.count,
}, () => this.calculateManageHeight())
},
// 计算快速对比的高度 和 隐藏高度
calculateQuickHeight() {
const quickList = this.data.quickList || []
let allQuickHeight = 0
let first3_5 = 0
quickList.forEach((element, index) => {
let height = 186
if (element.data.length == 3) height = 239.25
if (index < 3) first3_5 += height
if (index == 3) first3_5 += (height / 2)
allQuickHeight += height
})
first3_5 = util.rpxTopx(first3_5)
allQuickHeight = util.rpxTopx(allQuickHeight)
this.setData({
first3_5,
allQuickHeight,
})
},
// 计算项目管理的高度
calculateManageHeight() {
const query = this.createSelectorQuery();
let arrHeight = 0
query.select(".manage-box .list").boundingClientRect(res => {
const top = res.top
this.createSelectorQuery().selectAll(".manage-box .list .item").boundingClientRect(res => {
let obj = {}
res.sort((a, b) => a.dataset.key - b.dataset.key);
let totalHeight = 0
res.forEach(element => {
const key = element.dataset.key
let height = element.height
if (height != 0) height += this.rpx30 // 删除了不需要高度
arrHeight += height
obj[key] = {
top: totalHeight,
height,
}
totalHeight += height
})
let list = this.data.list || []
list.forEach((element, index) => {
element['top'] = obj[element.sortKey].top
element['height'] = obj[element.sortKey].height
})
this.setData({
list,
isloading: true,
headTop: top,
arrHeight,
})
}).exec();
}).exec();
},
// 切换查看类型
cutClassify(e) {
const classify = e.currentTarget.dataset.type
if (classify == this.data.classify) return
this.setData({
classify,
// isInitFinish: false,
})
if (this.data.classify == 'manage') {
this.setData({
page: 1,
typeid: "",
arrHeight: 0,
list: [],
})
this.getUserProject()
}
if (this.data.classify == 'vs') {
this.setData({
quickList: [],
quickMoreState: false,
projectPage: 1,
projectList: [],
selectList: [],
// isInitFinish: true,
})
this.getProjectList()
this.getQuickList()
}
},
deleteWidth: 150, // 删除按钮的 宽度
x: 0,
shtouchmove(e) {
this.x = e.detail.x
},
handleTouchEnd(e) {
const index = e.currentTarget.dataset.index
const type = e.currentTarget.dataset.type
let move = 0
if (Math.abs(this.x) > this.deleteWidth / 2) move = -this.deleteWidth
this.setData({
[`${type}[${index}].move`]: move
})
this.x = 0
},
// 关闭 底部提示框
manageClose() {
this.setData({
manageHintState: false,
})
wx.setStorageSync('PMState', 1)
},
// 项目的里的排序 拖拽
movableChange(e) {
if (e.detail.source != 'touch') return
let list = this.data.list || []
const index = e.target.dataset.index
let item = list[index]
item.touch = true
},
pointDistance: 0, // 点距离顶部
longPress(e) {
let index = e.currentTarget.dataset.index;
let list = this.data.list || []
this.setData({
dragging: index,
})
this.pointDistance = e.detail.y - list[index].top - this.data.headTop
wx.vibrateShort({
type: "heavy",
})
this.setData({
list,
})
},
timerr: null,
touchMove(e) {
clearTimeout(this.touchEndTmer)
if (Math.random() < 0.3 || Date.now() - this.timerr < 20) return
this.timerr = Date.now()
let key = e.currentTarget.dataset.key;
let list = this.data.list || []
let currentTouch = e.changedTouches[0];
if (!currentTouch) return;
let index = 0 // 当前 item 的下标 注意 因为 拖拽的 所以和 wx:for 表面上的 index 不一致
list.forEach((element, i) => {
if (element.sortKey == key) index = i
})
if (this.data.dragging == null) return;
// 设置当前 item 的定位 item
const top = currentTouch.pageY - this.data.headTop - this.pointDistance
const bottom = top + list[index].height
list[index].top = top
// 判断 有没有到其他 item 地盘
let keyTop = key - 1
let keyBottom = key + 1
if (keyTop >= 0) {
let keyTopIndex = list.findIndex(element => element.sortKey === keyTop);
let keyItem = list[keyTopIndex]
let keyHeight = keyItem.height || 0
const middleLine = keyItem.top + keyHeight / 2 // 上一个的中间线
if (top <= middleLine) {
// 交换 sortKey
const akey = key
list[index].sortKey = keyItem.sortKey
list[keyTopIndex].sortKey = akey
list[keyTopIndex].top = this.calculateHeight(JSON.parse(JSON.stringify(list)), key)
}
}
if (keyBottom < list.length) {
let keyBottomIndex = list.findIndex(element => element.sortKey === keyBottom);
let keyItem = JSON.parse(JSON.stringify(list[keyBottomIndex]))
let keyHeight = keyItem.height
const middleLine = keyItem.top + keyHeight / 2 // 下一个的中间线
if (bottom >= middleLine) {
// 交换 sortKey
const akey = key
list[index].sortKey = keyItem.sortKey
list[keyBottomIndex].sortKey = akey
list[keyBottomIndex].top = this.calculateHeight(JSON.parse(JSON.stringify(list)), key)
}
}
this.setData({
list,
})
},
touchEndTmer: null,
touchEnd(e) {
this.setData({
dragging: null,
})
let key = e.currentTarget.dataset.key;
let list = this.data.list || []
let index = 0
list.forEach((element, i) => {
if (element.sortKey == key) index = i
})
list[index].top = this.calculateHeight(JSON.parse(JSON.stringify(list)), key)
this.setData({
list
})
this.touchEndTmer = setTimeout(() => {
let list = JSON.parse(JSON.stringify(this.data.list)) || []
// 按照 id 属性排序
const sortedArray = list.slice().sort((a, b) => a.sortKey - b.sortKey);
// 获取排序后的对象在原数组中的索引位置
const indexes = sortedArray.map(obj => list.indexOf(obj));
let accumulatedHeight = 0;
indexes.forEach((element, i) => {
list[element].top = accumulatedHeight
accumulatedHeight += list[element].height
})
this.setData({
list
})
}, 800)
let targetList = JSON.parse(JSON.stringify(list))
// 按照 sortKey 属性对数组进行排序
targetList.sort((a, b) => a.sortKey - b.sortKey);
let newId = []
// 输出排序后的对象的 id 属性
targetList.forEach(obj => {
newId.push(obj.projectid)
});
util.wxpost("/api/project.user/changeSorting", {
projectids: newId
}).then(res => common.toast(res.message))
},
calculateHeight(list, key) {
let height = 0
list.forEach(element => {
if (element.sortKey < key) height += element.height
})
return height
},
scrollTop: 0, // 滚动的距离
// indexSidebar: null,
windowHeight: 812,
onPageScroll(e) {
if (Math.random() < 0.5) return
let scrollTop = e.scrollTop
this.scrollTop = scrollTop
let isFirstPattern = true
if (scrollTop > this.rpx219) isFirstPattern = false
// if (this.data.isFirstPattern != isFirstPattern) {
// this.setData({
// isFirstPattern,
// })
// }
// let sidebarState = this.indexSidebar.data.sidebarState
// if (scrollTop > this.windowHeight * 3 && sidebarState !== 3) sidebarState = 3
// if (scrollTop < this.windowHeight * 3 && sidebarState == 3) sidebarState = 2
// // 同一搜集 修改的 sidebarState
// if (sidebarState !== this.indexSidebar.data.sidebarState) {
// this.indexSidebar.setData({
// sidebarState
// })
// }
// this.indexSidebar.openSidebarTwoHide()
},
slowScrollNow: "",
slowScrollTo(type) {
if (Date.now() - this.slowScrollNow > 350) {
wx.pageScrollTo({
scrollTop: this.scrollTop - 150,
});
this.slowScrollNow = Date.now()
}
},
openInput(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
list[index]['input'] = 1
this.setData({
list
})
},
linechange(e) {
const index = e.currentTarget.dataset.index
this.calculateManageHeight()
},
bindblur(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
list[index]['input'] = 0
this.setData({
list
})
wx.nextTick(() => {
this.calculateManageHeight()
})
const target = list[index] || {}
this.postRemarks(target.token, target.remarks)
},
// 发送 备注
postRemarks(token, remarks) {
util.wxpost("/api/project.user/remarks", {
token,
remarks,
}).then(res => {
common.toast(res.message)
})
},
// 备注输入
inputRemark(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
const value = e.detail.value
list[index]['remarks'] = value
this.setData({
list
})
},
// 展开 快速对比的 全部
openQuickMore() {
this.setData({
quickMoreState: !this.data.quickMoreState,
})
},
// 选中
cutSelect(e) {
const index = e.currentTarget.dataset.index
const pitch = e.currentTarget.dataset.pitch || false // false 表示还没有选中
let projectList = this.data.projectList || []
const projectid = projectList[index].projectid
let selectList = this.data.selectList
// 检查数组中是否存在指定的id
let indexx = selectList.findIndex(item => item == projectid);
if (indexx !== -1) {
// 如果存在,删除该元素
selectList.splice(indexx, 1);
projectList[index]['pitch'] = false
} else if (selectList.length < 3) {
// 如果不存在,将新元素推入数组
selectList.push(projectid);
projectList[index]['pitch'] = true
}
if (selectList.length >= 2) {
this.setData({
vsBottom: true,
})
}
this.setData({
projectList,
selectList,
})
},
// 跳转 项目对比
goContrast(e) {
const ids = e.currentTarget.dataset.ids
common.goPage(`/pages/projectComparison/projectComparison?ids=${ ids }`)
},
// 点击删除快速对比
quickDelete(e) {
const id = e.currentTarget.dataset.id
const index = e.currentTarget.dataset.index
const quickList = this.data.quickList
util.wxpost("/api/project.contrast/deleteQuick", {
id
}).then(res => {
quickList.splice(index, 1)
common.toast(res.message)
let allQuickHeight = this.data.allQuickHeight
this.setData({
quickList,
allQuickHeight,
})
this.calculateQuickHeight()
})
this.x = 0
},
// 跳转 对比
statePitch(e) {
const index = e.currentTarget.dataset.index
const state = e.currentTarget.dataset.state
let list = this.data.list || []
list.forEach(element => {
element['state'] = false
})
list[index]['state'] = !state
this.setData({
list,
})
},
// 点击对比
startContrast() {
let arr = this.data.selectList
if (arr.length == 0 || arr.length < 2) {
common.toast(arr.length == 0 ? '请选择项目' : '请选择2~3个项目')
return
}
common.goPage(`/pages/projectComparison/projectComparison?ids=${arr}`)
let projectList = this.data.projectList || []
projectList.forEach(element => {
element['pitch'] = false
})
this.setData({
selectList: [],
projectList,
})
},
// 点击项目管理的删除
delete(e) {
const index = e.currentTarget.dataset.index
let list = this.data.list
const target = list[index]
util.wxpost("/api/project.user/delete", {
token: target.token,
}).then(res => {
if (res.code != 200) return
common.toast(res.message)
const typeList = this.data.typeList || []
const stateObj = this.data.stateObj
const stateName = stateObj[target.typeid]
typeList.forEach(element => {
if (element.name == '全部') element.count--
if (element.name == stateName) element.count--
})
const height = target['height']
list[index]['ismanage'] = 0
list[index]['height'] = 0
// 对数组按sortKey进行排序
list.sort((a, b) => a.sortKey - b.sortKey);
// 初始化累加的高度
let accumulatedHeight = 0;
list.forEach((element, i) => {
element.top = accumulatedHeight
accumulatedHeight += element.height
})
let arrHeight = 0
list.forEach(element => {
arrHeight += element.height
})
this.setData({
list,
arrHeight,
typeList,
})
})
},
// 修改 项目 状态
changeType(e) {
const typeid = e.currentTarget.dataset.typeid
const index = e.currentTarget.dataset.index
const list = this.data.list || []
const target = JSON.parse(JSON.stringify(list[index])) || {}
util.wxpost("/api/project.user/changeType", {
token: target.token,
typeid,
}).then(res => {
if (res.code != 200) return
const typeList = this.data.typeList || []
const typeIndex = this.data.typeIndex || 0
const stateObj = this.data.stateObj
const stateNameFront = stateObj[target.typeid] // 修改前的状态
const stateNameAfter = stateObj[typeid] // 修改后的状态
typeList.forEach(element => {
if (element.name == stateNameFront) element.count--
if (element.name == stateNameAfter) element.count++
})
list[index]['typeid'] = typeid
list[index]['state'] = false
if (typeIndex != 0) {
list[index]['ismanage'] = 0
list[index]['height'] = 0
// 对数组按sortKey进行排序
list.sort((a, b) => a.sortKey - b.sortKey);
// 初始化累加的高度
let accumulatedHeight = 0;
list.forEach((element, i) => {
element.top = accumulatedHeight
accumulatedHeight += element.height
})
let arrHeight = 0
list.forEach(element => {
arrHeight += element.height
})
this.setData({
arrHeight,
})
}
this.setData({
list,
typeList,
})
})
},
// 点击头部 tab
cutTypeid(e) {
const typeid = e.currentTarget.dataset.value
const index = e.currentTarget.dataset.index
this.setData({
typeid,
typeIndex: index,
list: [],
page: 1,
}, () => this.getUserProject())
},
// 点击删除对比库
projectDelete(e) {
const index = e.currentTarget.dataset.index
const projectid = e.currentTarget.dataset.projectid
util.wxpost("/api/project.contrast/delete", {
projectid
}).then(res => {
if (res.code != 200) return
common.toast(res.message)
let projectList = this.data.projectList
projectList.splice(index, 1)
this.setData({
projectList,
projectCount: this.data.projectCount--,
})
})
},
goPage(e) {
const url = e.currentTarget.dataset.url
common.goPage(url)
},
observer: null,
listeningNode() {
this.observer = wx.createIntersectionObserver(this, {
observeAll: true,
thresholds: [0] // 设定阈值,表示元素一半进入可视区域时触发
});
this.observer.relativeToViewport().observe('.quick-border', res => {
if (res.intersectionRatio == 0) {
this.setData({
vsBottom: true,
})
}
});
},
// 打开 授权按钮
openLoginBtnState() {
this.setData({
isloginBtnState: true,
})
},
// 关闭授权登录事件
popClose() {
this.setData({
isloginBtnState: !this.data.isloginBtnState
})
},
userClickLogin(e) {
let data = e.detail.data
this.setData({
islogin: true,
isloginBtnState: false,
informationState: data.regdatastep == 'success' ? false : true,
quickList: [],
quickMoreState: false,
projectPage: 1,
projectList: [],
selectList: [],
page: 1,
typeid: "",
arrHeight: 0,
list: [],
})
this.onLoad(this.options)
},
// 子组件传值 修改 完善信息组件的状态
revampInformationState() {
this.setData({
informationState: false
})
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
if (app.globalData['isquickState']) this.getQuickList()
app.globalData['isquickState'] = false
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
wx.stopPullDownRefresh()
if (this.data.classify == 'manage') {
this.setData({
page: 1,
typeid: "",
arrHeight: 0,
})
this.getUserProject()
}
if (this.data.classify == 'vs') {
this.setData({
quickList: [],
quickMoreState: false,
projectPage: 1,
projectList: [],
selectList: [],
})
this.getProjectList()
this.getQuickList()
}
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
if (this.data.classify == 'manage') this.getUserProject()
if (this.data.classify == 'vs') this.getProjectList()
},
})