LeaveForm.vue 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. <template>
  2. <div>
  3. <common @asynCallBack="asynCallBack"></common>
  4. <top-header :pageTitle="pageTitle"></top-header>
  5. <div class="mui-content vongi-wordcard">
  6. <div class="mui-content-padded">
  7. <form class="mui-input-group">
  8. <div class="mui-input-row">
  9. <label><span class="colorfe616c">*</span>请假类型</label>
  10. <div class="mui-navigate-right" @click="selectType">
  11. <button class="mui-btn mui-btn-block" type='button' v-text="typeName">请选择</button>
  12. </div>
  13. </div>
  14. <div class="mui-input-row">
  15. <label><span class="colorfe616c">*</span>审批人</label>
  16. <div class="mui-navigate-right" @click="selectPerson">
  17. <button id='' class="mui-btn mui-btn-block" type='button' v-text="approvalPersonName">请选择</button>
  18. </div>
  19. </div>
  20. </form>
  21. </div>
  22. <div class="mui-content-padded vongi-qingjia-date">
  23. <form class="mui-input-group">
  24. <div class="mui-input-row">
  25. <label><span class="colorfe616c">*</span>开始日期</label>
  26. <div class="mui-navigate-right" @click="selectStartTime()">
  27. <button class="mui-btn mui-btn-block" type='button' v-text="tjForm.startTime">请选择</button>
  28. </div>
  29. </div>
  30. <div class="mui-input-row">
  31. <label><span class="colorfe616c">*</span>结束日期</label>
  32. <div class="mui-navigate-right" @click="selectEndTime()">
  33. <button class="mui-btn mui-btn-block" type='button' v-text="tjForm.endTime">请选择</button>
  34. </div>
  35. </div>
  36. </form>
  37. </div>
  38. <div class="mui-content-padded">
  39. <h5><span class="colorfe616c">*</span>请假事由</h5>
  40. <div class="mui-input-row">
  41. <textarea id="textarea" rows="5" v-model="tjForm.reason" :placeholder="reasonDefault"></textarea>
  42. </div>
  43. </div>
  44. <div class="mui-content-padded">
  45. <h5>上传照片</h5>
  46. <div class="fyy-upphoto">
  47. <div class="mui-col-xs-3 fyy-upphoto-close" v-for="(item,index) in picList">
  48. <img :src="item" />
  49. <a class="mui-icon mui-icon-closeempty" @click="delPic(item)"></a>
  50. </div>
  51. <div class="mui-col-xs-3" @click="chooseImage">
  52. <a><span class="mui-icon mui-icon-plusempty"></span></a>
  53. </div>
  54. </div>
  55. </div>
  56. <div class="mui-content-padded mui-h6">注:1、病假须上传医院证明。2、请假事由中须写明请假去向。</div>
  57. <div class="vongi-btn">
  58. <button class="mui-btn mui-btn-primary " type="submit" @click="submit()">
  59. 提交
  60. </button>
  61. </div>
  62. </div>
  63. <loading :visible="isLoading"></loading>
  64. </div>
  65. </template>
  66. <script>
  67. require('$project/assets/js/mui.picker.min.js');
  68. import * as API_Leave from '@/apis/Master/leave'
  69. import Common from '$project/components/Common.vue'
  70. import Loading from '$project/components/Loading.vue'
  71. import TopHeader from '$project/components/TopHeader.vue'
  72. import {
  73. mapGetters,
  74. mapMutations
  75. } from 'vuex'
  76. import * as WxJsApi from '$project/utils/wxJsApi'
  77. import * as types from '$project/store/mutation-types'
  78. export default {
  79. name: 'MasterAttendanceLeaveForm',
  80. components: {
  81. Common,
  82. Loading,
  83. TopHeader
  84. },
  85. data() {
  86. return {
  87. pageTitle: '请假',
  88. isLoading: false,
  89. leaveTypeList: [],
  90. approvedList: [],
  91. typeName: '请选择',
  92. approvalPersonName: '请选择',
  93. tjForm: {
  94. startTime: '请选择',
  95. endTime: '请选择',
  96. leaveType: '',
  97. imageUrl: '',
  98. reason: '',
  99. personId: '',
  100. approvedId: '',
  101. remark: '',
  102. },
  103. reasonDefault: '请假申请',
  104. picList: [],
  105. }
  106. },
  107. created() {
  108. },
  109. methods: {
  110. //审批类型
  111. getLeaveTypeList() {
  112. API_Leave.leaveTypeList().then(response => {
  113. for (var i in response) {
  114. var mod = response[i]
  115. mod.text = mod.name
  116. this.leaveTypeList.push(mod)
  117. }
  118. }).catch(error => {
  119. mui.toast(error);
  120. })
  121. },
  122. //获取审核人列表
  123. getPsersonList() {
  124. this.isLoading = true;
  125. API_Leave.approvedList().then(response => {
  126. for (var i in response) {
  127. var mod = response[i]
  128. mod.text = mod.name
  129. mod.value = mod.id;
  130. this.approvedList.push(mod)
  131. }
  132. this.isLoading = false;
  133. //设置默认审核人
  134. this.setDefaultExaminePerson();
  135. }).catch(error => {
  136. this.isLoading = false;
  137. mui.toast(error);
  138. })
  139. },
  140. //微信选择图片
  141. chooseImage() {
  142. WxJsApi.chooseImage().then(res => {
  143. var localData = res.localData;
  144. if (localData.indexOf('data:image') != 0) {
  145. //判断是否有这样的头部
  146. localData = 'data:image/jpeg;base64,' + localData
  147. }
  148. localData = localData.replace(/\r|\n/g, '').replace('data:image/jgp', 'data:image/jpeg')
  149. this.imgBase64 = localData;
  150. //显示裁剪图片
  151. //_this.showCropper(field);
  152. this.uploadpic();
  153. }).catch(error => {
  154. mui.toast(error);
  155. })
  156. },
  157. //上传图片
  158. uploadpic() {
  159. this.isLoading = true;
  160. WxJsApi.uploadPic(this.imgBase64).then(response => {
  161. this.isLoading = false;
  162. this.picList.push(response);
  163. }).catch(error => {
  164. this.isLoading = false;
  165. mui.toast(error);
  166. })
  167. },
  168. //选择审核人
  169. selectPerson() {
  170. var _this = this;
  171. var picker = new mui.PopPicker();
  172. picker.setData(_this.approvedList);
  173. if (this.default_examine_person) {
  174. picker.pickers[0].setSelectedValue(this.default_examine_person);
  175. }
  176. picker.show(function(selectItems) {
  177. _this.tjForm.approvedId = selectItems[0].value;
  178. _this.approvalPersonName = selectItems[0].text;
  179. _this.set_default_examine_person(selectItems[0].value);
  180. })
  181. },
  182. //设置默认审核人
  183. setDefaultExaminePerson() {
  184. if (this.default_examine_person) {
  185. for (var i = 0; i < this.approvedList.length; i++) {
  186. if (this.approvedList[i].value == this.default_examine_person) {
  187. this.tjForm.approvedId = this.default_examine_person;
  188. this.approvalPersonName = this.approvedList[i].text;
  189. }
  190. }
  191. }
  192. },
  193. //选择时间
  194. selectStartTime() {
  195. var _this = this;
  196. var startTime = _this.tjForm.startTime == '请选择' ? new Date() : _this.tjForm.startTime;
  197. var endDate = null;
  198. if (_this.tjForm.endTime != '请选择') {
  199. endDate = new Date(_this.tjForm.endTime);
  200. }
  201. var picker = new mui.DtPicker({
  202. "type": "datetime",
  203. "beginYear": 2020,
  204. "endYear": 2040,
  205. "endDate": endDate,
  206. });
  207. picker.show(function(rs) {
  208. _this.tjForm.startTime = rs.text;
  209. });
  210. },
  211. //选择时间
  212. selectEndTime() {
  213. var _this = this;
  214. if (_this.tjForm.startTime == '请选择') {
  215. mui.toast('请选择开始日期');
  216. return;
  217. }
  218. var beginDate = new Date(_this.tjForm.startTime);
  219. var picker = new mui.DtPicker({
  220. "type": "datetime",
  221. "beginYear": 2020,
  222. "endYear": 2040,
  223. "beginDate": beginDate,
  224. });
  225. picker.show(function(rs) {
  226. _this.tjForm.endTime = rs.text;
  227. });
  228. },
  229. //类型选择
  230. selectType() {
  231. var picker = new mui.PopPicker();
  232. picker.setData(this.leaveTypeList);
  233. var _this = this;
  234. picker.show(function(selectItems) {
  235. _this.tjForm.leaveType = selectItems[0].value;
  236. _this.typeName = selectItems[0].text;
  237. })
  238. },
  239. //表单检测
  240. checkFrom() {
  241. if (!this.tjForm.leaveType) {
  242. mui.toast('请选择请假类型');
  243. return false;
  244. } else if (!this.tjForm.approvedId) {
  245. mui.toast('请选择审批人');
  246. return false;
  247. } else if (!this.tjForm.startTime) {
  248. mui.toast('请选择开始日期');
  249. return false;
  250. } else if (!this.tjForm.endTime) {
  251. mui.toast('请选择结束日期');
  252. return false;
  253. } else if (!this.tjForm.reason) {
  254. mui.toast('请输入请假理由');
  255. return false;
  256. } else {
  257. return true;
  258. }
  259. },
  260. //删除图片
  261. delPic(item) {
  262. let picList = this.picList;
  263. let index = picList.indexOf(item);
  264. if (index > -1) {
  265. picList.splice(index, 1);
  266. }
  267. this.picList = picList;
  268. },
  269. //提交
  270. submit() {
  271. this.tjForm.reason = this.tjForm.reason ? this.tjForm.reason : this.reasonDefault;
  272. if (this.checkFrom()) {
  273. this.tjForm.imageUrl = this.picList.join(',');
  274. this.isLoading = true;
  275. API_Leave.save(this.tjForm).then(response => {
  276. this.isLoading = false;
  277. mui.toast("提交成功");
  278. this.$router.push({
  279. name: 'MasterAttendanceLeaveList',
  280. query: {}
  281. })
  282. }).catch(error => {
  283. this.isLoading = false;
  284. mui.toast(error);
  285. })
  286. }
  287. },
  288. asynCallBack() {
  289. },
  290. ...mapMutations({
  291. set_default_examine_person: types.SET_DEFAULT_EXAMINE_PERSON,
  292. })
  293. },
  294. mounted() {
  295. //获取微信配置
  296. WxJsApi.getWxConfig();
  297. this.getLeaveTypeList();
  298. this.getPsersonList();
  299. },
  300. destroyed() {},
  301. computed: {
  302. ...mapGetters({
  303. openId: 'wx_openid',
  304. token: 'token',
  305. default_examine_person: 'default_examine_person'
  306. })
  307. }
  308. }
  309. </script>
  310. <style scoped src="$project/assets/css/xpwyfyy.css"></style>
  311. <style src="$project/assets/css/iconfont.css"></style>
  312. <style src="$project/assets/css/mui.picker.min.css"></style>
  313. <style>
  314. </style>