// package/report/report.js import { getPointList,getPointInfoAll,getPatrolTemplates,getPatrolTemplate,getTemplates,reportQuest,getPatrolPlan,getStructuresList,getDetail } from "../../utils/getApiUrl"; import {Request} from "../../common"; const moment = require("../../utils/moment"); Page({ data: { sms:'',//设备号 sList:[],//根据sn号查询的结构物列表 structListIndex: undefined,//结构物id struct:'',//结构物 pointList:[],//点位列表 pointIndex:undefined,//点位索引 list:[],//初始数据 pointVis:false,//点位输入框的可见性 formVis:false,//表单项可见性 handleObj:'',//处理对象 handleGoal:'',//处理目的 installLocation:'',//安装位置 rtuNo:'',//RTU编号 isPlanState: false, structList: [],//结构物列表 data:[],//巡检计划的数据(包括点位,设备等等) patrolTemplate:[],//巡检模板 templateData:[],//巡检模板总数居 patrolTemplateIndex:undefined,//巡检模板索引 itemData: '', // 点位 address: '', // 当前位置 imgUrl: getApp().globalData.imgUrl, checkItems: [], // 检查项 inspectContentArr: [], // 巡检内容 isCommitting: false, }, //卡号接收 onInputChange(e){ this.setData({ sms:e.detail, sList:[] }) }, //根据sn号搜索 searchDetail(){ const id=this.data.sms if(id){ Request.get(getDetail(id)).then(res => { if(res){ //结构物 if(!res.length){ wx.showToast({ title: '未查询到相关数据', icon: 'none', duration: 1500 }) return; } const uniqueResults = res.reduce((acc, item) => { const existingItem = acc.find(project => project.id === item.project.id); if (!existingItem) { acc.push({ id: item.project.id, name: item.project.name }); } return acc }, []) this.setData({ sList:uniqueResults, list:res }) } }) } }, //点位改变函数 pointChange(e){ const that = this // that.getPatrolTemplate() Request.get(getPatrolTemplates()).then(res=>{ if(res.rows.length){ //只需要地灾的相关模板 const rlst=res.rows?.filter(q=>q.name.includes('地灾'))?.map(item=>{return { id:item.id, name:item.name }}) that.setData({patrolTemplate:rlst,templateData:res.rows, pointIndex:e.detail.value, formVis:true, inspectContentArr:[], patrolTemplateIndex:null }) } }) }, //整理设备和检查项 getPatrolTemplate(templateId,pointDevices=[]) { const that=this Request.get(getPatrolTemplate(templateId)).then(res => { const checkItems = res.rows[0].checkItems; let inspectContentArr = []; // 有绑定设备的点位,每个设备都要检查各个检查项 if (pointDevices.length) { pointDevices.forEach(device => { inspectContentArr.push({ deviceName: device.name, deviceId: device.id, checkItems: checkItems.map(c => ({ id: `${device.id}-${c.id}`, name: c.name, isNormal: true, msgInp: null, level: null, imgs: [], })) }) }); } else { inspectContentArr.push({ checkItems: checkItems.map(c => ({ id: c.id, name: c.name, isNormal: true, msgInp: null, level: null, imgs: [], })) }) } this.setData({ checkItems, inspectContentArr: inspectContentArr, }) }) }, //收集输入框的值 input1Change(e){ const that = this that.setData({handleObj:e.detail}) }, input2Change(e){ const that = this that.setData({handleGoal:e.detail}) }, input3Change(e){ const that = this that.setData({installLocation:e.detail}) }, input4Change(e){ const that = this that.setData({rtuNo:e.detail}) }, // 预览图片 previewImg: function (e) { const { deviceidx, itemidx, index } = e.currentTarget.dataset; // 所有图片 const imgs = this.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs; const newImgs = imgs.map(i => this.data.imgUrl + i); wx.previewImage({ // 当前显示图片 current: newImgs[index], // 所有图片 urls: newImgs }) }, //结构物改变函数 structChange(event) { const that = this const projectId=that.data.sList.find(item=>item.id==that.data?.sList[Number(event.detail.value)].id)?.id const query={projectId} Request.get(getPointInfoAll(query)).then(res => { if(res){ that.setData({data:res}) } }) that.setData({ pointVis:false, pointList:[],//选择结构物后先置空先前的点位列表 formVis:false, pointIndex:null, inspectContentArr:[] }) const rlst=that.data.list?.filter(item=>item.project.id==projectId)?.map(item=>{ return { id: item.id, name: item.name } }) that.setData({ structListIndex:event.detail.value, pointList:rlst, pointVis:true }) }, //选择异常或者正常 handleChangeTwo(e) { const { deviceidx, itemidx } = e.currentTarget.dataset; let nextInspectContentArr = this.data.inspectContentArr; nextInspectContentArr[deviceidx].checkItems[itemidx].isNormal = e.detail; if (e.detail) { // 清除异常数据 nextInspectContentArr[deviceidx].checkItems[itemidx].msgInp = null; nextInspectContentArr[deviceidx].checkItems[itemidx].level = null; nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = []; } this.setData({ inspectContentArr: nextInspectContentArr }) }, //返回前一页 bindCancel() { wx.navigateBack(); }, // 开始巡检录入 addPatrolRecord: function () { const that = this; if (that.data.isCommitting) { return } let { rtuNo, installLocation, handleGoal, handleObj, patrolTemplate, patrolTemplateIndex, structListIndex, pointIndex, inspectContentArr, pointList, sList } = that.data; let alarm = false; if (!patrolTemplateIndex) { wx.showToast({ title: '请选择模板', icon: 'none', duration: 1500 }) return; } if (!pointIndex) { wx.showToast({ title: '请选择点位', icon: 'none', duration: 1500 }) return; } let reportArr = inspectContentArr.map(d => ({ ...d, alarm:d.checkItems.some(q=>q.isNormal==false)?true:false })) for (const d of reportArr[0]?.checkItems) { if (d.isNormal === null) { wx.showToast({ title: '请填写完整', icon: 'none', duration: 1500 }) return } if ((!d.isNormal) && (!d.level || !d.msgInp)) { wx.showToast({ title: '异常项必须输入巡查详情和选择严重等级', icon: 'none', duration: 2000 }) return } if (d.isNormal === false) { alarm = true; // 巡检记录异常 } } const { id, name, departmentId, deptName } = wx.getStorageSync('userInfo'); const newData = that.data.data.map((item) => { // let pointDevices=[] // item.devices.map(child=>{ // const {pointDevice,...newItem } = child; // pointDevices.push({device:newItem,deviceId:pointDevice.deviceId}) // }) // 使用对象的解构赋值去掉 project 和 devices 属性 const { project, devices, ...newItem } = item; // return {...newItem,pointDevices} return {...newItem} }); const nextItemData=newData.find(item=>item.id===pointList[pointIndex].id) let datas = { patrolPlanId: -1, pointId: sList[pointIndex].id, inspectionTime: moment().format('YYYY-MM-DD HH:mm:ss'), points: { user: { id, name, department: { id: departmentId, name: deptName } }, project: sList[structListIndex], itemData:nextItemData, inspectContent: reportArr, aboutDisaster:{ rtuNo, installLocation, handleGoal, handleObj} }, alarm, projectId: sList[structListIndex].id } wx.showLoading({ title: '提交中...' }); that.setData({ isCommitting: true }); Request.post(reportQuest(), datas).then(res => { wx.hideLoading(); that.setData({ isCommitting: false }); wx.showToast({ title: '提交成功', icon: 'success' }) setTimeout(() => { that.bindCancel(); }, 1500) }) }, //多张图片上传 uploadImg: function (data, deviceidx, itemidx) { wx.showLoading({ title: '上传中...', mask: true, }) let that = this, i = data.i ? data.i : 0, success = data.success ? data.success : 0, fail = data.fail ? data.fail : 0; let imgs = that.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs; wx.uploadFile({ url: data.url, filePath: data.path[i], name: 'file', success: (resp) => { wx.hideLoading(); success++; let str = JSON.parse(resp.data) // 返回的结果,可能不同项目结果不一样 str = str.uploaded if (imgs.length >= 20) { let nextInspectContentArr = that.data.inspectContentArr; nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = imgs; that.setData({ inspectContentArr: nextInspectContentArr }); return false; } else { imgs.push(str); let nextInspectContentArr = that.data.inspectContentArr; nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = imgs; that.setData({ inspectContentArr: nextInspectContentArr }); } }, fail: (res) => { fail++; console.log('fail:' + i + "fail:" + fail); }, complete: () => { i++; if (i == data.path.length) { // 当图片传完时,停止调用 console.log('执行完毕'); console.log('成功:' + success + " 失败:" + fail); } else { // 若图片还没有传完,则继续调用函数 data.i = i; data.success = success; data.fail = fail; that.uploadImg(data, deviceidx, itemidx); // 递归,回调自己 } } }); }, // 上传图片 chooseImg: function (e) { // 这里是选取图片的方法 const { deviceidx, itemidx } = e.currentTarget.dataset; const that = this; let pics = []; const detailPics = that.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs; if (detailPics.length >= 20) { wx.showToast({ title: '最多选择20张图片上传', icon: 'none' }); return; } wx.chooseMedia({ count: 20, // 基础库2.25.0前,最多可支持9个文件,2.25.0及以后最多可支持20个文件 mediaType: ['image'], // 文件类型 sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有 sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有 success: function (res) { const imgs = res.tempFiles; for (let i = 0; i < imgs.length; i++) { if (res.tempFiles[i].size > 15728640) { wx.showToast({ title: '图片大于15M,不可上传', icon: 'none' }); return; } const fileNameArr = res.tempFiles[i].tempFilePath.split('.'); const extension = res.tempFiles[i].tempFilePath.split('.')[fileNameArr.length - 1]; if (extension !== 'jpg' && extension !== 'png' && extension !== 'jpeg') { wx.showToast({ title: '只能上传jpg、jpeg、png格式的图片', icon: 'none' }); return; } pics.push(imgs[i].tempFilePath) } that.uploadImg({ url: getApp().globalData.webUrl + '_upload/attachments/project', // 图片上传的接口 path: pics, // 选取的图片的地址数组 }, deviceidx, itemidx); }, }) }, // 删除图片 deleteImg: function (e) { const { deviceidx, itemidx, index } = e.currentTarget.dataset; let imgs = this.data.inspectContentArr[deviceidx].checkItems[itemidx].imgs; imgs.splice(index, 1); let nextInspectContentArr = this.data.inspectContentArr; nextInspectContentArr[deviceidx].checkItems[itemidx].imgs = imgs; this.setData({ inspectContentArr: nextInspectContentArr }) }, // 巡查详情 bindInput: function (e) { const { deviceidx, itemidx } = e.currentTarget.dataset; let nextInspectContentArr = this.data.inspectContentArr; nextInspectContentArr[deviceidx].checkItems[itemidx].msgInp = e.detail.value; this.setData({ inspectContentArr: nextInspectContentArr }) }, handleChangeThree(e) { const { deviceidx, itemidx } = e.currentTarget.dataset; let nextInspectContentArr = this.data.inspectContentArr; nextInspectContentArr[deviceidx].checkItems[itemidx].level = e.detail; this.setData({ inspectContentArr: nextInspectContentArr }) }, //巡检模板改变 patrolTemplateChange(e){ const that=this that.getPatrolTemplate(that.data.patrolTemplate[e.detail.value].id) that.setData({ patrolTemplateIndex:e.detail.value }) }, bindShowMsg() { this.setData({ select: !this.data.select }) }, mySelect(e) { var name = e.currentTarget.dataset.name this.setData({ tihuoWay: name, select: false }) }, /** * 页面的初始数据 */ // data: { // }, /** * 生命周期函数--监听页面加载 */ onLoad(options) { const that=this wx.setNavigationBarTitle({ title: options.key, }) }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady() { }, /** * 生命周期函数--监听页面显示 */ onShow() { }, /** * 生命周期函数--监听页面隐藏 */ onHide() { }, /** * 生命周期函数--监听页面卸载 */ onUnload() { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh() { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom() { }, /** * 用户点击右上角分享 */ onShareAppMessage() { } })