addorde.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. <template>
  2. <view>
  3. <!-- 顶部选填情况 -->
  4. <step-bar :steps="steps" :datainfo="datainfo" :fixeda="fixedflag"></step-bar>
  5. <view class="ytbox" :style="fixedflag?'padding-top: 152rpx;':''">
  6. <uni-forms ref="form" class="ytforms" :rules="rules" :modelValue="datainfo">
  7. <view v-for="(ite,idx) in steps" :key="idx" @click="getInFn(ite.val)">
  8. <!-- <view class="yttit" v-if="ite.val==0" >{{ite.tit}}</view> -->
  9. <!-- <view class="ytsbox" v-if="ite.val==0" >
  10. <uni-forms-item label="姓名" required name="teacherName">
  11. <uni-easyinput :inputBorder="false" v-model="datainfo.teacherName" placeholder="来访者真实姓名">
  12. </uni-easyinput>
  13. </uni-forms-item>
  14. <uni-forms-item label="手机号" required name="teacherPhone">
  15. <uni-easyinput :inputBorder="false" @blur.stop="getBlur" type="number" v-model="datainfo.teacherPhone" placeholder="请确保手机号真实准确,以便接收短信通知">
  16. </uni-easyinput>
  17. </uni-forms-item>
  18. </view> -->
  19. <!-- 选完老师才有下面的信息 -->
  20. <view class="yttit" v-if="ite.val!=0">{{ite.tit}}</view>
  21. <view class="ytsbox boxb" v-if="ite.val==1" >
  22. <!-- 日历 -->
  23. <lunc-calendar ref="calendar" :showLunar="false" :firstDayOfWeek="firstDayOfWeek" :showMonthBg="false" :showShrink="true" :signList="signList"
  24. @dayChange="dayChange" weekType="" @monthChange="monthChange" @shrinkClick="shrinkClick">
  25. </lunc-calendar>
  26. </view>
  27. <view class="ytsbox boxa" v-if="ite.val==2" >
  28. <view class="ytst flext">
  29. <image :src="tipimg"></image>工作日上午
  30. <block v-if="amBegin">{{amBegin}}-{{amEnd}} </block>
  31. <block v-else>暂无预约时间</block>
  32. ; 下午
  33. <block v-if="pmBegin">{{pmBegin}}-{{pmEnd}}</block>
  34. <block v-else>暂无预约时间</block>
  35. </view>
  36. <view class="flexc ytime">
  37. <view class="timebtn">
  38. <picker range-key='dictLabel' :disabled="disabled" :value="timeidx" :range="timerange" @change="bindTimeChangea">
  39. <view class="flex1 " :class="timetype?'co16 fw f16':'coa f14'">{{timetype||'请选择'}}</view>
  40. </picker>
  41. </view>
  42. <image :src="rowline" class="rowline"></image>
  43. <view class="timebtn" >
  44. <picker mode ="time" :start="start" :end="endtime?endtime:end" :value="starttime" @change="bindTimeChangeb">
  45. <view class="flex1 " :class="starttime?'co16 fw f16':'coa f14'">{{starttime||'请选择时间'}}</view>
  46. </picker>
  47. </view>
  48. <image :src="rowline" class="rowline"></image>
  49. <view class="timebtn" >
  50. <picker mode ="time" :start="starttime?starttime:start" :end="end" :value="endtime" @change="bindTimeChangec">
  51. <view class="flex1" :class="endtime?'co16 fw f16':'coa f14'">{{endtime||'请选择时间 '}}</view>
  52. </picker>
  53. </view>
  54. </view>
  55. </view>
  56. <view class="ytsbox" v-if="ite.val==3" >
  57. <uni-forms-item label="姓名" required name="visitName">
  58. <uni-easyinput :inputBorder="false" v-model="datainfo.visitName" placeholder="来访者真实姓名">
  59. </uni-easyinput>
  60. </uni-forms-item>
  61. <uni-forms-item label="手机号" required name="visitPhone">
  62. <uni-easyinput :inputBorder="false" type="number" v-model="datainfo.visitPhone" placeholder="请确保手机号真实准确,以便接收短信通知">
  63. </uni-easyinput>
  64. </uni-forms-item>
  65. </uni-forms-item>
  66. <uni-forms-item label="身份证号" name="visitIdCard">
  67. <uni-easyinput :inputBorder="false" type="number" v-model="datainfo.visitIdCard" placeholder="选填"></uni-easyinput>
  68. </uni-forms-item>
  69. <uni-forms-item label="来访事由" required name="visitReason">
  70. <view class="matab">
  71. <view class="list" :class="checkidx==idx?'act':''" v-for="(ite,idx) in matterlist" :key='idx' @click="getCheck(idx)">{{ite.tit}}</view>
  72. </view>
  73. </uni-forms-item>
  74. <uni-forms-item label="补充事由" name="visitRemark">
  75. <textarea placeholder="若无选项,可补充填写" v-model="datainfo.visitRemark" placeholder-style="color:#aaa;" :auto-height="autoHeight" ></textarea>
  76. </uni-forms-item>
  77. </view>
  78. </view>
  79. </uni-forms>
  80. <view class="ybtn flexcc" @click="getSubmit" v-if="showflag">提交预约</view>
  81. <view class="ybtn btn1 flexcc" v-else>提交预约</view>
  82. <view class="tipbox">
  83. <view class="tiptit flexc">
  84. <image :src="tipimg"></image>温馨提示:
  85. </view>
  86. <view class="tiptxt">1、每日来访人数有限制,周六、周日不可预约</view>
  87. <view class="tiptxt">2、请务必确保您与被访者的手机号码准确无误;</view>
  88. <view class="tiptxt">3、预约后需得到被访者同意方可扫码进入,请注意短信接收通畅。</view>
  89. </view>
  90. <!-- 日历 -->
  91. <!-- 来访时间 -->
  92. <!-- 来访者信息 -->
  93. <!-- <picker range-key='dictLabel' :value="xkindex" :range="classval" @change='bindDateChangeb'>
  94. <uni-forms-item label="班级" required name="className">
  95. <view class="f16 flex1 txr" :class="datainfo.className?'co16':'coa'">
  96. {{datainfo.className||"请选择班级"}}
  97. </view>
  98. </uni-forms-item>
  99. </picker> -->
  100. <!-- 被访者信息 -->
  101. </view>
  102. </view>
  103. </template>
  104. <script>
  105. import stepBar from "@/work/components/stepbar/stepbar.vue"
  106. import luncCalendar from "@/work/components/lunc-calendar/lunc-calendar.vue"
  107. import {getDictionaryFn} from '@/api/mine/register.js'
  108. import {getSubscribe,getReservatAdd} from "@/api/mine/order.js"
  109. export default {
  110. components:{stepBar,luncCalendar},
  111. data(){
  112. return{
  113. tipimg:require('@/work/static/order/tip.png'),
  114. rowline:require('@/work/static/order/rowline.png'),
  115. //status: 填写状态 0:未填 1:在填 2:填完
  116. steps:[{tit:'被访信息',status:1,val:0,show:false},{tit:'来访日期',status:0,val:1,show:true},{tit:'来访时间',status:0,val:2,show:true},{tit:'来访信息',status:0,val:3,show:true}],
  117. fixedflag:true,
  118. rules: {
  119. teacherName: {rules: [{required: true,errorMessage: '请输入被访者姓名',}]},
  120. teacherPhone: {rules: [{required: true,errorMessage: '请输入被访者联系方式'},{pattern:"^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$",errorMessage: '请输入正确的联系方式'}]},
  121. visitName: {rules: [{required: true,errorMessage: '请输入来访者姓名',}]},
  122. visitPhone: {rules: [{required: true,errorMessage: '请输入来访者联系方式'},{pattern:"^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\\d{8}$",errorMessage: '请输入正确的联系方式'}]},
  123. },
  124. autoHeight:true,
  125. matterlist:[{tit:'接送学生',val:0},{tit:'办事',val:1},{tit:'会议',val:2},{tit:'其他',val:3},],
  126. timerange:[{dictLabel:'上午',dictValue:'0'},{dictLabel:'下午',dictValue:'1'}],
  127. disabled:false,
  128. timeidx:0,
  129. timetype:'',
  130. intype:0,
  131. datainfo:{
  132. 'teacherName':'',
  133. 'teacherPhone':'',
  134. 'visitName':'',
  135. 'visitPhone':'',
  136. 'visitIdCard':'',
  137. 'visitReason':'',
  138. 'visitRemark':'',
  139. },
  140. start:'',
  141. end:'',
  142. starttime:'',
  143. endtime:'',
  144. signList: [],
  145. firstDayOfWeek:'sunday',
  146. kaTime:'',
  147. visitDate:'',
  148. checkidx:-1,
  149. showflag:false,
  150. tenantId:'',
  151. amBegin:'',
  152. amEnd: '',
  153. pmBegin: '',
  154. pmEnd: '',
  155. id:'',
  156. }
  157. },
  158. watch:{
  159. intype(val){
  160. var data=this.datainfo;
  161. if(val!=0){
  162. if(data.teacherName&&data.teacherPhone) this.steps[0].status=2;
  163. else if(!data.teacherName&&!data.teacherPhone) this.steps[0].status=0;
  164. }
  165. if(val!=1){
  166. if(this.visitDate) this.steps[1].status=2;
  167. else if(!this.visitDate) this.steps[1].status=0;
  168. }
  169. if(val!=2){
  170. if(this.starttime&&this.endtime) this.steps[2].status=2;
  171. else if(!this.starttime&&!this.endtime) this.steps[2].status=0;
  172. }
  173. if(val!=3){
  174. if(data.visitName&&data.visitPhone&&data.visitReason) this.steps[3].status=2;
  175. else if(!data.visitName&&!data.visitPhone&&!data.visitReason) this.steps[3].status=0;
  176. }
  177. }
  178. },
  179. onLoad: function(e) {
  180. // this.id=e.id;
  181. this.id=this.$store.state.user.tenantId;
  182. this.datainfo.teacherPhone=this.$store.state.user.phonenumber
  183. this.datainfo.teacherName=this.$store.state.user.name
  184. this.time();
  185. this.init()
  186. },
  187. methods:{
  188. // 获取老师是否有时间
  189. getBlur(){
  190. var phone=this.datainfo.teacherPhone;
  191. if(phone){
  192. let regphone = /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/;
  193. if(!regphone.test(phone)){
  194. this.$toast('请输入正确的手机号')
  195. return
  196. }
  197. this.getTime(this.kaTime)
  198. }
  199. },
  200. getTime(data){
  201. var phone=this.datainfo.teacherPhone;
  202. var params={
  203. teacherPhone:phone,
  204. visitDate:data
  205. }
  206. getSubscribe(params).then(res=>{
  207. if(res.code==200){
  208. this.showflag=true;
  209. this.getInFn(1)
  210. this.signList=res.data.signList;
  211. this.starttime='';
  212. this.endtime='';
  213. var amBegin=res.data.reservatConfigTimeAmBegin;
  214. var amEnd=res.data.reservatConfigTimeAmEnd;
  215. var pmBegin=res.data.reservatConfigTimePmBegin;
  216. var pmEnd=res.data.reservatConfigTimePmEnd;
  217. this.amBegin=amBegin?amBegin.substring(0,5):'';
  218. this.amEnd=amEnd?amEnd.substring(0,5):'';
  219. this.pmBegin=pmBegin?pmBegin.substring(0,5):'';
  220. this.pmEnd=pmEnd?pmEnd.substring(0,5):'';
  221. if(amBegin&&pmBegin){
  222. this.timetype='上午'
  223. this.start=this.amBegin;
  224. this.end=this.amEnd;
  225. }else if(amBegin&&!pmBegin){
  226. this.disabled=true;
  227. this.timetype='上午'
  228. this.start=this.amBegin;
  229. this.end=this.amEnd;
  230. }else if(!amBegin&&pmBegin){
  231. this.disabled=true;
  232. this.timetype='下午'
  233. this.start=this.pmBegin;
  234. this.end=this.pmEnd;
  235. }
  236. if(res.data.signList&&res.data.signList.length){
  237. var newArr=res.data.signList;
  238. Object.keys(newArr).some((key) => {
  239. if (newArr[key].date == ('' + data)) {
  240. var tit=newArr[key].title
  241. if(tit=='可预约'){
  242. this.dayflag=true;
  243. this.visitDate=newArr[key].date;
  244. this.steps[1].status=2;
  245. }else{
  246. this.dayflag=false;
  247. }
  248. return true;
  249. }
  250. })
  251. }
  252. }else{
  253. this.showflag=false;
  254. this.$toast(res.msg)
  255. }
  256. })
  257. },
  258. getInFn(idx){
  259. this.intype=idx;
  260. this.steps[idx].status=1
  261. },
  262. init(){
  263. //来访事由
  264. getDictionaryFn('lf_reason').then(res=>{
  265. if(res.code==200){
  266. this.matterlist = res.data.map(v => {
  267. return {
  268. tit: v.dictLabel,
  269. val: v.dictValue
  270. }
  271. })
  272. }
  273. })
  274. },
  275. getCheck(idx){
  276. this.checkidx=idx;
  277. this.datainfo.visitReason=this.matterlist[idx].tit;
  278. },
  279. time() {
  280. var date = new Date();
  281. var y = date.getFullYear();
  282. var m = date.getMonth() + 1;
  283. var d = date.getDate();
  284. var h = date.getHours();
  285. var min = date.getMinutes();
  286. var s = date.getSeconds();
  287. var week = date.getDay(); //获取当前星期X(0-6,0代表星期天)
  288. var weeks = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
  289. var yearStr = y + '-' + (m < 10 ? ('0' + m) : m) + '-' + (d < 10 ? ('0' + d) : d)
  290. var timeStr = (h < 10 ? ('0' + h) : h) + ':' + (min < 10 ? ('0' + min) : min) + ':' + (s < 10 ? (
  291. '0' + s) : s);
  292. this.kaTime = yearStr
  293. this.getTime(yearStr)
  294. },
  295. bindTimeChangea(e){
  296. var val=e.detail.value;
  297. this.timetype=this.timerange[val].dictLabel;
  298. var tval=this.timerange[val].dictValue;
  299. if(tval==0){
  300. this.start=this.amBegin||'';
  301. this.end=this.amEnd||'';
  302. }else if(tval==1){
  303. this.start=this.pmBegin||'';
  304. this.end=this.pmEnd||'';
  305. }
  306. this.starttime='';
  307. this.endtime='';
  308. },
  309. bindTimeChangeb(e){
  310. var val=e.detail.value;
  311. this.starttime=val;
  312. },
  313. bindTimeChangec(e){
  314. var val=e.detail.value;
  315. this.endtime=val
  316. },
  317. clearboth(){
  318. this.datainfo={};
  319. this.steps[0].status=2;
  320. this.steps[1].status=2;
  321. this.steps[2].status=0;
  322. this.steps[3].status=0;
  323. this.disabled=false;
  324. this.intype=0;
  325. this.starttime='';
  326. this.endtime='';
  327. this.checkidx=-1;
  328. },
  329. getSubmit(){
  330. // this.$tab.navigateTo('/pages/order/comedetail?id=1702226196231749634')
  331. var that=this;
  332. if(!this.dayflag){
  333. this.$toast('当前时间不可预约')
  334. return
  335. }
  336. if(!this.starttime){
  337. this.$toast('请选择开始时间')
  338. return
  339. }
  340. if(!this.endtime){
  341. this.$toast('请选择结束时间')
  342. return
  343. }
  344. if(this.datainfo.visitIdCard){
  345. let _IDRe18 =
  346. /^([1-6][1-9]|50)\d{4}(18|19|20)\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
  347. let _IDre15 = /^([1-6][1-9]|50)\d{4}\d{2}((0[1-9])|10|11|12)(([0-2][1-9])|10|20|30|31)\d{3}$/
  348. // 校验身份证:
  349. if (_IDRe18.test(this.datainfo.visitIdCard) || _IDre15.test(this.datainfo.visitIdCard)) {
  350. }else{
  351. this.$toast('请输入正确身份证号')
  352. return
  353. }
  354. }
  355. if(!this.datainfo.visitReason){
  356. this.$toast('请选择来访事由')
  357. return
  358. }
  359. this.$refs.form.validate().then(res => {
  360. var params=this.datainfo;
  361. params.visitTime=this.starttime+':00'+'-'+this.endtime+':00'
  362. params.visitDate=this.visitDate
  363. params.tenantId=this.id;
  364. getReservatAdd(params).then(res=>{
  365. if(res.code==200){
  366. this.$toast('提交成功,请等待审核')
  367. setTimeout(function(){
  368. uni.$emit('refreshdatalist')
  369. uni.navigateBack({
  370. delta:1
  371. })
  372. // that.clearboth()
  373. },1500)
  374. }else{
  375. this.$toast(res.msg)
  376. }
  377. })
  378. })
  379. },
  380. dayChange(e){
  381. if(e.daySign&&e.daySign.length){
  382. var daySign=e.daySign[0];
  383. this.visitDate=daySign.date
  384. if(daySign.title=='可预约'){
  385. this.dayflag=true;
  386. }else{
  387. this.dayflag=false;
  388. }
  389. }
  390. },
  391. monthChange(e){
  392. var y=e.year;
  393. var m=e.month;
  394. var time=y + '-' + m + '-' + '01'
  395. this.getTime(time)
  396. },
  397. shrinkClick(e){
  398. },
  399. },
  400. }
  401. </script>
  402. <style lang="scss" scoped>
  403. .ytbox /deep/ .uni-forms .uni-forms-item{padding: 20rpx 16rpx 20rpx;border-bottom: 2rpx solid #E6E6E6;margin-bottom: 0;}
  404. .ytbox /deep/ .uni-forms-item__label{flex: 0 0 auto;width: auto !important;font-size: 30rpx;font-weight: bold;position: relative;color: #343434;}
  405. .ytbox /deep/ .uni-forms-item__label .is-required{position: absolute;right: 0;color: #F10C31;margin-top: 16rpx;}
  406. .ytbox /deep/ uni-textarea{flex: 1;width: auto;text-align: right;}
  407. .ytbox /deep/ .uni-textarea-placeholder{font-size: 28rpx;color: #DDDDDD !important;}
  408. .ytbox /deep/ .uni-easyinput__placeholder-class{font-size: 28rpx;color: #DDDDDD;}
  409. .ytbox /deep/ .uni-forms-item__content{display: flex;align-items: center;flex-direction: row;}
  410. .ytbox /deep/ .uni-easyinput{flex: 1;text-align: right;}
  411. .ytsbox /deep/ .uni-forms-item:last-child{border-bottom: none;}
  412. .ytbox /deep/ .uni-easyinput__content-input{font-size: 30rpx;}
  413. .ytbox /deep/ .uni-forms-item__error{margin-top:20rpx;left: auto;right: 0;}
  414. .ytbox{padding: 0rpx 0rpx 60rpx;box-sizing: border-box;min-height: auto;overflow: auto;
  415. .ytforms{}
  416. .yttit{font-size: 30rpx;font-weight: bold;background-color: #f1f1f1;
  417. color: #161616;min-height: 76rpx;display: flex;align-items: center;padding: 0rpx 60rpx;box-sizing: border-box;position: relative;
  418. &::before{content: '';width: 6rpx;height: 34rpx;background: #4775EA;border-radius: 4rpx;position: absolute;top: 50%;transform: translateY(-50%);left: 34rpx;}
  419. }
  420. .ytsbox{background-color: #ffffff;padding: 0 32rpx;
  421. &.boxa{padding: 24rpx 48rpx;}
  422. &.boxb{padding-bottom:10rpx;}
  423. .matab{display: flex;align-items: center;flex-wrap: nowrap;overflow: auto;position: absolute;left: 0;right: -48rpx;
  424. .list{min-width:126rpx;height: 56rpx;background: #F0F0F0;border-radius: 28rpx;font-size: 28rpx;font-weight: 500;
  425. color: #666666;text-align: center;line-height: 56rpx;padding: 0 24rpx;box-sizing: border-box;margin-left:16rpx;flex: 0 0 auto;
  426. &.act{background-color: #4775EA;color: #ffffff;}
  427. }
  428. }
  429. .ytst{font-size: 28rpx;font-weight: bold;color: #4775EA;margin-bottom: 28rpx;
  430. image{width: 20rpx;height: 24rpx;margin-right: 16rpx;flex: 0 0 auto;margin-top: 6rpx;}
  431. }
  432. .ytime{padding: 10rpx 0;
  433. .rowline{width: 64rpx;height: 20rpx;margin: 0 10rpx;flex: 0 0 auto;}
  434. .timebtn{flex: 1;height: 70rpx;border: 2rpx solid #4775EA;
  435. border-radius: 14rpx;text-align: center;line-height: 70rpx;box-sizing: border-box;}
  436. }
  437. }
  438. // 按钮
  439. .ybtn{width: 684rpx;height: 90rpx;background: #4775EA;border-radius: 42rpx;margin: 60rpx auto 0;font-size: 32rpx;font-weight: 500;color: #FFFFFF;
  440. &.btn1{background-color: #9a9c9e;}
  441. }
  442. // 提示
  443. .tipbox{
  444. padding:34rpx 50rpx 0;
  445. .tiptit{font-size: 26rpx;font-weight: bold;color: #343434;margin-bottom: 20rpx;
  446. image{width: 26rpx;height: 32rpx;margin-right: 18rpx;}
  447. }
  448. .tiptxt{font-size: 26rpx;font-weight: 500;color: #666666;}
  449. }
  450. }
  451. </style>