integralAudit.vue 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <template>
  2. <div>
  3. <van-nav-bar title="审批" left-text="返回" @click-left="$route_back" left-arrow></van-nav-bar>
  4. <div class="body_com has_header">
  5. <scroller>
  6. <van-cell-group>
  7. <van-cell title="指定规则" v-if="can_edit_rule">
  8. <template slot="right-icon">
  9. <van-switch v-model="select_cate" size="24" />
  10. </template>
  11. </van-cell>
  12. <CategorySelectorCell
  13. v-if="can_edit_rule && !select_cate"
  14. ref="cate_selector"
  15. title="选择分类"
  16. name="分类"
  17. v-validate="'required'"
  18. v-model="cate_list"
  19. :max="1"
  20. :multi="false"
  21. required
  22. ></CategorySelectorCell>
  23. <van-cell title="分类" v-show="!can_edit_rule" :value="rule_name"></van-cell>
  24. <RuleCategorySelectorCell :multi="false" title="选择规则" :ptId="pointTypeId" v-model="item_list" v-if="can_edit_rule && select_cate"></RuleCategorySelectorCell>
  25. <!-- 选择了的规则 -->
  26. <van-cell v-if="item_info.rule_id && item_list.length > 0" :title="item_info.remark">
  27. <template slot="label">
  28. <span class="record green" v-if="item_info.min_point < 0">
  29. {{ item_info.range_type == 1 ? item_info.min_point : item_info.min_point + '~' + item_info.max_point }}
  30. </span>
  31. <span class="record red" v-if="item_info.min_point >= 0">
  32. + {{ item_info.range_type == 1 ? item_info.min_point : item_info.min_point + '~' + item_info.max_point }}
  33. </span>
  34. <span class="type">{{ types_list[item_info.pt_id] }}</span>
  35. </template>
  36. </van-cell>
  37. <!-- 默认进来的规则 -->
  38. <div v-show="detail_data.item_id && detail_data.rule_id">
  39. <van-cell title="选择规则" value="选择了1条规则" is-link></van-cell>
  40. <van-cell v-if="detail_data.item_id" :title="detail_data.item_name">
  41. <template slot="label">
  42. <span class="record green" v-if="detail_data.item_min_point <= 0">
  43. {{ detail_data.item_range_type == 1 ? detail_data.item_min_point : detail_data.item_min_point + '~' + detail_data.item_max_point }}
  44. </span>
  45. <span class="record red" v-if="detail_data.item_min_point > 0">
  46. + {{ detail_data.item_range_type == 1 ? detail_data.item_min_point : detail_data.item_min_point + '~' + detail_data.item_max_point }}
  47. </span>
  48. <span class="type">{{ types_list[detail_data.pt_id] }}</span>
  49. </template>
  50. </van-cell>
  51. </div>
  52. </van-cell-group>
  53. <div class="expiryTip" v-show="expiryDay > 0">任务每逾期1天扣{{ expiryPoints }}分,当前逾期{{ expiryDay }}天</div>
  54. <template v-if="detail_data.item_id && detail_data.rule_id">
  55. <van-cell-group>
  56. <NumberInput
  57. v-show="detail_data.pid == 0"
  58. title="积分"
  59. :min="data.item_min_point"
  60. :max="data.item_max_point"
  61. :isForbidSet="detail_data.pid? true:false"
  62. required
  63. v-model="data.point"
  64. name="积分"
  65. v-validate="'required'"
  66. ></NumberInput>
  67. <div class="flex-box flex-v-ce jf" v-show="detail_data.item_range_type == 2 && detail_data.pid != 0">
  68. <div>积分</div>
  69. <div>
  70. <span class="red" v-if="data.point > 0">+{{ data.point }}</span>
  71. <span class="green" v-else>{{ data.point }}</span>
  72. </div>
  73. </div>
  74. </van-cell-group>
  75. </template>
  76. <!-- 有分类,没有规则 --> <!-- 没有规则跟细则 -->
  77. <van-cell-group v-else>
  78. <NumberInput title="积分"
  79. :min="data.item_min_point"
  80. :max="data.item_max_point"
  81. :isForbidSet="detail_data.pid? true:false"
  82. required v-model="data.point"
  83. name="积分"
  84. v-validate="'required'">
  85. </NumberInput>
  86. </van-cell-group>
  87. <van-cell-group>
  88. <div class="tip" slot="title">奖票多用于优秀表现和重要事项的表彰</div>
  89. <van-cell center title="发放奖票">
  90. <template #right-icon>
  91. <van-switch v-model="ticket_count" size="24" :disabled="!!detail_data.pid" />
  92. </template>
  93. </van-cell>
  94. </van-cell-group>
  95. <DateCell
  96. v-if="(detail_data.source_type == 2 || detail_data.source_type == 3) && detail_data.pid == 0"
  97. title="发生时间"
  98. v-model="data.event_time"
  99. :defaultVal="data.event_default"
  100. :maxDate="maxDate"
  101. ></DateCell>
  102. <van-cell-group v-if="!isCreator">
  103. <EmployeeSelectorCell
  104. title="审批人"
  105. v-model="reviewer"
  106. :multi="false"
  107. iconType="records"
  108. :employee_list="superior_list"
  109. :is_employee_list="true"
  110. ></EmployeeSelectorCell>
  111. </van-cell-group>
  112. <van-cell-group>
  113. <van-cell><Mtextarea v-model="data.remark" placeholder="填写意见(选填)"></Mtextarea></van-cell>
  114. </van-cell-group>
  115. <div style="padding:0.32rem;"><van-button size="large" @click="sava_btn" type="info">提交</van-button></div>
  116. </scroller>
  117. </div>
  118. </div>
  119. </template>
  120. <script>
  121. import NumberInput from '@/components/NumberInput';
  122. import Mtextarea from '@/components/Mtextarea';
  123. import EmployeeSelectorCell from '@/components/EmployeeSelectorCell';
  124. import RuleCategorySelectorCell from '@/components/RuleCategorySelectorCell1';
  125. import CategorySelectorCell from '@/components/CategorySelectorCell';
  126. import DateCell from '@/components/DateCell';
  127. import Vue from 'vue';
  128. import { Collapse, CollapseItem, Switch, Image } from 'vant';
  129. Vue.use(Image);
  130. Vue.use(Collapse);
  131. Vue.use(Switch);
  132. Vue.use(CollapseItem);
  133. export default {
  134. name: 'integral',
  135. components: {
  136. Mtextarea,
  137. EmployeeSelectorCell,
  138. RuleCategorySelectorCell,
  139. CategorySelectorCell,
  140. NumberInput,
  141. DateCell
  142. },
  143. data() {
  144. return {
  145. isCreator: this.$userInfo().is_creator,
  146. select_cate: false,
  147. item_name: '',
  148. ticket_count: false,
  149. cate_list: [],
  150. item_info: {},
  151. item_list: [],
  152. item_show: false,
  153. can_edit_rule: true,
  154. types_list: {},
  155. rule_name: '',
  156. data: {
  157. review_id: 0,
  158. action: 'complete',
  159. rule_id: 0,
  160. item_id: 0,
  161. point: 0,
  162. reviewer_id: 0,
  163. remark: '',
  164. ticket_count: 0,
  165. event_time: '',
  166. event_default: new Date(2021, 5, 5),
  167. item_min_point:0,
  168. item_max_point:0,
  169. },
  170. expiryDay: null,
  171. expiryPoints: null,
  172. reviewer: [],
  173. detail_data: {},
  174. superior_list: this.$userInfo().employee_detail.superior_list,
  175. maxDate: new Date()
  176. };
  177. },
  178. watch: {
  179. select_cate(val) {
  180. this.item_list = [];
  181. this.cate_list = [];
  182. this.data.item_min_point=-100000;
  183. this.data.item_max_point=100000;
  184. },
  185. cate_list(val) {
  186. if (val.length == 0) {
  187. this.data.rule_id = 0;
  188. } else {
  189. this.data.rule_id = val[0].id;
  190. }
  191. },
  192. item_list(val) {
  193. if (val.length == 0) {
  194. this.data.item_id = 0;
  195. this.data.rule_id = 0;
  196. this.item_info = {};
  197. } else {
  198. this.data.point = val[0].min_point;
  199. this.data.rule_id = val[0].rule_id;
  200. this.data.item_id = val[0].id;
  201. this.data.item_min_point=val[0].min_point;
  202. this.data.item_max_point=val[0].max_point;
  203. this.item_info = val[0];
  204. }
  205. },
  206. ticket_count(val) {
  207. if (val) {
  208. this.data.ticket_count = 1;
  209. } else {
  210. this.data.ticket_count = 0;
  211. }
  212. },
  213. reviewer(val, old) {
  214. if (val.length == 0) {
  215. this.data.reviewer_id = 0;
  216. } else {
  217. this.data.reviewer_id = val[0].id;
  218. }
  219. }
  220. },
  221. methods: {
  222. item_del() {
  223. this.item_show = false;
  224. for (let i in this.item_list) {
  225. this.$set(this.item_list[i], 'checked', false);
  226. }
  227. this.item_info = {};
  228. this.data.point = 0;
  229. this.data.item_id = 0;
  230. },
  231. item_confirm(item, index) {
  232. this.item_show = false;
  233. for (let i in this.item_list) {
  234. this.$set(this.item_list[i], 'checked', false);
  235. }
  236. this.item_info = item;
  237. this.data.point = item.min_point;
  238. this.data.item_id = item.id;
  239. this.$set(this.item_list[index], 'checked', true);
  240. },
  241. get_items(data) {
  242. this.item_info = {};
  243. for (let i in data) {
  244. if (!data[i].checked) {
  245. data[i]['checked'] = false;
  246. }
  247. }
  248. this.item_list = data;
  249. for (let i in data) {
  250. if (this.data.item_id == data[i].id) {
  251. this.item_confirm(data[i], i);
  252. }
  253. }
  254. },
  255. showLoading() {
  256. this.$toast.loading({
  257. loadingType: 'spinner',
  258. message: '正在处理'
  259. });
  260. },
  261. get_point_types() {
  262. var types = this.$getTypes;
  263. for (let i in types) {
  264. this.types_list[types[i].id] = types[i].name;
  265. }
  266. },
  267. choseItem() {
  268. if (this.item_name == '') {
  269. this.item_show = true;
  270. } else {
  271. this.item_show = false;
  272. }
  273. },
  274. get_data() {
  275. this.$toast.loading({ message: '正在加载' });
  276. this.$axiosUser('get', '/api/pro/integral/review', { review_id: this.data.review_id })
  277. .then(res => {
  278. let obj=res.data.data
  279. this.data.item_id = obj.item_id;
  280. this.data.point = obj.point;
  281. this.data.ticket_count = obj.ticket_count;
  282. this.ticket_count = !!obj.ticket_count;
  283. if(obj.item_id){
  284. this.data.item_min_point = obj.item_min_point;
  285. this.data.item_max_point = obj.item_max_point;
  286. }else{
  287. this.data.item_min_point = -100000;
  288. this.data.item_max_point = 100000;
  289. }
  290. this.item_name = obj.item_name;
  291. this.pointTypeId = obj.pt_id;
  292. // 事件时间
  293. this.data.event_time = this.$moment.unix(obj.event_time).format('YYYY-MM-DD');
  294. this.data.event_default = this.getDate(this.data.event_time);
  295. obj.detail.forEach(element => {
  296. if (element.key === '逾期天数') {
  297. this.expiryDay = element.value;
  298. }
  299. if (element.key === '逾期扣分') {
  300. this.expiryPoints = element.value;
  301. }
  302. });
  303. if (obj.rule_id > 0) {
  304. this.cate_list = [{ id: obj.rule_id, name: obj.rule_name }];
  305. this.can_edit_rule = false;
  306. this.rule_name = obj.rule_name;
  307. }
  308. this.detail_data = obj;
  309. }).finally(() => this.$toast.clear());
  310. },
  311. getDate(data) {
  312. var arr = data.split('-');
  313. return new Date(arr[0], arr[1] - 1, arr[2]);
  314. },
  315. send() {
  316. let self = this;
  317. if (self.data.point === 0) {
  318. self.$toast('积分不能为0');
  319. return;
  320. }
  321. self.validatePointPermission([self.data], self.pointTypeId, err => {
  322. if (err) {
  323. self.$notify({ type: 'danger', message: err.message });
  324. } else {
  325. self.send_loading = true;
  326. self.$toast.loading({ message: '正在处理' });
  327. this.$axiosUser('post', '/api/pro/integral/review', self.data)
  328. .then(res => {
  329. self.send_loading = false;
  330. self.$toast.clear();
  331. if (res.data.code == 1) {
  332. self.$toast.success(res.data.msg);
  333. setTimeout(() => {
  334. self.$route_back();
  335. }, 500);
  336. }
  337. })
  338. .catch(e => {
  339. self.send_loading = false;
  340. self.$toast.clear();
  341. });
  342. }
  343. });
  344. },
  345. sava_btn() {
  346. let self = this;
  347. self.$validator.validate().then(result => {
  348. if (!result) {
  349. self.$notify({ type: 'danger', message: self.$validator.errors.items[0].msg });
  350. } else {
  351. self.send();
  352. }
  353. });
  354. },
  355. validatePointPermission(items, ptId, callback) {
  356. const userInfo = this.$userInfo();
  357. const pointConfig = userInfo.point_config;
  358. const index = pointConfig.point_limit.findIndex(o => o.pt_id === ptId);
  359. if (index < 0 || userInfo.is_creator === 1) {
  360. callback();
  361. } else {
  362. const maxPointPermission = parseInt(pointConfig.point_limit[index].point);
  363. /** maxPointPermission 等于-1时 不做任何限制 */
  364. if (maxPointPermission === -1) {
  365. callback();
  366. } else {
  367. const ruleLimitCheck = userInfo.site_config.rule_limit_check;
  368. // 20200731
  369. /** 在 ruleLimitCheck 为0的时候, 超出积分权限都要选择审批人提交 */
  370. this.validateRuleLimit(items, callback, a => {
  371. return !(
  372. (a.reviewer_id && a.point !== 0 && a.rule_id > 0) ||
  373. (a.reviewer_id <= 0 && a.item_id > 0 && ruleLimitCheck && a.point !== 0 && a.point <= maxPointPermission && Math.abs(a.point) <= maxPointPermission) ||
  374. (a.reviewer_id <= 0 && !ruleLimitCheck && this.pointTypeId == 3 && a.rule_id > 0) ||
  375. (a.reviewer_id <= 0 && a.item_id >= 0 && a.point !== 0 && a.point <= maxPointPermission && Math.abs(a.point) <= maxPointPermission && a.rule_id > 0)
  376. );
  377. });
  378. // /** 在 ruleLimitCheck 为0的时候, 超出积分权限都要选择审批人提交 */
  379. // if (ruleLimitCheck === 0) {
  380. // this.validateRuleLimit(items, callback, a => a.reviewer_id && a.point > 0 && a.rule_id > 0)
  381. // } else {
  382. // /** 在 ruleLimitCheck 为1的时候, 1.选择了规则就不强制选择申请人 2.未选规则超出权限分要提交审批人 */
  383. // this.validateRuleLimit(items, callback, b => b.item_id === 0 && b.point > maxPointPermission)
  384. // }
  385. }
  386. }
  387. },
  388. validateRuleLimit(items, callback, conditionCallback) {
  389. if (typeof callback !== 'function') {
  390. throw new TypeError('callback is not a function');
  391. }
  392. const res = items.every((item, index) => {
  393. if (conditionCallback(item, index)) {
  394. index === 0 ? callback(new Error('输入分值超出权限,请选择审批人递交')) : callback(new Error(`第${index + 1}条输入分值超出权限,请选择审批人递交`));
  395. return false;
  396. }
  397. return true;
  398. });
  399. res && callback();
  400. }
  401. },
  402. created() {
  403. var lastDate = new Date(); // 最后30天可以更改,意义:是获取多少天前的时间
  404. var lastY = lastDate.getFullYear();
  405. var lastM = lastDate.getMonth();
  406. var lastD = lastDate.getDate();
  407. if (this.$route.query.review_id) {
  408. this.data.review_id = this.$route.query.review_id;
  409. }
  410. this.get_point_types();
  411. this.get_data();
  412. }
  413. };
  414. </script>
  415. <style scoped>
  416. .body_com {
  417. height: calc(100% - 0.92rem);
  418. position: relative;
  419. }
  420. .item-clear-btn {
  421. margin-right: -0.32rem;
  422. }
  423. /deep/ .item-clear-btn span {
  424. font-size: 0.2rem;
  425. }
  426. .jf {
  427. padding: 0.24rem 0.32rem;
  428. font-size: 0.32rem;
  429. color: #323233;
  430. }
  431. .jf div:nth-child(1) {
  432. width: 1.8rem;
  433. position: relative;
  434. }
  435. .jf div:nth-child(1)::before {
  436. position: absolute;
  437. left: -0.2rem;
  438. color: #ee0a24;
  439. font-size: 0.28rem;
  440. content: '*';
  441. }
  442. .expiryTip {
  443. padding: 0.2rem 0.32rem 0.1rem 0.32rem;
  444. color: #ee0a24;
  445. font-size: 0.24rem;
  446. }
  447. </style>