apply.js 18 KB

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