apply.vue 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <view class="content">
  3. <!-- 自定义导航 -->
  4. <view class="navbar-box">
  5. <u-navbar title="申请物资登记" :safeAreaInsetTop="true" @custom-back="leftClick"></u-navbar>
  6. </view>
  7. <view class="wrap">
  8. <u-form :model="form" ref="uForm" label-width="180">
  9. <view class="title">物资信息</view>
  10. <u-form-item label="选择物资">
  11. <view class="u-flex-1" @click="jumpPage('/pages/apply/goods/goods')"></view>
  12. <u-icon @click="jumpPage('/pages/apply/goods/goods')" name="plus" size="40"></u-icon>
  13. </u-form-item>
  14. <view class="datas">
  15. <view class="datas-item u-flex u-row-between u-border-bottom" v-for="item in form.datas" :key="item.mateId">
  16. <view class="info u-flex u-row-between u-flex-1">
  17. <view class="name">{{item.mateName}}</view>
  18. <view class="u-p-l-10 u-p-r-10">{{filterSpecName(item.specCode)}}*{{filterUnitName(item.unitCode)}}</view>
  19. </view>
  20. <view class="number u-flex">
  21. <u-input v-model="item.askforNum" type="number" :clearable="false" :border="true" />
  22. <!-- <view class="unitCode">{{filterUnitName(item.unitCode)}}</view> -->
  23. <u-icon class="u-m-l-10" name="close" @click="removeItem(item.mateId)" color="#f00"></u-icon>
  24. </view>
  25. </view>
  26. </view>
  27. <view class="title">领取信息</view>
  28. <u-form-item label="领取方式" prop="storeOutTypeName">
  29. <u-input @click="oneSelectOpen('getWay')" placeholder="请选择" v-model="form.storeOutTypeName" disabled />
  30. <u-icon name="arrow-right"></u-icon>
  31. </u-form-item>
  32. <u-form-item label="派送地址" prop="dispAddress" v-if="form.storeOutType==2">
  33. <u-input v-model="form.dispAddress" />
  34. </u-form-item>
  35. <u-form-item label="预计取货时间" prop="dispTime" v-if="form.storeOutType==1">
  36. <u-input v-model="form.dispTime" disabled @click="timeShow = true" />
  37. <u-picker v-model="timeShow" mode="time" :params="timeParams" @confirm="timeConfirm"></u-picker>
  38. </u-form-item>
  39. <u-form-item label="联系人姓名" prop="contactPerson">
  40. <u-input v-model="form.contactPerson" />
  41. </u-form-item>
  42. <u-form-item label="联系人电话" prop="contactPhone">
  43. <u-input v-model="form.contactPhone" maxlength="11" />
  44. </u-form-item>
  45. </u-form>
  46. </view>
  47. <view class="fixed-button">
  48. <u-button type="primary" @click="submit">提交申请</u-button>
  49. </view>
  50. <!-- 单列下拉选择 -->
  51. <u-select v-model="selectShow" :list="selectData" @confirm="selectConfirm"></u-select>
  52. </view>
  53. </template>
  54. <script>
  55. import {otherApiUrl} from '@/common/apiurl.js';
  56. export default {
  57. data() {
  58. return {
  59. timeShow:false,
  60. timeParams: {
  61. year: true,
  62. month: true,
  63. day: true,
  64. hour: true,
  65. minute: true,
  66. second: false,
  67. },
  68. form: {
  69. organId: '',
  70. storeOutType: "",
  71. storeOutTypeName:'',
  72. contactPerson: "",
  73. contactPhone: "",
  74. dispTime: "",
  75. dispAddress: "",
  76. datas: []
  77. },
  78. rules: {
  79. datas: [
  80. {
  81. required: true,
  82. message: '请选择物资',
  83. // 可以单个或者同时写两个触发验证方式
  84. trigger: ['change','blur'],
  85. }
  86. ],
  87. storeOutTypeName: [
  88. {
  89. required: true,
  90. message: '请选择领取方式',
  91. // 可以单个或者同时写两个触发验证方式
  92. trigger: ['change','blur'],
  93. }
  94. ],
  95. dispAddress: [
  96. {
  97. required: true,
  98. message: '请输入派送地址',
  99. trigger: ['change','blur'],
  100. }
  101. ],
  102. dispTime: [
  103. {
  104. required: true,
  105. message: '请选择取货时间',
  106. trigger: ['change','blur'],
  107. }
  108. ],
  109. contactPerson: [
  110. {
  111. required: true,
  112. message: '请输入联系人姓名',
  113. trigger: ['change','blur'],
  114. }
  115. ],
  116. contactPhone: [
  117. {
  118. required: true,
  119. message: '请输入联系人电话',
  120. trigger: ['change','blur'],
  121. },
  122. {
  123. // 自定义验证函数,见上说明
  124. validator: (rule, value, callback) => {
  125. // 上面有说,返回true表示校验通过,返回false表示不通过
  126. // this.$u.test.mobile()就是返回true或者false的
  127. return this.$u.test.mobile(value);
  128. },
  129. message: '手机号码不正确',
  130. // 触发器可以同时用blur和change
  131. trigger: ['change','blur'],
  132. }
  133. ],
  134. },
  135. selectTag: '',
  136. selectShow: false,
  137. listMap: {
  138. getWay: [],
  139. },
  140. selectData: [],
  141. unitNameList:[],
  142. specNameList:[],
  143. }
  144. },
  145. onLoad() {
  146. this.unitNameDict();
  147. this.paymentList();
  148. this.form.organId = this.user_info?.id;
  149. this.specNameDict();
  150. },
  151. onReady() {
  152. this.$refs.uForm.setRules(this.rules);
  153. },
  154. onShow() {
  155. this.form.datas = [
  156. ...this.applyList
  157. ]
  158. // console.log('this.form.datas',this.form.datas);
  159. },
  160. computed:{
  161. filterUnitName(){
  162. return function(value){
  163. let v = '';
  164. for (let i = 0; i < this.unitNameList.length; i++){
  165. // console.log('value',value);
  166. // console.log('value',this.unitNameList[i]);
  167. let item = this.unitNameList[i];
  168. if (value == item.value) {
  169. v = item.label;
  170. break;
  171. }
  172. }
  173. return v
  174. }
  175. },
  176. filterSpecName(){
  177. return function(value){
  178. let v = '';
  179. for (let i = 0; i < this.specNameList.length; i++){
  180. // console.log('value',value);
  181. // console.log('value',this.specNameList[i]);
  182. let item = this.specNameList[i];
  183. if (value == item.value) {
  184. v = item.label;
  185. break;
  186. }
  187. }
  188. return v
  189. }
  190. },
  191. },
  192. methods: {
  193. leftClick() {
  194. console.log('1111');
  195. return
  196. let canNavBack = getCurrentPages();
  197. if(canNavBack && canNavBack.length>1) {
  198. uni.navigateBack({
  199. delta: 1
  200. });
  201. } else {
  202. history.back();
  203. }
  204. },
  205. // 跳转页面
  206. jumpPage(url) {
  207. if (url) {
  208. uni.navigateTo({
  209. url: url
  210. });
  211. }
  212. },
  213. // 单列下拉选择框打开事件
  214. oneSelectOpen(key) {
  215. this.selectTag = key;
  216. this.selectData = this.listMap[key];
  217. // if(key=='actiTypeList'){
  218. // let actiTypeList = this.listMap.actiTypeList;
  219. // if(!actiTypeList||actiTypeList.length<1){
  220. // this.$refs.uToast.show({
  221. // title: '所选商品(数量)没有活动',
  222. // // type: 'error'
  223. // });
  224. // return
  225. // }
  226. // }
  227. this.selectShow = true
  228. },
  229. selectConfirm(e) {
  230. // console.log('selectConfirm',e);
  231. // console.log('selectTag', this.selectTag);
  232. switch (this.selectTag) {
  233. case 'getWay': //业务员
  234. console.log('getWay selectConfirm',e);
  235. this.form.storeOutTypeName = e[0].label;
  236. this.form.storeOutType = e[0].value;
  237. break;
  238. // case 'store': //结账方式
  239. // this.form.storeName = e[0].label;
  240. // this.form.storeId = e[0].value;
  241. // // this.$u.vuex('orderMap.payWay', e[0].value)
  242. // break;
  243. default:
  244. // console.log('3', e);
  245. }
  246. },
  247. async unitNameDict() {
  248. let { code, data, msg} = await this.$u.get(otherApiUrl.getDict + 'goods_unit_name')
  249. if(code === 200) {
  250. this.unitNameList = data.map(item => {
  251. return {
  252. label: item.dictLabel,
  253. value: item.dictValue
  254. }
  255. })
  256. }
  257. },
  258. async specNameDict() {
  259. let { code, data, msg} = await this.$u.get(otherApiUrl.getDict + 'goods_spec_name')
  260. if(code === 200) {
  261. this.specNameList = data.map(item => {
  262. return {
  263. label: item.dictLabel,
  264. value: item.dictValue
  265. }
  266. })
  267. }
  268. },
  269. async paymentList() {
  270. let { code, data, msg} = await this.$u.get(otherApiUrl.getDict + 'payment')
  271. if(code === 200) {
  272. this.listMap.getWay = data.map(item => {
  273. return {
  274. label: item.dictLabel,
  275. value: item.dictValue
  276. }
  277. })
  278. }
  279. },
  280. submit(){
  281. console.log('submit',this.form);
  282. this.$refs.uForm.validate(valid => {
  283. console.log('validvalid',valid);
  284. if (valid) {
  285. if(this.form.datas.length<1){
  286. uni.showToast({
  287. title:'请先选择物资',
  288. icon:'error'
  289. })
  290. return
  291. }
  292. this.$u.api.applyApi(this.form).then(res=>{
  293. if(res.code=='200'){
  294. this.$u.vuex('applyList', [])
  295. this.$u.route({
  296. url: 'pages/succeed/succeed',
  297. params: {
  298. tip: '申请将在24小时内进行审核,请等待!',
  299. from:'apply'
  300. }
  301. })
  302. }else{
  303. uni.showToast({
  304. title:res.msg,
  305. })
  306. }
  307. });
  308. console.log('验证通过');
  309. } else {
  310. console.log('验证失败');
  311. }
  312. });
  313. },
  314. timeConfirm(e){
  315. this.form.dispTime = `${e.year}-${e.month}-${e.day} ${e.hour}:${e.minute}:00`;
  316. // console.log('timeConfirm',e);
  317. },
  318. filterApplyList(id, list) {
  319. return list.filter(item => item.mateId != id);
  320. },
  321. removeItem(mateId){
  322. console.log('mateId',mateId);
  323. console.log('applyList',this.applyList);
  324. let tempList = this.filterApplyList(mateId,this.applyList);
  325. this.form.datas = tempList;
  326. // this.$u.vuex('applyList', tempList)
  327. }
  328. }
  329. }
  330. </script>
  331. <style lang="scss" scoped>
  332. .title{
  333. font-size: 30rpx;
  334. border-left: 2px solid;
  335. border-color: var(--main-color);
  336. padding-left: 10rpx;
  337. color: var(--main-color);
  338. font-weight: bold;
  339. margin-bottom: 24rpx;
  340. }
  341. .datas{
  342. margin-top: 24rpx;
  343. .datas-item{
  344. padding-bottom: 24rpx;
  345. margin-bottom: 24rpx;
  346. }
  347. .u-input{
  348. width: 200rpx;
  349. margin-right: 10rpx;
  350. }
  351. }
  352. </style>