apply.js 18 KB

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