apply.js 18 KB

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