enrolledForm.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. <template>
  2. <view class="content">
  3. <u-form :model="form" ref="form" label-width="140">
  4. <u-form-item label="订单号" prop="orderNo" required>
  5. <view style="display: flex;">
  6. <u-input v-model="form.orderNo" placeholder="请输入订单号" style="flex: 1;" />
  7. <u-icon name="scan" size="60" style="margin-left: 5px;" @click="scanQRCode()" v-if="payTypeCode == 0"></u-icon>
  8. </view>
  9. </u-form-item>
  10. <u-form-item label="支付方式" prop="payTypeName" required right-icon="arrow-right" @click.native="payTypeShow = true">
  11. <text>{{form.payTypeName}}</text>
  12. </u-form-item>
  13. <u-form-item label="学生照片" prop="imageFileId" required label-position="top">
  14. <u-upload :max-count="1" :action="uploadUrl" :header="uploadHeader" @on-success="uploadSuccess" @on-error="uploadError"
  15. @on-remove="uploadRemove" :file-list="fileList" index="1"></u-upload>
  16. </u-form-item>
  17. <u-form-item label="上传合同" prop="contractFileId" required label-position="top" v-if="payTypeCode == 1">
  18. <u-upload :max-count="1" :action="uploadUrl" :header="uploadHeader" @on-success="uploadSuccess" @on-error="uploadError"
  19. @on-remove="uploadRemove" index="2"></u-upload>
  20. </u-form-item>
  21. <u-form-item label="接收人" prop="coachName" required>
  22. <u-input v-model="form.coachName" placeholder="请输入接收人" disabled />
  23. </u-form-item>
  24. <u-form-item label="家长姓名" prop="parentsName" required>
  25. <u-input v-model="form.parentsName" placeholder="请输入家长姓名" />
  26. </u-form-item>
  27. <u-form-item label="学员姓名" prop="studentName" required>
  28. <u-input v-model="form.studentName" placeholder="请输入学员姓名" />
  29. </u-form-item>
  30. <u-form-item label="学员性别" prop="sex" required right-icon="arrow-right" @click.native="sexShow = true">
  31. <text>{{form.sex}}</text>
  32. </u-form-item>
  33. <u-form-item label="学员年龄" prop="age" required>
  34. <u-input v-model="form.age" type="number" placeholder="请输入学员年龄" />
  35. </u-form-item>
  36. <u-form-item label="学生生日" prop="birthday" required right-icon="arrow-right" @click.native="birthdayShow = true">
  37. <text>{{form.birthday}}</text>
  38. </u-form-item>
  39. <u-form-item label="手机号码" prop="phone" required>
  40. <u-input v-model="form.phone" type="number" placeholder="请输入手机号码" />
  41. </u-form-item>
  42. <u-form-item label="报名班级" prop="className" required right-icon="arrow-right" @click.native="selectClass()">
  43. <text>{{form.className}}</text>
  44. </u-form-item>
  45. <u-form-item label="课时数" prop="courseNumber" required>
  46. <u-input v-model="form.courseNumber" type="number" placeholder="请输入课时数" @blur="setCoursePrice()" />
  47. </u-form-item>
  48. <u-form-item label="课时单价" prop="coursePrice" required>
  49. <u-input v-model="form.coursePrice" type="number" placeholder="请输入课时单价" />
  50. </u-form-item>
  51. <u-form-item label="课时总价" prop="sumPrice" required>
  52. <u-input v-model="form.sumPrice" type="number" placeholder="请输入课时总价" @blur="setCoursePrice()" />
  53. </u-form-item>
  54. <u-form-item label="赠课数量">
  55. <u-input v-model="form.lessonsGiveNumber" type="number" placeholder="请输入赠课数量" />
  56. </u-form-item>
  57. <u-form-item label="赠品" label-position="top"></u-form-item>
  58. <u-form-item :label="item.name" v-for="(item, index1) in giftList" :key="index1">
  59. <u-radio-group v-model="item.value" v-if="item.type == 1">
  60. <u-radio v-for="(site, index2) in item.itemList" :key="index2" :name="site.id">
  61. {{site.name}}
  62. </u-radio>
  63. </u-radio-group>
  64. <u-checkbox-group v-model="item.value" v-else>
  65. <u-checkbox v-model="site.checked" v-for="(site, index2) in item.itemList" :key="index2" :name="site.id">
  66. {{site.name}}
  67. </u-checkbox>
  68. </u-checkbox-group>
  69. </u-form-item>
  70. <u-form-item label="销售员" prop="saleName" required right-icon="arrow-right" @click.native="saleShow = true">
  71. <text>{{form.saleName}}</text>
  72. </u-form-item>
  73. <u-form-item label="谈单人" prop="talkerName" required right-icon="arrow-right" @click.native="talkerShow = true">
  74. <text>{{form.talkerName}}</text>
  75. </u-form-item>
  76. <u-form-item label="备注">
  77. <u-input v-model="form.remark" type="textarea" placeholder="请输入备注" auto-height :height="100" />
  78. </u-form-item>
  79. </u-form>
  80. <u-action-sheet :list="sexList" v-model="sexShow" @click="setSex"></u-action-sheet>
  81. <u-picker v-model="birthdayShow" mode="time" :params="birthdayParams" @confirm="setBirthday"></u-picker>
  82. <u-picker mode="selector" v-model="classShow" :range="classList" range-key="name" @confirm="setClass"></u-picker>
  83. <u-picker mode="selector" v-model="saleShow" :range="saleList" range-key="name" @confirm="setSale"></u-picker>
  84. <u-picker mode="selector" v-model="talkerShow" :range="talkerList" range-key="name" @confirm="setTalker"></u-picker>
  85. <u-picker mode="selector" v-model="payTypeShow" :range="payTypeList" range-key="name" @confirm="setPayType"></u-picker>
  86. <view class="handle-fix-box">
  87. <u-button type="warning" shape="circle" :ripple="true" :custom-style="customStyle" @click="submitForm()">提交</u-button>
  88. </view>
  89. <u-top-tips ref="uTips"></u-top-tips>
  90. </view>
  91. </template>
  92. <script>
  93. import {
  94. mapGetters
  95. } from 'vuex'
  96. const NET = require('@/utils/request')
  97. const API = require('@/config/api')
  98. export default {
  99. computed: {
  100. ...mapGetters([
  101. 'customStyle',
  102. ])
  103. },
  104. data() {
  105. return {
  106. uploadUrl: API.uploadFile,
  107. uploadHeader: {
  108. Authorization: uni.getStorageSync('token')
  109. },
  110. payTypeCode: '',
  111. fileList: [],
  112. form: {
  113. imageFileId: '',
  114. contractFileId: '',
  115. coachName: '',
  116. parentsName: '',
  117. studentName: '',
  118. sex: '',
  119. age: '',
  120. birthday: '',
  121. phone: '',
  122. classId: '',
  123. className: '',
  124. courseNumber: '',
  125. coursePrice: '',
  126. sumPrice: '',
  127. orderNo: '',
  128. lessonsGiveNumber: '',
  129. giftId: [],
  130. saleId: '',
  131. saleName: '',
  132. talkerId: '',
  133. talkerName: '',
  134. payTypeId: '',
  135. payTypeName: '',
  136. remark: '',
  137. },
  138. rules: {
  139. coachName: [{
  140. required: true,
  141. message: '请输入接收人',
  142. trigger: 'change'
  143. }],
  144. parentsName: [{
  145. required: true,
  146. message: '请输入家长姓名',
  147. trigger: 'change'
  148. }],
  149. studentName: [{
  150. required: true,
  151. message: '请输入学员姓名',
  152. trigger: 'change'
  153. }],
  154. sex: [{
  155. required: true,
  156. message: '请选择学员性别',
  157. trigger: 'change'
  158. }],
  159. age: [{
  160. required: true,
  161. message: '请输入学员年龄',
  162. trigger: 'change'
  163. }],
  164. birthday: [{
  165. required: true,
  166. message: '请选择学生生日',
  167. trigger: 'change'
  168. }],
  169. phone: [{
  170. required: true,
  171. message: '请输入手机号码',
  172. trigger: 'change'
  173. },
  174. {
  175. pattern: /^1[0-9]{10}$/g,
  176. transform(value) {
  177. return String(value);
  178. },
  179. message: '请输入正确格式的手机号码'
  180. },
  181. ],
  182. className: [{
  183. required: true,
  184. message: '请选择报名班级',
  185. trigger: 'change'
  186. }],
  187. courseNumber: [{
  188. required: true,
  189. message: '请输入课时数',
  190. trigger: 'change'
  191. }],
  192. coursePrice: [{
  193. required: true,
  194. message: '请输入课时单价',
  195. trigger: 'change'
  196. }],
  197. sumPrice: [{
  198. required: true,
  199. message: '请输入课时总价',
  200. trigger: 'change'
  201. }],
  202. orderNo: [{
  203. required: true,
  204. message: '请输入订单号',
  205. trigger: 'change'
  206. }],
  207. saleName: [{
  208. required: true,
  209. message: '请选择销售员',
  210. trigger: 'change'
  211. }],
  212. talkerName: [{
  213. required: true,
  214. message: '请选择谈单人',
  215. trigger: 'change'
  216. }],
  217. payTypeName: [{
  218. required: true,
  219. message: '请选择支付方式',
  220. trigger: 'change'
  221. }],
  222. },
  223. sexShow: false,
  224. sexList: [{
  225. text: '男'
  226. },
  227. {
  228. text: '女'
  229. }
  230. ],
  231. birthdayShow: false,
  232. birthdayParams: {
  233. year: true,
  234. month: true,
  235. day: true,
  236. hour: false,
  237. minute: false,
  238. second: false
  239. },
  240. classShow: false,
  241. classList: [],
  242. giftList: [],
  243. saleShow: false,
  244. saleList: [],
  245. talkerShow: false,
  246. talkerList: [],
  247. payTypeShow: false,
  248. payTypeList: [],
  249. }
  250. },
  251. onShow() {
  252. if (uni.getStorageSync("defaultClass")) {
  253. this.form.classId = uni.getStorageSync("defaultClass").classId
  254. this.form.className = uni.getStorageSync("defaultClass").className
  255. }
  256. },
  257. onReady() {
  258. this.form.coachName = uni.getStorageSync('userData').nickName
  259. this.$refs.form.setRules(this.rules);
  260. NET.request(API.getClassList, {
  261. page: 1,
  262. size: 1000,
  263. }, 'POST').then(res => {
  264. this.classList = res.data.row
  265. }).catch(error => {
  266. this.$refs.uTips.show({
  267. title: error.message,
  268. type: 'warning',
  269. })
  270. })
  271. NET.request(API.getGiftList, {}, 'POST').then(res => {
  272. res.data.forEach(item => {
  273. if (item == 1) {
  274. item.value = ''
  275. } else {
  276. item.itemList.forEach(site => {
  277. site.checked = false
  278. })
  279. }
  280. })
  281. this.giftList = res.data
  282. }).catch(error => {
  283. this.$refs.uTips.show({
  284. title: error.message,
  285. type: 'warning',
  286. })
  287. })
  288. NET.request(API.getSaleList, {
  289. page: 1,
  290. size: 1000,
  291. }, 'POST').then(res => {
  292. this.saleList = res.data.row
  293. }).catch(error => {
  294. this.$refs.uTips.show({
  295. title: error.message,
  296. type: 'warning',
  297. })
  298. })
  299. NET.request(API.getTalkerList, {
  300. page: 1,
  301. size: 1000,
  302. }, 'POST').then(res => {
  303. this.talkerList = res.data.row
  304. }).catch(error => {
  305. this.$refs.uTips.show({
  306. title: error.message,
  307. type: 'warning',
  308. })
  309. })
  310. NET.request(API.getPayTypeList, {}, 'POST').then(res => {
  311. this.payTypeList = res.data
  312. }).catch(error => {
  313. this.$refs.uTips.show({
  314. title: error.message,
  315. type: 'warning',
  316. })
  317. })
  318. },
  319. methods: {
  320. // 扫码二维码
  321. scanQRCode() {
  322. uni.scanCode({
  323. onlyFromCamera: true,
  324. success: (res) => {
  325. NET.request(API.getQrCodeInfo, {
  326. orderNo: res.result
  327. }, 'POST').then(res => {
  328. this.form.imageFileId = res.data.imageFileId
  329. this.fileList = [{
  330. url: res.data.imageFileUrl
  331. }]
  332. this.form.parentsName = res.data.parentsName
  333. this.form.studentName = res.data.studentName
  334. this.form.sex = res.data.sex
  335. this.form.age = res.data.age
  336. this.form.birthday = res.data.birthday
  337. this.form.phone = res.data.phone
  338. this.form.payTypeId = res.data.payTypeId
  339. this.form.payTypeName = res.data.payTypeName
  340. this.form.orderNo = res.data.orderNo
  341. }).catch(error => {
  342. this.$refs.uTips.show({
  343. title: error.message,
  344. type: 'warning',
  345. })
  346. })
  347. }
  348. });
  349. },
  350. // 文件上传成功回调
  351. uploadSuccess(res, index, lists, name) {
  352. if (name == 1) {
  353. this.form.imageFileId = res.data.id
  354. } else if (name == 2) {
  355. this.form.contractFileId = res.data.id
  356. }
  357. this.$refs.uTips.show({
  358. title: '文件上传成功',
  359. type: 'success',
  360. })
  361. return true
  362. },
  363. // 文件上传失败回调
  364. uploadError(res, index, lists, name) {
  365. this.$refs.uTips.show({
  366. title: error.message,
  367. type: 'warning',
  368. })
  369. },
  370. // 移除文件回调
  371. uploadRemove(index, lists, name) {
  372. if (name == 1) {
  373. this.form.imageFileId = ''
  374. } else if (name == 2) {
  375. this.form.contractFileId = ''
  376. }
  377. },
  378. // 设置性别
  379. setSex(index) {
  380. this.form.sex = this.sexList[index].text
  381. },
  382. // 设置生日
  383. setBirthday(object) {
  384. this.form.birthday = object.year + '-' + object.month + '-' + object.day
  385. },
  386. // 跳转班级列表
  387. selectClass() {
  388. uni.navigateTo({
  389. url: '/pagesEnroll/classList'
  390. });
  391. },
  392. // 设置报名班级
  393. setClass(object) {
  394. this.form.classId = this.classList[object[0]].id
  395. this.form.className = this.classList[object[0]].name
  396. },
  397. // 设置销售员
  398. setSale(object) {
  399. this.form.saleId = this.saleList[object[0]].id
  400. this.form.saleName = this.saleList[object[0]].name
  401. },
  402. // 设置谈单人
  403. setTalker(object) {
  404. this.form.talkerId = this.talkerList[object[0]].id
  405. this.form.talkerName = this.talkerList[object[0]].name
  406. },
  407. // 设置支付方式
  408. setPayType(object) {
  409. this.form.payTypeId = this.payTypeList[object[0]].id
  410. this.form.payTypeName = this.payTypeList[object[0]].name
  411. this.payTypeCode = this.payTypeList[object[0]].other
  412. },
  413. // 设置总价
  414. setCoursePrice() {
  415. if (this.form.courseNumber && this.form.sumPrice) {
  416. this.form.coursePrice = (this.form.sumPrice / this.form.courseNumber).toFixed(2)
  417. }
  418. },
  419. // 提交表单
  420. submitForm() {
  421. this.$refs.form.validate(valid => {
  422. if (valid) {
  423. let giftId = []
  424. this.giftList.forEach(item => {
  425. if (item.type == 1 && item.value) {
  426. giftId.push(item.value)
  427. } else if (item.type == 0) {
  428. giftId = giftId.concat(item.itemList.filter(site => site.checked).map(site => {
  429. return site.id
  430. }))
  431. }
  432. })
  433. NET.request(API.submitEnrolledForm, {
  434. ...this.form,
  435. giftId: giftId
  436. }, 'POST').then(res => {
  437. this.$refs.uTips.show({
  438. title: '提交成功',
  439. type: 'success',
  440. })
  441. setTimeout(() => {
  442. uni.navigateBack()
  443. }, 1000)
  444. }).catch(error => {
  445. this.$refs.uTips.show({
  446. title: error.message,
  447. type: 'warning',
  448. })
  449. })
  450. }
  451. });
  452. },
  453. },
  454. }
  455. </script>
  456. <style>
  457. page {
  458. width: 100%;
  459. height: 100%;
  460. position: relative;
  461. }
  462. </style>
  463. <style lang="scss" scoped>
  464. @import "@/static/css/themes.scss";
  465. .content {
  466. width: 100%;
  467. float: left;
  468. padding: 0 15px 60px 15px;
  469. box-sizing: border-box;
  470. }
  471. </style>