diff --git a/yanzhu-ui-app/miniprogram/components/select-group-person/index.js b/yanzhu-ui-app/miniprogram/components/select-group-person/index.js index e600ede7..a40a2017 100644 --- a/yanzhu-ui-app/miniprogram/components/select-group-person/index.js +++ b/yanzhu-ui-app/miniprogram/components/select-group-person/index.js @@ -1,130 +1,185 @@ // newComponents/select-group-person/index.js Component({ - /** - * 组件的属性列表 - */ - properties: { - title:{ - type:String - }, - index:{ - type:String - }, - choose:{ - type:String - }, - multiple:{ - type:Boolean, - value:true - }, - rectifierData:{ - type:Array, - value:[] + /** + * 组件的属性列表 + */ + properties: { + title: { + type: String, + }, + index: { + type: String, + }, + choose: { + type: String, + }, + multiple: { + type: Boolean, + value: true, + }, + rectifierData: { + type: Array, + value: [], + observer: function (newVal, oldVal) { + // 当rectifierData变化时,重新初始化选中状态 + this.initSelectedData(newVal); + }, + }, + }, + observers: {}, + lifetimes: { + created: function () { + //在组件实例刚刚被创建时执行,注意此时不能调用 setData + }, + attached: function () { + //在组件实例进入页面节点树时执行 + }, + ready: function () { + // 在组件在视图层布局完成后执行 + // 初始化选中数据 + this.initSelectedData(this.data.rectifierData); + }, + detached: function () { + // 在组件实例被从页面节点树移除时执行 + }, + }, + + /** + * 组件的初始数据 + */ + data: { + show: false, + gridData: [], + selectedIndex: [], + }, + + /** + * 组件的方法列表 + */ + methods: { + // 初始化选中数据 + initSelectedData(rectifierData) { + if (!rectifierData || rectifierData.length === 0) return; + + let selectedIndex = []; + let chooses = ""; + + // 遍历数据,查找已选中的用户 + rectifierData.forEach((group, groupIndex) => { + if (group.userList && group.userList.length > 0) { + group.userList.forEach((user, userIndex) => { + if (user.state === true) { + // 记录选中项的索引 + selectedIndex.push(groupIndex + "_" + userIndex); + + // 构建显示文本 + let post = user.userPostName + ? " [" + user.userPostName + "]" + : ""; + chooses += "," + user.userName + post; + } + }); } - }, - observers: { + }); - }, - lifetimes: { - created: function(){ - //在组件实例刚刚被创建时执行,注意此时不能调用 setData - }, - attached: function () { - //在组件实例进入页面节点树时执行 - }, - ready: function () { - // 在组件在视图层布局完成后执行 - }, - detached: function () { - // 在组件实例被从页面节点树移除时执行 - }, + // 更新数据 + this.setData({ + selectedIndex: selectedIndex, + choose: chooses ? chooses.substring(1) : "", + }); }, - /** - * 组件的初始数据 - */ - data: { - show:false, - gridData:[], - selectedIndex:[] + onAddResponsible() { + this.setData({ + show: true, + }); }, + onClose() { + this.setData({ + show: false, + }); + }, + onSelected(e) { + // 使用深拷贝避免直接修改原始数据 + const data = JSON.parse(JSON.stringify(this.data.rectifierData)); + let ei = e.currentTarget.dataset.index; + let index = ei.split("_"); + let userdata = data[index[0]].userList[index[1]]; + let selectedIndex = [...this.data.selectedIndex]; + let of = selectedIndex.indexOf(ei); - /** - * 组件的方法列表 - */ - methods: { - onAddResponsible(){ - this.setData({ - show:true - }) - }, - onClose(){ - this.setData({ - show:false - }) - }, - onSelected(e){ - var data = this.data.rectifierData; - let ei = e.currentTarget.dataset.index; - let index = ei.split('_'); - let userdata = data[index[0]].userList[index[1]]; - let of = this.data.selectedIndex.indexOf(ei); - if(of>-1){ - this.data.selectedIndex.splice(of, 1); - userdata.state = false; - }else{ - this.data.selectedIndex.push(ei); - userdata.state = true; - } - if(!this.data.multiple && this.data.selectedIndex.length>0){ - if(this.data.selectedIndex.length>1){ - this.data.selectedIndex.forEach((item) =>{ - let _indexs = item.split('_'); - data[_indexs[0]].userList[_indexs[1]].state = false; - }); - userdata.state = true; - this.data.selectedIndex=[]; - this.data.selectedIndex.push(ei); - } - let _post=""; - if(userdata.userPostName){ - _post = " ["+userdata.userPostName+"]"; - } - let _gridData=[{'userId':userdata.userId,'userName':userdata.userName+_post,'userPhone':userdata.userPhone}]; - this.triggerEvent('selected',_gridData) - this.setData({ - choose:_gridData[0].userName, - rectifierData:data, - show:false - }) - }else{ - this.setData({ - rectifierData : data - }) - } - }, - onConfirm(){ - var data = this.data.rectifierData; - let _gridData=[]; - let chooses=""; - if(this.data.selectedIndex.length>0){ - this.data.selectedIndex.forEach((item) =>{ - let _indexs = item.split('_'); - let _post=""; - if(data[_indexs[0]].userList[_indexs[1]].userPostName){ - _post = " ["+data[_indexs[0]].userList[_indexs[1]].userPostName+"]"; - } - let name = data[_indexs[0]].userList[_indexs[1]].userName+_post; - _gridData.push({'userId':data[_indexs[0]].userList[_indexs[1]].userId,'userName':name,'userPhone':data[_indexs[0]].userList[_indexs[1]].userPhone}); - chooses+=","+name; - }); - } - this.triggerEvent('selected',_gridData) - this.setData({ - choose:chooses.substring(1), - show:false - }) + if (of > -1) { + // 取消选中 + selectedIndex.splice(of, 1); + userdata.state = false; + } else { + // 选中 + if (!this.data.multiple) { + // 单选模式,清空之前选中的项 + selectedIndex.forEach((item) => { + let _indexs = item.split("_"); + data[_indexs[0]].userList[_indexs[1]].state = false; + }); + selectedIndex = [ei]; + } else { + // 多选模式 + selectedIndex.push(ei); } + userdata.state = true; + } - } -}) + // 如果是单选模式且有选中项,直接触发事件并关闭弹窗 + if (!this.data.multiple && selectedIndex.length > 0) { + let _post = userdata.userPostName + ? " [" + userdata.userPostName + "]" + : ""; + let _gridData = [ + { + userId: userdata.userId, + userName: userdata.userName + _post, + userPhone: userdata.userPhone, + }, + ]; + this.triggerEvent("selected", _gridData); + this.setData({ + choose: _gridData[0].userName, + rectifierData: data, + selectedIndex: selectedIndex, + show: false, + }); + } else { + this.setData({ + rectifierData: data, + selectedIndex: selectedIndex, + }); + } + }, + onConfirm() { + const data = this.data.rectifierData; + let _gridData = []; + let chooses = ""; + if (this.data.selectedIndex.length > 0) { + this.data.selectedIndex.forEach((item) => { + let _indexs = item.split("_"); + let _post = ""; + if (data[_indexs[0]].userList[_indexs[1]].userPostName) { + _post = + " [" + data[_indexs[0]].userList[_indexs[1]].userPostName + "]"; + } + let name = data[_indexs[0]].userList[_indexs[1]].userName + _post; + _gridData.push({ + userId: data[_indexs[0]].userList[_indexs[1]].userId, + userName: name, + userPhone: data[_indexs[0]].userList[_indexs[1]].userPhone, + }); + chooses += "," + name; + }); + } + this.triggerEvent("selected", _gridData); + this.setData({ + choose: chooses.substring(1), + show: false, + }); + }, + }, +}); diff --git a/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance_config/add/index.js b/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance_config/add/index.js index 479f9e54..4f82dd82 100644 --- a/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance_config/add/index.js +++ b/yanzhu-ui-app/miniprogram/pageage/mobile_attendance/attendance_config/add/index.js @@ -95,7 +95,7 @@ Page({ form.address = cfgData.address; form.range = cfgData.range; let groupList = (cfgData.groupList || []).map((it) => { - it.status = true; + it.state = true; it.userId = it.id; it.userName = it.groupName; it.subDeptName = it.deptName; @@ -129,6 +129,10 @@ Page({ }).then((res) => { if (res.code == 200) { let tmps = res.rows || []; + let findIds = []; + if (this.data.cfgData) { + findIds = this.data.form.subGroup.map((it) => it.id); + } this.setData({ groupList: tmps, }); @@ -153,7 +157,7 @@ Page({ subDeptType: val.subDeptType, subDeptTypeName: deptType?.dictLabel || "", userList: obj[key].map((it) => { - it.status = false; + it.state = findIds.includes(it.id); it.userId = it.id; it.userName = it.groupName; return it;