apply.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. var app = getApp()
  2. var that;
  3. var animation;
  4. var setTime;
  5. Page({
  6. data: {
  7. members: '',//用户id
  8. userName: '',//用户名称
  9. items: [{//录入选项列表
  10. employee_id: '',
  11. employeeName: '',
  12. checked: true,//判断是否开启指定规则
  13. rule_id: '',//积分分类id
  14. item_id: '',//积分细则id 不选可以为0
  15. remark: '',//备注
  16. point: 0,
  17. event_time: app.globalData.day,//事件时间
  18. reviewer_id: '',//审核人ID
  19. revieweName: '',//审批人姓名(非传)
  20. files: '',//附件数组列表
  21. }],
  22. animationInfo: '',
  23. isShowType: '0',//是显示选择规则还是显示选择分类
  24. activeIndex: '',
  25. isArr: ['奖', '扣'],
  26. reviewerObj: [],//选中的审批人
  27. employeeObj: [],//选中的奖扣对象
  28. disabled: false,
  29. superior_list: [],//录入人的上级
  30. getReviewerObj: {},//默认当前的缓存对象
  31. defaultRuleId: '',
  32. qrcodeId: '',//扫码进入
  33. popupCx: '',
  34. boxTop: 0,
  35. ruleOnoff: false,
  36. // 长连接结果
  37. results: [], //提交的返回结果集合
  38. isResult: false,
  39. percentage: 0,
  40. resultList: [],//要发送数据的集合
  41. resultIndex: 0,
  42. isShowError: false,
  43. errorList: [],
  44. isErrorShow: false,
  45. reviewerInfo:{},
  46. },
  47. onLoad(e) {
  48. that = this;
  49. dd.setNavigationBar({ title: "申请积分" });
  50. if (e.id) {
  51. this.setData({ //获取扫码进入参数
  52. qrcodeId: e.id
  53. })
  54. } else {
  55. this.revieList(app.globalData.userData.id, function (res) {
  56. that.setData({
  57. getReviewerObj: res,
  58. reviewerInfo:JSON.parse(JSON.stringify(res)),
  59. items: [{//录入选项列表
  60. checked: true,//判断是否开启指定规则
  61. employee_id: app.globalData.isCreator ? '' : app.globalData.userData.id,
  62. employeeName: app.globalData.isCreator ? '' : app.globalData.userData.name,
  63. rule_id: '',//积分分类id
  64. item_id: '',//积分细则id 不选可以为0
  65. remark: '',//备注
  66. point: 0,
  67. event_time: app.globalData.day,//事件时间
  68. reviewer_id: res.id,
  69. revieweName: res.name,
  70. files: '',//附件数组列表
  71. }],
  72. })
  73. })
  74. }
  75. },
  76. onShow() {
  77. dd.hideLoading();
  78. animation = dd.createAnimation({
  79. duration: 200,
  80. timeFunction: "linear",
  81. });
  82. if (app.globalData.userData) {
  83. that.showQrcode();
  84. that.cheakAx()
  85. } else {
  86. app.login(app.globalData.corpId, function (is) {
  87. if (is) {
  88. that.showQrcode();
  89. that.cheakAx()
  90. } else {
  91. dd.reLaunch({
  92. url: '../../noJurisdiction/noJurisdiction'
  93. })
  94. }
  95. }, function () { })
  96. }
  97. },
  98. // 页面被关闭
  99. onUnload() {
  100. app.globalData.socketApi.closewebsocket();
  101. },
  102. onPageScroll(e) {
  103. if (e.scrollTop != 0) {
  104. this.setData({
  105. boxTop: e.scrollTop
  106. })
  107. }
  108. },
  109. // 清空内容
  110. deleteRemark(e) {
  111. var index2 = e.target.dataset.index;
  112. var remark = `items[${index2}].remark`;//
  113. that.setData({
  114. [remark]: ''
  115. });
  116. },
  117. //获取系统配置
  118. cheakAx() {
  119. app.$get("/api/integral/site/config").then((res) => {
  120. let data = res.data.data;
  121. if (data.specified_rule_item) {
  122. this.setData({
  123. ruleOnoff: data.specified_rule_item == 1 ? true : false
  124. })
  125. } else {
  126. this.setData({
  127. ruleOnoff: false
  128. })
  129. }
  130. })
  131. },
  132. //获取缓存的审批人
  133. getReviewerObj(id, fuc) {
  134. dd.getStorage({
  135. key: String(id),
  136. success: function (res) {
  137. if (res.data) {
  138. fuc(res.data);
  139. } else {
  140. fuc({});
  141. }
  142. }
  143. });
  144. },
  145. revieList(id, fuc) {
  146. app.$get('/api/employee/info', { id: id }).then(res => {
  147. var item = res.data.data || {}
  148. if (item.employee_detail.superior_list && item.employee_detail.superior_id != 0) {
  149. let obj = item.employee_detail.superior_list.filter(x => x.id == item.employee_detail.superior_id)[0]||{};
  150. if(obj&&obj.id == app.globalData.userData.id){
  151. this.getReviewerObj(id, fuc)
  152. } else {
  153. fuc(obj)
  154. }
  155. } else {
  156. this.getReviewerObj(id, fuc)
  157. }
  158. })
  159. },
  160. //显示二维码规则ID内容
  161. showQrcode() {
  162. if (this.data.qrcodeId) {
  163. if (app.globalData.isCreator) {
  164. app.globalData.showToast("你当前身份为系统管理员,不需要申请积分功能");
  165. setTimeout(() => {
  166. dd.switchTab({
  167. url: '../index/index'
  168. })
  169. this.setData({ disabled: false });
  170. }, 1000);
  171. return;
  172. }
  173. app.$get("api/integral/rule/items/info", { item_id: this.data.qrcodeId }).then((res) => {
  174. var item = res.data.data || {}
  175. item.pt_Obj = app.getTypesItem(item.pt_id);
  176. var selectRule = `items[0].selectRule`
  177. var remark = `items[0].remark`
  178. var employee_id = `items[0].employee_id`
  179. var employeeName = `items[0].employeeName`
  180. that.setData({
  181. [employee_id]: app.globalData.userData.id,
  182. [employeeName]: app.globalData.userData.name,
  183. [selectRule]: item,
  184. [remark]: item.remark,
  185. })
  186. });
  187. }
  188. },
  189. //显示图片
  190. showImg(e) {
  191. var index = e.target.dataset.index;
  192. var item = e.target.dataset.item
  193. dd.previewImage({
  194. current: index,
  195. urls: item
  196. });
  197. },
  198. //关闭规则
  199. onClose() {
  200. animation.translateY(1200).step();
  201. that.setData({
  202. animationInfo: animation.export(),
  203. isShowType: '',
  204. popupCx: ''
  205. });
  206. setTimeout(() => {
  207. dd.pageScrollTo({
  208. scrollTop: that.data.boxTop
  209. })
  210. }, 100)
  211. },
  212. showToast(text) {
  213. app.globalData.showToast(text);
  214. },
  215. //选择
  216. openSelect(e) {
  217. var index = e.target.dataset.index;
  218. var item = e.target.dataset.item;
  219. var num = e.target.dataset.num;
  220. that.setData({ activeIndex: '', isShowType: '0' });
  221. if (num == 2) {
  222. if (!item.employee_id) {
  223. this.showToast('请先选择奖扣对象')
  224. return;
  225. }
  226. // 获取奖扣对象的上级
  227. this.getEmployeeList([item.employee_id], function (res) {//获取共同上级
  228. var reviewer_id = `items[${index}].reviewer_id`
  229. var revieweName = `items[${index}].revieweName`
  230. let is = false;//是否还在
  231. res.forEach(items => {
  232. if (items.id == item.id) {//判断缓存起来的审批人是否还在审批人列表中
  233. is = true;
  234. }
  235. })
  236. if (is) {
  237. that.setData({
  238. superior_list: res,
  239. isShowType: num,
  240. activeIndex: index,
  241. reviewerObj: [item]
  242. })
  243. } else {
  244. that.setData({
  245. superior_list: res,
  246. isShowType: num,
  247. activeIndex: index,
  248. reviewerObj: [],
  249. [reviewer_id]: '',
  250. [revieweName]: ''
  251. })
  252. }
  253. animation.translateY(0).step();
  254. that.setData({
  255. popupCx: 'container__mask',
  256. animationInfo: animation.export()
  257. });
  258. });
  259. } else {
  260. if (e.target.dataset.ruleId) {
  261. that.setData({ defaultRuleId: e.target.dataset.ruleId });
  262. }
  263. animation.translateY(0).step();
  264. that.setData({
  265. employeeObj: num == 3 ? [e.target.dataset.item] : [],
  266. isShowType: num,
  267. activeIndex: index,
  268. popupCx: 'container__mask',
  269. animationInfo: animation.export()
  270. });
  271. }
  272. },
  273. //删除图片
  274. deteleImg(e) {
  275. var { itemIndx, index } = e.target.dataset;
  276. var files = that.data.items[itemIndx].files;//获取itemS集合中对应的files
  277. var files_box = `items[${itemIndx}].files`;//
  278. app.globalData.arrRemoveObj(files, files[index]);
  279. that.setData({
  280. [files_box]: files
  281. });
  282. },
  283. //图片选择
  284. openImg(e) {
  285. var index = e.target.dataset.index;
  286. var files = that.data.items[index].files;
  287. if (files.length >= 3) {
  288. app.globalData.showToast("最多能选择三张");
  289. return false;
  290. }
  291. dd.chooseImage({
  292. count: 1,
  293. success: (res) => {
  294. that.postImg(res, index);
  295. },
  296. });
  297. },
  298. postImg(data, index) {
  299. var files_box = `items[${index}].files`;
  300. var files = that.data.items[index].files;
  301. dd.httpRequest({
  302. url: app.globalData.imgHttpUrl,
  303. method: 'POST',
  304. data: {
  305. md5: that.random_string(32),
  306. 'name': app.globalData.day
  307. },
  308. success: function (res) {
  309. if (app.globalData.userData.site_id) {
  310. var key = 'intesys/dd/' + app.globalData.userData.site_id + "/" + app.globalData.day + '/' + that.random_string(32) + '.png';
  311. } else {
  312. var key = 'intesys/dd/' + app.globalData.day + '/' + that.random_string(32) + '.png';
  313. }
  314. var obj = res.data.data;
  315. dd.uploadFile({
  316. url: app.globalData.ALIOSS_URL,
  317. fileType: 'image',
  318. fileName: 'file',
  319. filePath: data.filePaths[0],
  320. formData: {
  321. key: key,
  322. policy: obj.policy,
  323. OSSAccessKeyId: obj.accessid,
  324. success_action_status: 200,
  325. signature: obj.signature
  326. },
  327. success: (res) => {
  328. if (res.statusCode == 200) {
  329. if (files.length > 0) {
  330. files.push('http://cdn.intesys.g107.com/' + key)
  331. } else {
  332. files = ['http://cdn.intesys.g107.com/' + key];
  333. }
  334. that.setData({
  335. [files_box]: files
  336. });
  337. app.globalData.showToast("已上传");
  338. }
  339. },
  340. fail: function (res) {
  341. app.globalData.showToast("上传失败");
  342. }
  343. });
  344. },
  345. fail: function (res) {
  346. app.globalData.showToast("上传失败");
  347. }
  348. })
  349. },
  350. random_string(len) {
  351. len = len || 32
  352. var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  353. var maxPos = chars.length
  354. var pwd = ''
  355. for (let i = 0; i < len; i++) {
  356. pwd += chars.charAt(Math.floor(Math.random() * maxPos))
  357. }
  358. return pwd
  359. },
  360. //备注输入
  361. bindTextAreaBlur: function (e) {
  362. var index = e.target.dataset.index;
  363. var remark = `items[${index}].remark`
  364. this.setData({
  365. [remark]: e.detail.value,
  366. });
  367. },
  368. resubmit() {
  369. this.setData({
  370. resultList: this.data.errorList,
  371. resultIndex: 0,
  372. percentage: 0,
  373. results: [],
  374. isResult: true,
  375. isErrorShow: false,
  376. popupCx: 'container__mask',
  377. })
  378. this.opneWebSocket()
  379. },
  380. formSubmit() {
  381. var items = this.data.items;
  382. var arr = [];
  383. var isTg = true;
  384. for (var i = 0; i < items.length; i++) {
  385. var obj = {};
  386. var item = items[i];
  387. if (!item.remark) {
  388. app.globalData.showToast(`第${i + 1}项申请内容不能为空`);
  389. isTg = false;
  390. break;
  391. }
  392. if (!item.reviewer_id) {
  393. app.globalData.showToast(`第${i + 1}项申请审批人不能为空`);
  394. isTg = false;
  395. break;
  396. }
  397. obj.employee_id = item.employee_id;
  398. if (item.checked) {
  399. obj.rule_id = item.selectRule ? item.selectRule.rule_id : 0;
  400. obj.item_id = item.selectRule ? item.selectRule.id : 0;
  401. obj.item_name = item.selectRule ? item.selectRule.remark : '';
  402. } else {
  403. obj.rule_id = 0;
  404. obj.item_id = 0;
  405. obj.item_name = "";
  406. }
  407. if (item.checked) {
  408. if (!obj.rule_id) {
  409. app.globalData.showToast(`第${i + 1}项必须选择规则`);
  410. isTg = false;
  411. break;
  412. }else {
  413. // js判断输入的是否非数字,负号,小数点的非法字符
  414. if(/^-?\d*\.?\d*$/.test(item.point)) {
  415. if (!this.isPointOk(item.point, item.selectRule)) {
  416. const { min_point: min, max_point: max } = item.selectRule;
  417. app.globalData.showToast(`第 ${i + 1} 项分数范围不能超过${min} ~ ${max}`);
  418. isTg = false;
  419. break;
  420. }
  421. }else {
  422. app.globalData.showToast(`第 ${i + 1} 项分数填写错误`);
  423. isTg = false;
  424. break;
  425. }
  426. }
  427. }
  428. obj.remark = item.remark;
  429. obj.event_time = item.event_time;
  430. obj.reviewer_id = item.reviewer_id;
  431. obj.revieweName = item.revieweName;
  432. obj.files = item.files;
  433. obj.point = item.point;
  434. arr.push(obj);
  435. }
  436. if (isTg) {
  437. var data = {
  438. items: arr
  439. }
  440. this.webSocket(data)
  441. return false;
  442. this.setData({ disabled: true });
  443. app.$post("api/integral/review/apply", data).then((res) => {
  444. var is = true;
  445. res.data.data.list.forEach(item => {
  446. if (item.status == 0) {
  447. is = false;
  448. this.setData({ disabled: false });
  449. app.globalData.showToast(item.msg);
  450. }
  451. });
  452. if (is) {
  453. app.globalData.showToast('申请成功');
  454. setTimeout(() => {
  455. if (this.data.qrcodeId) {
  456. dd.switchTab({
  457. url: '../index/index'
  458. })
  459. } else {
  460. dd.navigateBack({
  461. delta: 1
  462. })
  463. }
  464. this.setData({ disabled: false });
  465. }, 1000);
  466. }
  467. }).catch(err => {
  468. this.setData({ disabled: false });
  469. }).finally(() => {
  470. if (arr.length > 0) {
  471. arr.forEach(item => {
  472. dd.setStorage({
  473. key: String(item.employee_id),
  474. data: { id: item.reviewer_id, name: item.revieweName },
  475. });
  476. })
  477. }
  478. })
  479. }
  480. },
  481. webSocket(data) {
  482. data.items.forEach(item2 => {
  483. item2.type = 'point_apply';
  484. })
  485. this.setData({
  486. resultList: data.items,
  487. resultIndex: 0,
  488. percentage: 0,
  489. results: [],
  490. isResult: true,
  491. popupCx: 'container__mask',
  492. })
  493. this.opneWebSocket()
  494. },
  495. returnResult(id) {
  496. return app.globalData.usersList.filter(item => {
  497. return item.id == id;
  498. })
  499. },
  500. opneWebSocket() {
  501. let wsData = this.data.resultList;
  502. if (wsData[this.data.resultIndex]) {
  503. setTime = setTimeout(() => {
  504. let errorList = wsData.slice(this.data.resultIndex, wsData.length);
  505. errorList.forEach(item => {
  506. let obj = this.returnResult(item.employee_id)[0]
  507. item.name = obj ? obj.name : '未知';
  508. })
  509. this.setData({
  510. isErrorShow: true,
  511. errorList: errorList
  512. })
  513. clearTimeout(setTime);
  514. app.globalData.socketApi.closewebsocket();
  515. }, 15000)
  516. app.globalData.socketApi.sendData(wsData[this.data.resultIndex], this.onmessageWS,true);
  517. } else {
  518. // console.log(this.data.results)
  519. }
  520. },
  521. onmessageWS(e) {
  522. // 因为作用域问题,这个函数不能使用this
  523. if (e.type == 'point_apply') {
  524. clearTimeout(setTime);
  525. let lng = that.data.resultList.length;// 进度条
  526. let results = that.data.results;//结果集
  527. results.unshift(e.result);
  528. that.setData({
  529. percentage: Math.floor(that.data.percentage += (100 / lng)),
  530. results: results,
  531. resultIndex: that.data.resultIndex + 1
  532. })
  533. that.opneWebSocket();
  534. if (lng == that.data.results.length) {
  535. that.setData({
  536. percentage: 100,
  537. })
  538. }
  539. }
  540. if (e.type == 'error') {
  541. clearTimeout(setTime);
  542. that.setData({
  543. isShowError: true,
  544. })
  545. }
  546. },
  547. closeTc(e) {
  548. var index = e.target.dataset.index;
  549. this.setData({
  550. resultList: [],
  551. resultIndex: 0,
  552. percentage: 0,
  553. results: [],
  554. isShowError: false,
  555. isResult: false,
  556. popupCx: '',
  557. getReviewerObj: that.data.reviewerInfo,
  558. items: [{//录入选项列表
  559. checked: true,//判断是否开启指定规则
  560. employee_id: app.globalData.isCreator ? '' : app.globalData.userData.id,
  561. employeeName: app.globalData.isCreator ? '' : app.globalData.userData.name,
  562. rule_id: '',//积分分类id
  563. item_id: '',//积分细则id 不选可以为0
  564. remark: '',//备注
  565. point: 0,
  566. event_time: app.globalData.day,//事件时间
  567. reviewer_id: that.data.reviewerInfo.id,
  568. revieweName: that.data.reviewerInfo.name,
  569. files: '',//附件数组列表
  570. }],
  571. })
  572. if(index==1){
  573. setTimeout(() => {
  574. if (this.data.qrcodeId) {
  575. dd.switchTab({ url: '../index/index' })
  576. } else {
  577. dd.navigateBack({ delta: 1 })
  578. }
  579. this.setData({ disabled: false });
  580. }, 1000);
  581. }
  582. },
  583. //删除一条
  584. deleteArr(e) {
  585. var index = e.target.dataset.index;
  586. var list = that.data.items;
  587. app.globalData.arrRemoveObj(list, list[index]);
  588. that.setData({
  589. items: list
  590. })
  591. },
  592. //选择奖扣对象
  593. onSelectUserEmployee(item) {
  594. var elm = item.length > 0 ? item[0] : { id: '', name: '' };
  595. var index = this.data.activeIndex;
  596. var employee_id = `items[${index}].employee_id`
  597. var employeeName = `items[${index}].employeeName`
  598. var reviewer_id = `items[${index}].reviewer_id`
  599. var revieweName = `items[${index}].revieweName`
  600. that.setData({
  601. [employee_id]: elm.id,
  602. [employeeName]: elm.name,
  603. });
  604. this.revieList(elm.id, function (res) {
  605. if (res.name) {
  606. that.setData({
  607. [reviewer_id]: res.id,
  608. [revieweName]: res.name
  609. });
  610. } else {
  611. that.setData({
  612. [reviewer_id]: '',
  613. [revieweName]: ''
  614. });
  615. }
  616. })
  617. // dd.getStorage({
  618. // key: String(elm.id),
  619. // success: function (res) {
  620. // if (res.data) {
  621. // that.setData({
  622. // [reviewer_id]: res.data.id,
  623. // [revieweName]: res.data.name
  624. // });
  625. // } else {
  626. // that.setData({
  627. // [reviewer_id]: '',
  628. // [revieweName]: ''
  629. // });
  630. // }
  631. // }
  632. // });
  633. },
  634. //获取人员(上级人员)
  635. getEmployeeList(userIdArr, callBack) {
  636. app.$get("api/employee/superior", { employee_id: userIdArr, filter_applyor: 1 }).then((res) => {
  637. callBack(res.data.data.list || [])
  638. })
  639. },
  640. //选择审批人
  641. onSelectUser(item) {
  642. var elm = item.length > 0 ? item[0] : { id: '', name: '' };
  643. var index = this.data.activeIndex;
  644. var reviewer_id = `items[${index}].reviewer_id`
  645. var revieweName = `items[${index}].revieweName`
  646. that.setData({
  647. [reviewer_id]: elm.id,
  648. [revieweName]: elm.name,
  649. });
  650. },
  651. //添加一条
  652. addArr() {
  653. var list = that.data.items
  654. if (list.length >= 10) {
  655. this.showToast('一次只能添加10条申请')
  656. return;
  657. }
  658. var arr = {//录入选项列表
  659. employee_id: app.globalData.isCreator ? '' : app.globalData.userData.id,
  660. employeeName: app.globalData.isCreator ? '' : app.globalData.userData.name,
  661. checked: true,//判断是否开启指定规则
  662. rule_id: '',//积分分类id
  663. item_id: '',//积分细则id 不选可以为0
  664. remark: '',//备注
  665. point: 0,
  666. event_time: app.globalData.day,//事件时间
  667. reviewer_id: this.data.getReviewerObj.id,
  668. revieweName: this.data.getReviewerObj.name,
  669. files: '',//附件数组列表
  670. };
  671. list.push(arr);
  672. that.setData({
  673. items: list
  674. })
  675. },
  676. switchChange(e) {
  677. var index = e.target.dataset.index;
  678. var item = `items[${index}].checked`
  679. that.setData({
  680. [item]: e.detail.value
  681. })
  682. },
  683. //选择时间
  684. openDate(e) {
  685. var index = e.target.dataset.index;
  686. var item = `items[${index}].event_time`
  687. dd.datePicker({
  688. format: 'yyyy-MM-dd',
  689. currentDate: app.globalData.day,
  690. success: (res) => {
  691. that.setData({
  692. [item]: res.date
  693. })
  694. },
  695. });
  696. },
  697. //选择规则
  698. onSelectItem(item) {
  699. var index = this.data.activeIndex;
  700. var selectRule = `items[${index}].selectRule`
  701. var remark = `items[${index}].remark`
  702. var point = `items[${index}].point`
  703. if(item.rule_id) {
  704. if(item.range_type == 1 || item.range_type == 2)
  705. that.setData({
  706. [point]: item.min_point
  707. })
  708. }
  709. that.setData({
  710. [selectRule]: item,
  711. [remark]: item.remark,
  712. })
  713. },
  714. /* 判断单个值是否合法 */
  715. isPointOk(val, rule) {
  716. const { min_point: min, max_point: max } = rule;
  717. const num = Number(val);
  718. return !Number.isNaN(num) && num >= min && num <= max;
  719. },
  720. // /* 工具:把任意值修正到合法区间 */
  721. // fixPoint(val, rule) {
  722. // const { min_point: min, max_point: max } = rule;
  723. // let num = Number(val);
  724. // if (Number.isNaN(num)) num = min;
  725. // return Math.max(min, Math.min(max, num));
  726. // },
  727. // 验证填写分数
  728. onPointBlur: function (e) {
  729. const { index, item } = e.currentTarget.dataset;
  730. const key = `items[${index}].point`;
  731. const { min_point: min, max_point: max } = item.selectRule;
  732. let value = e.detail.value;
  733. // 使用正则表达式验证:允许数字、小数点、负号
  734. const numberRegex = /^-?\d*\.?\d*$/;
  735. if (numberRegex.test(value) && value >= min && value <= max) {
  736. // 如果输入不合法,可以给用户提示
  737. } else if(numberRegex.test(value) && !(value >= min && value <= max)) {
  738. app.globalData.showToast(`请输入范围在${min} ~ ${max}的数字`);
  739. } else {
  740. app.globalData.showToast(`请输入有效的数字`);
  741. }
  742. this.setData({
  743. [key]: value
  744. });
  745. },
  746. });