create.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511
  1. <template>
  2. <view class="page">
  3. <view class="form">
  4. <u-form :model="form" ref="uForm">
  5. <u-form-item label-width="150" label="成交楼盘" prop="deal_item" required>
  6. <u-input placeholder="请输入成交楼盘" v-model="form.deal_item" type="text"></u-input>
  7. </u-form-item>
  8. <u-form-item label-width="150" label="成交房号" prop="house_no" required>
  9. <u-input placeholder="请输入成交房号" v-model="form.house_no" type="text"></u-input>
  10. </u-form-item>
  11. <u-form-item label-width="150" label="房屋类型" prop="house_type" required>
  12. <u-radio-group v-model="form.house_type" active-color="#2979ff">
  13. <u-radio :name="HT.val" v-for="HT in houseTypeList" :key="HT.val">{{HT.key}}</u-radio>
  14. </u-radio-group>
  15. </u-form-item>
  16. <u-form-item label-width="150" label="成交店员" prop="deal_clerk" required>
  17. <u-input placeholder="请输入成交店员" v-model="form.deal_clerk" type="text"></u-input>
  18. </u-form-item>
  19. <u-form-item label-width="150" label="成交类型" prop="deal_type" required>
  20. <u-radio-group v-model="form.deal_type" active-color="#2979ff">
  21. <u-radio :name="DT.val" v-for="DT in dealTypeList" :key="DT.val">{{DT.key}}</u-radio>
  22. </u-radio-group>
  23. </u-form-item>
  24. <u-form-item label-width="150" label="所属门店" prop="store_type" required>
  25. <u-radio-group v-model="form.store_type" active-color="#2979ff">
  26. <u-radio :name="DT.val" v-for="DT in storeTypeList" :key="DT.val">{{DT.key}}</u-radio>
  27. </u-radio-group>
  28. </u-form-item>
  29. <u-form-item label-width="150" label="成交日期" prop="deal_at" @click.native="openDealAtPopoup" required>
  30. <view class="scoped-input-floor" @click.native="openDealAtPopoup"></view>
  31. <u-input placeholder="请选择成交日期" v-model="form.deal_at" disabled type="text"></u-input>
  32. </u-form-item>
  33. <u-form-item label-width="150" label="客户姓名" prop="customer_name" required>
  34. <u-input placeholder="请输入客户姓名" v-model="form.customer_name" type="text"></u-input>
  35. </u-form-item>
  36. <u-form-item label-width="150" label="手机号" prop="customer_phone" required>
  37. <u-input placeholder="请输入手机号" v-model="form.customer_phone" type="number"></u-input>
  38. </u-form-item>
  39. <u-form-item label-width="150" label="面积" prop="area" required>
  40. <u-input placeholder="请输入面积" v-model="form.area" type="text"></u-input>
  41. <template v-slot:right>
  42. </template>
  43. </u-form-item>
  44. <u-form-item label-width="150" label="总价" prop="price" required>
  45. <u-input placeholder="请输入总价" v-model="form.price" type="text"></u-input>
  46. <template v-slot:right>
  47. </template>
  48. </u-form-item>
  49. <u-form-item label-width="150" label="报备渠道" prop="report_dept" required>
  50. <u-input placeholder="请输入报备渠道" v-model="form.report_dept" type="text"></u-input>
  51. </u-form-item>
  52. <u-form-item label-width="150" label="折扣体系" prop="discount">
  53. <u-input placeholder="请输入折扣体系" v-model="form.discount" type="text"></u-input>
  54. </u-form-item>
  55. <u-form-item label-width="150" label="佣金" prop="brokerage">
  56. <u-input placeholder="请输入佣金" v-model="form.brokerage" type="text"></u-input>
  57. </u-form-item>
  58. <u-form-item label-position="top" label-width="150" label="佣金凭证" prop="brokerage_img">
  59. <view class="id_card" @click="uploadbrokerageImgImage">
  60. <u-icon v-if="form.brokerage_img == null" name="plus" size="32" color="#606266"></u-icon>
  61. <text v-if="form.brokerage_img == null">请先上传佣金凭证照片</text>
  62. <image v-if="form.brokerage_img != null" :src="brokerage_img" mode="aspectFill"></image>
  63. </view>
  64. </u-form-item>
  65. <u-form-item label-width="150" label="返佣" prop="rebate">
  66. <u-input placeholder="请输入返佣" v-model="form.rebate" type="text"></u-input>
  67. </u-form-item>
  68. <u-form-item label-width="150" label="备注信息" prop="remark" label-position="top">
  69. <u-input placeholder="备注信息" v-model="form.remark" type="textarea"></u-input>
  70. </u-form-item>
  71. </u-form>
  72. <u-gap height="60"></u-gap>
  73. <u-button type="primary" :diabled="submitButtonDisabled" @click="submitHandle">提交</u-button>
  74. </view>
  75. <!-- 列表选择 -->
  76. <u-select mode="single-column" :list="propertySelectList" v-model="propertySelectShow" @confirm="propertySelectConfirm"></u-select>
  77. <u-select mode="single-column" :list="salerSelectList" v-model="salerSelectShow" @confirm="salerSelectConfirm"></u-select>
  78. <!-- modal -->
  79. <u-modal v-model="submitModalShow" content="请务必仔细确认各项信息是否正确" :show-cancel-button="true" @confirm="submit()"></u-modal>
  80. <u-modal v-model="modalShow" :content="modalContent" :show-cancel-button="true" @cancel="modalCancel()" @confirm="modalConfirm()"></u-modal>
  81. <u-calendar v-model="dealAtShow" :mode="calendarMode" @change="dealAtChange"></u-calendar>
  82. <!-- utoast -->
  83. <u-toast ref="uToast" />
  84. </view>
  85. </template>
  86. <script>
  87. export default {
  88. data() {
  89. const userInfo = uni.getStorageSync('MD_userInfo2')
  90. return {
  91. brokerage_img: '',
  92. dealAtShow: false,
  93. calendarMode: 'date',
  94. isEdit: false,
  95. form: {
  96. deal_item: '',
  97. house_no: '',
  98. house_type: '1',
  99. deal_clerk: userInfo.nickname,
  100. deal_type: '1',
  101. store_type: '其它',
  102. deal_at: '',
  103. customer_name: '',
  104. customer_phone: '',
  105. area: '',
  106. price: '',
  107. report_dept: '',
  108. discount: '',
  109. brokerage: '',
  110. rebate: '',
  111. brokerage_img: null,
  112. remark: null
  113. },
  114. submitButtonDisabled: true,
  115. rules: {
  116. deal_item: [
  117. {
  118. required: true,
  119. message: '成交楼盘不得为空',
  120. trigger: ['change', 'blur']
  121. },
  122. ],
  123. house_no: [
  124. {
  125. required: true,
  126. message: '成交房号不得为空',
  127. trigger: ['change', 'blur']
  128. },
  129. ],
  130. house_type: [
  131. {
  132. required: true,
  133. message: '房屋类型不得为空',
  134. trigger: ['change', 'blur']
  135. },
  136. ],
  137. deal_clerk: [
  138. {
  139. required: true,
  140. message: '成交店员不得为空',
  141. trigger: ['change', 'blur']
  142. },
  143. ],
  144. deal_type: [
  145. {
  146. required: true,
  147. message: '成交类型不得为空',
  148. trigger: ['change', 'blur']
  149. },
  150. ],
  151. store_type: [
  152. {
  153. required: true,
  154. message: '所属门店不得为空',
  155. trigger: ['change', 'blur']
  156. },
  157. ],
  158. deal_at: [
  159. {
  160. required: true,
  161. message: '成交日期不得为空',
  162. trigger: ['change', 'blur']
  163. },
  164. ],
  165. customer_name: [
  166. {
  167. required: true,
  168. message: '客户姓名不得为空',
  169. trigger: ['change', 'blur']
  170. },
  171. ],
  172. customer_phone: [
  173. {
  174. required: true,
  175. message: '客户手机号不得为空',
  176. trigger: ['change', 'blur']
  177. },
  178. // 11个字符判断
  179. {
  180. len: 11,
  181. message: '手机号格式不正确',
  182. trigger: ['change', 'blur']
  183. },
  184. ],
  185. area: [
  186. {
  187. required: true,
  188. message: '面积不得为空',
  189. trigger: ['change', 'blur']
  190. },
  191. ],
  192. price: [
  193. {
  194. required: true,
  195. message: '总价不得为空',
  196. trigger: ['change', 'blur']
  197. },
  198. ],
  199. report_dept: [
  200. {
  201. required: true,
  202. message: '报备渠道不得为空',
  203. trigger: ['change', 'blur']
  204. },
  205. ],
  206. },
  207. recordLevelList: [],
  208. propertySelectShow: false,
  209. propertySelectList: [],
  210. salerSelectShow: false,
  211. salerSelectList: [],
  212. submitModalShow: false,
  213. modalShow: false,
  214. modalContent: '',
  215. houseTypeList: [],
  216. dealTypeList: [],
  217. storeTypeList: [],
  218. };
  219. },
  220. onLoad(data) {
  221. const that = this
  222. const eventChannel = that.getOpenerEventChannel(); // that 需指向 this
  223. // 监听data事件,获取上一页面通过eventChannel.emit传送到当前页面的数据
  224. if (eventChannel.on) {
  225. eventChannel.on('data', data => {
  226. if (data) {
  227. that.form.deal_item = data.info.deal_item;
  228. that.form.house_no = data.info.house_no;
  229. that.form.house_type = data.info.house_type;
  230. that.form.deal_clerk = data.info.deal_clerk;
  231. that.form.deal_type = data.info.deal_type;
  232. that.form.store_type = data.info.store_type;
  233. that.form.deal_at = data.info.deal_at;
  234. that.form.customer_name = data.info.customer_name;
  235. that.form.customer_phone = data.info.customer_phone;
  236. that.form.area = String(data.info.area);
  237. that.form.price = String(data.info.price);
  238. that.form.report_dept = data.info.report_dept;
  239. that.form.discount = data.info.discount;
  240. that.form.brokerage = data.info.brokerage;
  241. that.form.rebate = data.info.rebate;
  242. that.brokerage_img = that.form.brokerage_img = data.info.brokerage_img;
  243. that.form.remark = data.info.remark;
  244. that.form.id = data.info.id;
  245. that.isEdit = true
  246. wx.setNavigationBarTitle({
  247. title: `编辑成交单-${data.info.deal_item}(${data.info.house_no})`
  248. })
  249. }
  250. })
  251. }
  252. },
  253. created () {
  254. const dictObj = uni.getStorageSync('MD_dict')
  255. this.houseTypeList = dictObj.trade_house_type || []
  256. this.dealTypeList = dictObj.trade_deal_type || []
  257. this.storeTypeList = dictObj.store_type || []
  258. },
  259. // 必须要在onReady生命周期,因为onLoad生命周期组件可能尚未创建完毕
  260. onReady() {
  261. this.$refs.uForm.setRules(this.rules);
  262. },
  263. methods: {
  264. uploadImgHandle (bc) {
  265. uni.chooseImage({
  266. count: 1,
  267. sizeType: ['compressed'],
  268. success: function(res) {
  269. const filePath = res.tempFilePaths[0];
  270. let token = uni.getStorageSync('MD_token') || ''
  271. uni.uploadFile({
  272. url: uni.baseUrl + 'api/upload/cloud',
  273. filePath,
  274. name: 'upload',
  275. formData: {
  276. 'token': token
  277. },
  278. success: (f) => {
  279. const cData = JSON.parse(f.data)
  280. if (cData.errno === 0) {
  281. if (bc && typeof(bc) === 'function') bc(cData.data)
  282. } else {
  283. uni.$msg(cData.errmsg || `未知错误-${cData.errno}`)
  284. }
  285. }
  286. })
  287. }
  288. })
  289. },
  290. // 选择、验证、上传正面照片
  291. uploadbrokerageImgImage() {
  292. this.uploadImgHandle((d) => {
  293. this.form.brokerage_img = d.url
  294. // this.brokerage_img = d.pub_url
  295. this.brokerage_img = d.url
  296. })
  297. },
  298. openDealAtPopoup () {
  299. console.log('成交日期成交日期')
  300. this.dealAtShow = true
  301. },
  302. dealAtChange (e) {
  303. this.form.deal_at = e.result || ''
  304. },
  305. // 选择所属项目回调
  306. propertySelectConfirm(e) {
  307. e.map((val, index) => {
  308. this.form.estate_id = val.value;
  309. this.form.estate_name = val.label;
  310. });
  311. },
  312. submitHandle() {
  313. const that = this
  314. this.$refs.uForm.validate(valid => {
  315. if (valid) {
  316. // 验证成功
  317. let apiStr = 'apitradeadd'
  318. let params = {
  319. deal_item: that.form.deal_item,
  320. house_no: that.form.house_no,
  321. house_type: that.form.house_type,
  322. deal_clerk: that.form.deal_clerk,
  323. deal_type: that.form.deal_type,
  324. store_type: that.form.store_type,
  325. deal_at: that.form.deal_at,
  326. customer_name: that.form.customer_name,
  327. customer_phone: that.form.customer_phone,
  328. price: that.form.price,
  329. area: that.form.area,
  330. report_dept: that.form.report_dept,
  331. discount: that.form.discount,
  332. brokerage: that.form.brokerage,
  333. rebate: that.form.rebate,
  334. brokerage_img: that.form.brokerage_img,
  335. remark: that.form.remark
  336. }
  337. if(that.isEdit) {
  338. apiStr = 'apitradeedit'
  339. params.id = that.form.id
  340. }
  341. uni.api.cust[apiStr](params).then(res => {
  342. if (that.isEdit) {
  343. uni.$msgConfirm('编辑成功', () => {
  344. uni.reLaunch({
  345. url: '/pages/trade/list'
  346. })
  347. }, () => {
  348. uni.reLaunch({
  349. url: '/pages/trade/list'
  350. })
  351. })
  352. } else {
  353. uni.$msgConfirm('添加成功,是否前往成交单列表?', () => {
  354. uni.reLaunch({
  355. url: '/pages/trade/list'
  356. })
  357. }, () => {
  358. const userInfo = uni.getStorageSync('MD_userInfo2')
  359. this.form = {
  360. deal_item: '',
  361. house_no: '',
  362. house_type: '1',
  363. deal_clerk: userInfo.nickname,
  364. deal_type: '1',
  365. store_type: '其它',
  366. deal_at: '',
  367. customer_name: '',
  368. customer_phone: '',
  369. area: '',
  370. price: '',
  371. report_dept: '',
  372. discount: '',
  373. brokerage: '',
  374. rebate: '',
  375. brokerage_img: null,
  376. remark: null
  377. }
  378. })
  379. }
  380. })
  381. } else {
  382. console.log('验证失败');
  383. }
  384. });
  385. },
  386. // 获取手机号
  387. getPhoneNumber: function(e) {
  388. // 点击获取手机号码按钮
  389. let _that = this;
  390. if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
  391. _that.$refs.uToast.show({
  392. title: '您可以在个人设置中再次绑定',
  393. type: 'warning'
  394. });
  395. setTimeout(() => {
  396. _that.reLunchUser();
  397. }, 1500);
  398. return; // 即用户拒绝授权
  399. }
  400. console.log(e.detail.errMsg);
  401. console.log(e.detail.iv);
  402. console.log(e.detail.encryptedData);
  403. let iv = e.detail.iv;
  404. let encryptedData = e.detail.encryptedData;
  405. // 不是登陆完第一时间授权
  406. wx.login({
  407. success(res) {
  408. if (res.code) {
  409. // 设置用户手机号
  410. _that.setUserPhoneNumber(encryptedData, iv, res.code);
  411. } else {
  412. this.$refs.uToast.show({
  413. title: res.errMsg,
  414. type: 'warning'
  415. });
  416. console.log('登录失败!' + res.errMsg);
  417. }
  418. }
  419. });
  420. },
  421. // 以下是工具函数
  422. // 关闭键盘
  423. hideKeyboard() {
  424. uni.hideKeyboard();
  425. },
  426. // 格式化日期的月份或天数的显示(小于10,在前面增加0)
  427. getFormatDate(value) {
  428. if (value == undefined || value == '') {
  429. return '';
  430. }
  431. var str = value;
  432. if (parseInt(value) < 10) {
  433. str = '0' + value;
  434. }
  435. return str;
  436. }
  437. }
  438. };
  439. </script>
  440. <style lang="scss">
  441. .page {
  442. padding: 20rpx;
  443. background-color: #ffffff;
  444. }
  445. .form {
  446. border-radius: 10rpx;
  447. padding: 0 40rpx;
  448. }
  449. .popup-body {
  450. .tips-title {
  451. font-size: $u-p;
  452. margin-bottom: 20rpx;
  453. }
  454. .tips-content {
  455. font-size: $u-p2;
  456. color: $u-tips-color;
  457. margin-bottom: 60rpx;
  458. }
  459. }
  460. .id_card {
  461. color: #606266;
  462. width: 100%;
  463. height: 350rpx;
  464. display: flex;
  465. flex-direction: column;
  466. align-items: center;
  467. justify-content: center;
  468. background-color: #f4f5f6;
  469. font-size: $u-p2;
  470. }
  471. .footer {
  472. position: absolute;
  473. text-align: center;
  474. bottom: 40rpx;
  475. font-size: $u-p2;
  476. .agreement {
  477. color: $u-type-error;
  478. }
  479. }
  480. .slot-content {
  481. font-size: 28rpx;
  482. color: $u-content-color;
  483. padding: 20rpx;
  484. }
  485. .scoped-input-floor {
  486. position: absolute;
  487. left: 0;
  488. top: 0;
  489. width: 100%;
  490. height: 100%;
  491. background: transparent;
  492. z-index: 9;
  493. }
  494. </style>