apply.js 19 KB

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