integral_reapplication.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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 :isNeed="isNeed">
  6. <div v-for="(item,index) in fromData.items" :key="index" class="item_class" @click="itemIndex = index">
  7. <div class="clear operation">
  8. <span class="fl color_ccc">申请(第{{index+1}}条)</span>
  9. </div>
  10. <van-cell required title="录入对象" right-icon="arrow">
  11. <Wxopendata type="userName" :openid="item.employee_name"></Wxopendata>
  12. </van-cell>
  13. <van-cell center title="指定规则">
  14. <template #right-icon>
  15. <div>
  16. <van-switch v-model="item.show_rule" inactive-color="#9a9a9a" size="24" @change="onRuleSwitchChange(item)" />
  17. </div>
  18. </template>
  19. </van-cell>
  20. <div v-show="item.show_rule">
  21. <RuleCategorySelectorCell @confirm="rule_item_confirm" title="选择分类和规则" v-model="rule_item" :multi="false"
  22. :max="1"></RuleCategorySelectorCell>
  23. <van-cell v-for="(d, i) in rule_item" :key="i" size="large" :label="d.remark">
  24. <template slot="title">
  25. {{ get_point_name(d.pt_id) }}
  26. <span v-show="d.range_type == 1">{{ d.min_point }}</span>
  27. <span v-show="d.range_type == 2">{{ d.min_point }}—{{ d.max_point }}</span>
  28. </template>
  29. </van-cell>
  30. </div>
  31. <van-cell required>
  32. <Mtextarea v-model="item.remark" name="申请事由" v-validate="'required|max:300'" placeholder="请输入申请事由(最多300字)"
  33. :text_max="300" :imgs_max="3" images speech :imgs.sync="item.files"></Mtextarea>
  34. </van-cell>
  35. <DateCell required title="发生时间" v-model="item.event_time"></DateCell>
  36. <van-cell required title="审批人" right-icon="arrow">
  37. <Wxopendata type="userName" :openid="item.reviewer_name"></Wxopendata>
  38. </van-cell>
  39. </div>
  40. <div style="padding:0.32rem; box-sizing: border-box;">
  41. <van-button size="large" @click="data_verify" :disabled="subloading || !hasRules" type="info">提交</van-button>
  42. </div>
  43. </scroller>
  44. </div>
  45. </div>
  46. </template>
  47. <script>
  48. import request from '@/utils/request'
  49. import integralApplyItem from '@/components/common/integralApplyItem'
  50. import moment from 'moment'
  51. import Mtextarea from '@/components/common/Mtextarea'
  52. import RuleCategorySelectorCell from '@/components/common/RuleCategorySelectorCell1'
  53. import DateCell from '@/components/common/DateCell'
  54. export default {
  55. name: 'integral_application',
  56. components: {integralApplyItem, Mtextarea, RuleCategorySelectorCell, DateCell},
  57. data () {
  58. let date = moment().format('YYYY-MM-DD')
  59. return {
  60. isNeed:this.$getCache('isAndroid') == 1 ? false: true,
  61. close_buttom: false,
  62. detail_info: {},
  63. fromData: {
  64. items: []
  65. },
  66. itemIndex: 0,
  67. rule_item: [],
  68. point_types: JSON.parse(localStorage.getItem('SET_POINT_TYPES')) || JSON.parse(plus.storage.getItem('SET_POINT_TYPES')),
  69. itemData: {},
  70. hasRules: false,
  71. subloading: false,
  72. employee_map: JSON.parse(localStorage.getItem('SET_EMPLOYEE_MAP')) || JSON.parse(plus.storage.getItem('SET_EMPLOYEE_MAP')),
  73. }
  74. },
  75. created() {
  76. this.initData();
  77. },
  78. methods: {
  79. initData () {
  80. this.detail_info = JSON.parse(this.$route.query.detail_info)
  81. let obj = {
  82. employee_id: this.detail_info.employee_id,
  83. employee_name: this.detail_info.employee_info.name,
  84. event_time: '',
  85. reviewer_id: this.detail_info.reviewer_id,
  86. reviewer_name: this.employee_map[this.detail_info.reviewer_id].name,
  87. rule_id: this.detail_info.rule_id,
  88. item_id: this.detail_info.item_id,
  89. show_rule: this.detail_info.rule_id && this.detail_info.rule_id != 0 ? true : false,
  90. remark: this.detail_info.item_name,
  91. files: []
  92. }
  93. // 处理事件时间
  94. let timeData = this.detail_info.detail.find(item => item.key === '事件时间')
  95. if (timeData && timeData.value) {
  96. obj.event_time = timeData.value
  97. }
  98. // 处理附件
  99. let fileData = this.detail_info.detail.find(item => item.key === '附件')
  100. if (fileData && fileData.value && fileData.value.length) {
  101. obj.files = fileData.value
  102. }
  103. this.fromData.items.splice(0, 1, obj);
  104. this.hasRules = this.fromData.items.every(item => !item.show_rule || item.show_rule && item.rule_id && item.rule_id !== 0)
  105. // 处理规则项
  106. if (this.detail_info.rule_id && this.detail_info.rule_id != 0) {
  107. this.rule_item = [{
  108. checked: true,
  109. cycle_type: this.detail_info.item_cycle_type,
  110. pt_id: this.detail_info.pt_id,
  111. rule_id: this.detail_info.rule_id,
  112. id: this.detail_info.item_id,
  113. remark: this.detail_info.rule_name,
  114. prize_type: this.detail_info.item_prize_type,
  115. range_type: this.detail_info.item_range_type,
  116. min_point: this.detail_info.item_min_point,
  117. max_point: this.detail_info.item_max_point,
  118. is_attendance: this.detail_info.item_is_attendance
  119. }]
  120. }
  121. },
  122. rule_item_confirm(index, data) {
  123. if (data.length == 0) {
  124. this.fromData.items[this.itemIndex].rule_id = 0
  125. this.fromData.items[this.itemIndex].item_id = 0
  126. this.fromData.items[this.itemIndex].remark = ''
  127. this.rule_item = []
  128. return
  129. }
  130. this.rule_item = data
  131. this.fromData.items[this.itemIndex].rule_id = data[0].rule_id
  132. this.fromData.items[this.itemIndex].item_id = data[0].id
  133. this.fromData.items[this.itemIndex].remark = data[0].remark
  134. },
  135. onRuleSwitchChange(item) {
  136. if (!item.show_rule) {
  137. item.rule_id && item.item_id ? item.remark = '' : ''
  138. this.rule_item = []
  139. item.rule_id = 0
  140. item.item_id = 0
  141. }
  142. this.hasRules = this.fromData.items.every(i => !i.show_rule || i.show_rule && i.rule_id && i.rule_id !== 0)
  143. },
  144. get_point_name(id) {
  145. let name = ''
  146. this.point_types.forEach(element => {
  147. if (element.id == id) {
  148. name = element.name
  149. }
  150. })
  151. return name
  152. },
  153. data_verify () {
  154. let self = this
  155. self.$validator.validateAll().then(result => {
  156. if (!result) {
  157. self.$notify({ type: 'danger', message: self.$validator.errors.items[0].msg })
  158. } else {
  159. self.send()
  160. }
  161. })
  162. },
  163. send () {
  164. let self = this
  165. self.subloading = true
  166. for (const i in self.fromData.items) {
  167. if (!self.fromData.items[i].employee_id) {
  168. self.$notify({ type: 'danger', message: '第' + (parseInt(i) + 1) + '条请选择录入对象'})
  169. self.subloading = false
  170. return false
  171. }
  172. if (!self.fromData.items[i].event_time) {
  173. self.$notify({ type: 'danger', message: '第' + (parseInt(i) + 1) + '条请选择发生时间'})
  174. self.subloading = false
  175. return false
  176. }
  177. if (!self.fromData.items[i].reviewer_id) {
  178. self.subloading = false
  179. self.$notify({ type: 'danger', message: '第' + (parseInt(i) + 1) + '条请选择审批人'})
  180. return false
  181. }
  182. if (!self.fromData.items[i].remark) {
  183. self.$notify({ type: 'danger', message: '第' + (parseInt(i) + 1) + '条请输入申请事由'})
  184. self.subloading = false
  185. return false
  186. }
  187. }
  188. self.$toast.loading({
  189. message: '正在处理'
  190. })
  191. if (this.close_buttom == false) { // 第一次点击提交为false,为false可进入请求。请求成为 为true。0.5秒后变为false
  192. request('post', '/api/integral/review/apply', self.fromData, 'v2').then(res => {
  193. self.$toast.clear()
  194. if (res.data.code == 1) {
  195. if (res.data.data.list.some(item => item.status != 0)) {
  196. this.$toast.success("申请成功")
  197. this.fromData = {
  198. items: [{}]
  199. }
  200. this.itemData = {}
  201. setTimeout(() => {
  202. this.$router.push({ path: '/integral_application_list' })
  203. }, 500)
  204. // localStorage.setItem('callback_data', JSON.stringify({detail_url: this.$route.path, result: res.data.data}))
  205. // this.$router.push({path: '/callback_new'})
  206. } else {
  207. let index = res.data.data.list.findIndex(item => item.status == 0)
  208. self.$notify({ type: 'danger', message: res.data.data.list[0].msg})
  209. }
  210. } else {
  211. self.$notify({ type: 'danger', message: res.data.msg})
  212. }
  213. }).catch(e => {
  214. self.$toast.clear()
  215. }).finally(() => {
  216. self.subloading = false
  217. self.close_buttom = true
  218. setTimeout(() => {
  219. self.close_buttom = false
  220. }, 1000)
  221. })
  222. } else {
  223. self.subloading = false
  224. }
  225. }
  226. }
  227. }
  228. </script>
  229. <style scoped lang="less">
  230. .body_com{
  231. height: calc(100% - 0.92rem);
  232. position: relative;
  233. overflow-y: scroll;
  234. }
  235. .item_class{
  236. .operation{
  237. padding: 0.24rem 0.32rem;
  238. font-size: 0.3rem;
  239. box-sizing: border-box;
  240. .del_btn{
  241. color: #26A2FF;
  242. }
  243. }
  244. }
  245. .color_bule{
  246. color: #26A2FF;
  247. }
  248. </style>