运维小程序
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

index.js 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. // pages/workorder/index.js
  2. const api = require('../../api/index.js');
  3. Page({
  4. /**
  5. * 页面的初始数据
  6. */
  7. data: {
  8. array:['日常','故障','其他'],
  9. namelist:[],
  10. typelist:['日常','故障','其他'],
  11. devicedata:[],
  12. index:1,
  13. nameindex:'',
  14. typeindex:0,
  15. deviceindex:'',
  16. date:'',
  17. partnerAvite:[],
  18. priority:'1',
  19. workorderContent:'',
  20. switchtype:true,
  21. datestart:'',
  22. dateend:'',
  23. powerindex:'',
  24. powerdata:[],
  25. workorderName:'',
  26. workorderAddress:'',
  27. visible:false,
  28. checkedItems:[],
  29. checkedPartnerIds:'',
  30. equipment:false,
  31. equipmentItems:[],
  32. equipmentPartnerIds:''
  33. },
  34. /**
  35. * 生命周期函数--监听页面加载
  36. */
  37. onLoad(options) {
  38. console.log(options.name);
  39. this.setData({
  40. index:options.name
  41. })
  42. this.getpowerdata()
  43. },
  44. onworkorder(){
  45. if (this.data.workorderName==''||this.data.dateend==''||this.data.datestart==''||this.data.checkedPartnerIds==''||this.data.equipmentPartnerIds==''||this.data.powerindex=='') {
  46. wx.showToast({
  47. title: '请填写完整工单',
  48. icon: 'none'
  49. });
  50. return
  51. }
  52. if (!this.data.switchtype) {
  53. return
  54. }
  55. this.setData({
  56. switchtype:false
  57. })
  58. let data = {
  59. workorderName:this.data.workorderName,
  60. workorderAddress:this.data.workorderAddress,
  61. workorderImg:this.data.partnerAvite.length>0?this.data.partnerAvite.toString():'',
  62. workorderContent:this.data.workorderContent,
  63. workoderPartner:this.data.checkedPartnerIds,
  64. workorderEndtime:this.data.dateend, // 开始时间
  65. workorderStarttime:this.data.datestart, // 结束时间
  66. workorderGrade:this.data.priority,
  67. powerstationId:this.data.powerdata[this.data.powerindex].powerstationId,
  68. type:(this.data.index*1)+1,
  69. deviceId:this.data.equipmentPartnerIds
  70. }
  71. api.request(`/workoder/createworkorder`, 'POST',data)
  72. .then((res) => {
  73. console.log(res);
  74. if (res.code==200) {
  75. // this.requestSubscribeMessage();
  76. // this.loadMessages();
  77. this.setData({
  78. switchtype:true
  79. })
  80. wx.switchTab({
  81. url: '/pages/index/index',
  82. })
  83. }else{
  84. wx.showToast({
  85. title: '提交失败',
  86. icon: 'none'
  87. });
  88. }
  89. })
  90. .catch((err) => {
  91. console.error('请求失败:', err);
  92. // 在这里处理请求失败的情况
  93. this.setData({
  94. switchtype:true
  95. })
  96. });
  97. },
  98. bindpowerChange(e){
  99. console.log('picker发送选择改变,携带值为', e.detail.value)
  100. this.setData({
  101. powerindex: e.detail.value
  102. })
  103. this.getselectdevicelist()
  104. this.getselectinformationall()
  105. },
  106. // 电站
  107. getpowerdata(){
  108. api.request(`/syspowerstation/selectpowestation`, 'POST')
  109. .then((res) => {
  110. console.log(res);
  111. this.setData({
  112. powerdata:res.data
  113. })
  114. })
  115. .catch((err) => {
  116. console.error('请求失败:', err);
  117. // 在这里处理请求失败的情况
  118. });
  119. },
  120. // 用户信息
  121. getselectinformationall(){
  122. this.setData({
  123. namelist:[]
  124. })
  125. let data = {
  126. powerstationId:this.data.powerdata[this.data.powerindex].powerstationId
  127. }
  128. api.request(`/partner/selectinformationall`, 'POST',data)
  129. .then((res) => {
  130. console.log(res);
  131. const newNamelist = res.data.map(item => ({
  132. ...item, // 保留原有字段(如partnerName)
  133. isChecked: false // 新增选中状态字段,默认未选中
  134. }));
  135. this.setData({
  136. namelist:newNamelist
  137. })
  138. })
  139. .catch((err) => {
  140. console.error('请求失败:', err);
  141. // 在这里处理请求失败的情况
  142. });
  143. },
  144. onVisibleChange(e){
  145. console.log(e);
  146. this.setData({
  147. visible:false,
  148. equipment:false
  149. })
  150. },
  151. // 设备列表
  152. getselectdevicelist(){
  153. this.setData({
  154. devicedata:[]
  155. })
  156. let data = {
  157. powerstationId:this.data.powerdata[this.data.powerindex].powerstationId
  158. }
  159. api.request(`/device/selectdevicelist`, 'POST',data)
  160. .then((res) => {
  161. console.log(res);
  162. const newNamelist = res.data.map(item => ({
  163. ...item, // 保留原有字段(如partnerName)
  164. isChecked: false // 新增选中状态字段,默认未选中
  165. }));
  166. this.setData({
  167. devicedata:newNamelist
  168. })
  169. })
  170. .catch((err) => {
  171. console.error('请求失败:', err);
  172. // 在这里处理请求失败的情况
  173. });
  174. },
  175. onPeakprice(e){
  176. console.log(e.detail.value);
  177. this.setData({
  178. workorderName:e.detail.value
  179. })
  180. },
  181. onaddress(e){
  182. console.log(e.detail.value);
  183. this.setData({
  184. workorderAddress:e.detail.value
  185. })
  186. },
  187. ontextarea(e){
  188. console.log(e);
  189. this.setData({
  190. workorderContent:e.detail.value
  191. })
  192. },
  193. // 当namelist为空时,点击触发提示
  194. showEmptyTip() {
  195. wx.showToast({
  196. title: '请先选择电站',
  197. icon: 'none', // 不显示图标,只显示文字
  198. duration: 2000 // 提示2秒
  199. });
  200. },
  201. /**
  202. * 切换选项的选中状态
  203. */
  204. toggleCheck(e) {
  205. const index = e.currentTarget.dataset.index;
  206. // 复制原列表并切换当前选项的选中状态
  207. const newNamelist = [...this.data.namelist];
  208. newNamelist[index].isChecked = !newNamelist[index].isChecked;
  209. // 1. 筛选所有选中的选项
  210. const checkedItems = newNamelist.filter(item => item.isChecked);
  211. // 2. 提取选中项的partnerId,并用逗号拼接(若没有选中项,返回空字符串)
  212. const checkedPartnerIds = checkedItems.map(item => item.partnerId).join(',');
  213. // 更新data:同时保存列表、选中项、拼接后的ID字符串
  214. this.setData({
  215. namelist: newNamelist,
  216. checkedItems: checkedItems, // 保存完整选中项(可选)
  217. checkedPartnerIds: checkedPartnerIds // 保存逗号拼接的ID字符串(方便后续使用)
  218. });
  219. // 打印结果示例:若选中ID为1、3的项,会输出 "当前选中的partnerId:1,3"
  220. console.log("当前选中的partnerId:", this.data.checkedPartnerIds);
  221. },
  222. /**
  223. * 切换选项的选中状态
  224. */
  225. togequipment(e) {
  226. const index = e.currentTarget.dataset.index;
  227. // 复制原列表并切换当前选项的选中状态
  228. const newNamelist = [...this.data.devicedata];
  229. newNamelist[index].isChecked = !newNamelist[index].isChecked;
  230. // 1. 筛选所有选中的选项
  231. const checkedItems = newNamelist.filter(item => item.isChecked);
  232. // 2. 提取选中项的partnerId,并用逗号拼接(若没有选中项,返回空字符串)
  233. const checkedPartnerIds = checkedItems.map(item => item.deviceId).join(',');
  234. // 更新data:同时保存列表、选中项、拼接后的ID字符串
  235. this.setData({
  236. devicedata: newNamelist,
  237. equipmentItems: checkedItems, // 保存完整选中项(可选)
  238. equipmentPartnerIds: checkedPartnerIds // 保存逗号拼接的ID字符串(方便后续使用)
  239. });
  240. if (this.data.index==1) {
  241. this.setData({
  242. workorderAddress:this.data.equipmentItems.map(item => item.devicesName)
  243. })
  244. }
  245. // 打印结果示例:若选中ID为1、3的项,会输出 "当前选中的partnerId:1,3"
  246. console.log("当前选中的partnerId:", this.data.equipmentPartnerIds);
  247. },
  248. // 用户弹窗
  249. bindPickerChange(e){
  250. console.log('picker发送选择改变,携带值为', e.detail.value)
  251. this.setData({
  252. visible:true
  253. })
  254. // nameindex: e.detail.value
  255. },
  256. Indeedbutton1(){
  257. this.setData({
  258. visible:false
  259. })
  260. },
  261. Indeedbutton2(){
  262. this.setData({
  263. equipment:false
  264. })
  265. },
  266. binddeviceChange(){
  267. // console.log('picker发送选择改变,携带值为', e.detail.value)
  268. this.setData({
  269. equipment:true
  270. // deviceindex: e.detail.value
  271. })
  272. },
  273. bindeventChange(e){
  274. this.setData({
  275. index: e.detail.value
  276. })
  277. },
  278. // 开始时间
  279. bindstartChange: function(e) {
  280. console.log('picker发送选择改变,携带值为', e.detail.value)
  281. this.setData({
  282. datestart: e.detail.value
  283. })
  284. },
  285. // 结束时间
  286. bindendChange: function(e) {
  287. const selectedEnd = e.detail.value;
  288. console.log('picker发送选择改变,携带值为', e.detail.value)
  289. const { datestart } = this.data;
  290. // 检查结束时间是否早于开始时间
  291. if (datestart && selectedEnd < datestart) {
  292. wx.showToast({
  293. title: '结束时间不能早于开始时间',
  294. icon: 'none',
  295. duration: 2000
  296. });
  297. return; // 不更新结束时间
  298. }
  299. // 验证通过,更新结束时间
  300. this.setData({
  301. dateend: selectedEnd
  302. });
  303. },
  304. // 工单优先级
  305. onradio(e){
  306. console.log(e.detail.value);
  307. this.setData({
  308. priority:e.detail.value
  309. })
  310. },
  311. // 预览图片
  312. previewImage(e) {
  313. const src = e.currentTarget.dataset.src;
  314. wx.previewImage({
  315. current: src, // 当前显示图片的http链接
  316. urls: [src] // 需要预览的图片http链接列表
  317. });
  318. },
  319. bindCancel(e){
  320. console.log(e.currentTarget.dataset.index);
  321. let index = e.currentTarget.dataset.index
  322. // 使用 filter 方法创建新数组(推荐)
  323. const newPartnerAvite = this.data.partnerAvite.filter((item, i) => i !== index);
  324. this.setData({
  325. partnerAvite: newPartnerAvite
  326. });
  327. },
  328. // 上传头像--项目--文件1
  329. bindtoImage(){
  330. let _this = this
  331. // 先检查隐私授权状态
  332. wx.getPrivacySetting({
  333. success: (res) => {
  334. if (res.needAuthorization) {
  335. // 弹出隐私协议弹窗
  336. wx.requirePrivacyAuthorize({
  337. success: () => {
  338. console.log('用户已同意隐私协议');
  339. _this.choosetoImage(); // 继续执行上传
  340. },
  341. fail: () => {
  342. console.log('用户拒绝了隐私协议');
  343. wx.showToast({
  344. title: '需同意隐私协议才能使用',
  345. icon: 'none'
  346. });
  347. }
  348. });
  349. } else {
  350. _this.choosetoImage(); // 已授权,直接上传
  351. }
  352. }
  353. });
  354. },
  355. // 上传头像图片
  356. choosetoImage() {
  357. let _this = this
  358. wx.chooseMedia({
  359. count: 1,
  360. mediaType: ['image','video'],
  361. sourceType: ['album', 'camera'],
  362. success(res) {
  363. console.log(res);
  364. const tempFiles = res.tempFiles;
  365. _this.setData({
  366. imageList: tempFiles.map(file => file.tempFilePath),
  367. });
  368. _this.uploadtoImages(tempFiles);
  369. },
  370. fail(err) {
  371. console.error("选择失败:", err);
  372. }
  373. })
  374. },
  375. // 上传到服务器
  376. uploadtoImages(files) {
  377. let _this =this
  378. const token = wx.getStorageSync('token');
  379. files.forEach((file) => {
  380. wx.uploadFile({
  381. url: 'https://esos-iot.com:8443/config/upload/webPost',
  382. filePath: file.tempFilePath,
  383. name: 'file',
  384. formData: {
  385. file:file.tempFilePath
  386. },
  387. header: {
  388. 'Authorization': 'Bearer ' + token // Also add to header if needed
  389. },
  390. success: (res) => {
  391. console.log(res);
  392. const obj = JSON.parse(res.data);
  393. this.data.partnerAvite.push(obj.data.partnerAvite)
  394. this.setData({
  395. partnerAvite:this.data.partnerAvite
  396. })
  397. },
  398. fail: (err) => {
  399. console.error('上传失败', err);
  400. },
  401. });
  402. });
  403. },
  404. /**
  405. * 生命周期函数--监听页面初次渲染完成
  406. */
  407. onReady() {
  408. },
  409. /**
  410. * 生命周期函数--监听页面显示
  411. */
  412. onShow() {
  413. },
  414. /**
  415. * 生命周期函数--监听页面隐藏
  416. */
  417. onHide() {
  418. },
  419. /**
  420. * 生命周期函数--监听页面卸载
  421. */
  422. onUnload() {
  423. },
  424. /**
  425. * 页面相关事件处理函数--监听用户下拉动作
  426. */
  427. onPullDownRefresh() {
  428. },
  429. /**
  430. * 页面上拉触底事件的处理函数
  431. */
  432. onReachBottom() {
  433. },
  434. /**
  435. * 用户点击右上角分享
  436. */
  437. onShareAppMessage() {
  438. }
  439. })