index.vue 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. <template>
  2. <div>
  3. <div class="select-layout">
  4. <p class="sub-title">
  5. <span>发票金额</span>
  6. </p>
  7. <div class="address-input-con">
  8. <div class="address-input-item">
  9. <div class="address-sub">
  10. <div class="top-title">开票金额</div>
  11. <div class="ant-input">
  12. <input v-model="amount" oninput="value=Math.max(Number(value.replace(/[^\d]/g,'')),1)" type="text" placeholder="请输入开票金额" />
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="select-layout">
  19. <p class="sub-title">
  20. <span>发票信息</span>
  21. </p>
  22. <div class="invoice-header">
  23. <label class="check-con" @click="type='geren'">
  24. <span class="check-box">
  25. <span class="checkbox-inner" :class="{'checkbox-inner-checked':type==='geren'}"></span>
  26. </span>
  27. <span>个人</span>
  28. </label>
  29. <label class="check-con" @click="type='qiye'">
  30. <span class="check-box">
  31. <span class="checkbox-inner" :class="{'checkbox-inner-checked':type==='qiye'}"></span>
  32. </span>
  33. <span>企业</span>
  34. </label>
  35. </div>
  36. <div class="address-input-con" v-if="type==='qiye'">
  37. <div class="address-input-item">
  38. <div class="address-sub">
  39. <div class="top-title">抬头名称</div>
  40. <div class="ant-input">
  41. <input v-model="tempInvoice3.title" type="text" placeholder="请输入发票抬头" />
  42. </div>
  43. </div>
  44. </div>
  45. <div class="address-input-item">
  46. <div class="address-sub">
  47. <div class="top-title">税号</div>
  48. <div class="ant-input">
  49. <input v-model="tempInvoice3.code" type="text" placeholder="请输入税务登记号" />
  50. </div>
  51. </div>
  52. </div>
  53. <div class="address-input-item">
  54. <div class="address-sub">
  55. <div class="top-title">地址</div>
  56. <div class="ant-input">
  57. <input v-model="tempInvoice3.organizedAddress" type="text" placeholder="公司地址" />
  58. </div>
  59. </div>
  60. </div>
  61. <div class="address-input-item">
  62. <div class="address-sub">
  63. <div class="top-title">电话号码</div>
  64. <div class="ant-input">
  65. <input v-model="tempInvoice3.registerPhone" type="text" placeholder="公司电话号码" />
  66. </div>
  67. </div>
  68. </div>
  69. <div class="address-input-item">
  70. <div class="address-sub">
  71. <div class="top-title">开户银行</div>
  72. <div class="ant-input">
  73. <input v-model="tempInvoice3.bankName" type="text" placeholder="开户银行" />
  74. </div>
  75. </div>
  76. </div>
  77. <div class="address-input-item">
  78. <div class="address-sub">
  79. <div class="top-title">银行账户</div>
  80. <div class="ant-input">
  81. <input v-model="tempInvoice3.bankAccount" type="text" placeholder="银行账户" />
  82. </div>
  83. </div>
  84. </div>
  85. </div>
  86. <div class="address-input-con" v-else>
  87. <div class="address-input-item">
  88. <div class="address-sub">
  89. <div class="top-title">抬头名称</div>
  90. <div class="ant-input">
  91. <input v-model="tempInvoice2.title" type="text" placeholder="发票抬头" />
  92. </div>
  93. </div>
  94. </div>
  95. <div class="address-input-item">
  96. <div class="address-sub">
  97. <div class="top-title">税号</div>
  98. <div class="ant-input">
  99. <input v-model="tempInvoice2.code" type="text" placeholder="税务登记号" />
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. </div>
  105. <div class="select-layout">
  106. <p class="sub-title">
  107. <span>收货地址</span>
  108. </p>
  109. <div class="address-input-con">
  110. <div class="address-input-item">
  111. <div class="address-sub address-name">
  112. <div class="top-title">姓名</div>
  113. <div class="ant-input">
  114. <input v-model="tempAddress.shipName" type="text" placeholder="姓名" />
  115. </div>
  116. </div>
  117. <div class="address-sub address-phone">
  118. <div class="top-title">联系电话</div>
  119. <div class="ant-input">
  120. <input v-model="tempAddress.shipMobile" type="text" placeholder="联系电话" />
  121. </div>
  122. </div>
  123. </div>
  124. <div class="address-input-item">
  125. <div class="address-sub prov-name">
  126. <div class="top-title">省份</div>
  127. <div class="ant-input prov" @click="handleSelect('prov')">
  128. {{citylist[currentPID]['p']||'省份'}}
  129. <ul v-if="prov">
  130. <li
  131. v-for="(item,i) in citylist"
  132. :key="i"
  133. @click="handleClick('currentPID',i)"
  134. >{{item.p}}</li>
  135. </ul>
  136. </div>
  137. </div>
  138. <div class="address-sub city-phone">
  139. <div class="top-title">城市</div>
  140. <div class="ant-input city" @click="handleSelect('city')">
  141. {{currentProv[currentCID]['n']||'城市'}}
  142. <ul v-if="city">
  143. <li
  144. v-for="(item,i) in currentProv"
  145. :key="i"
  146. @click="handleClick('currentCID',i)"
  147. >{{item.n}}</li>
  148. </ul>
  149. </div>
  150. </div>
  151. </div>
  152. <div class="address-input-item">
  153. <div class="address-sub">
  154. <div class="top-title">地址</div>
  155. <div class="ant-input dist" @click="handleSelect('dist')">
  156. {{currentCity[currentSID]['s']||'区/县'}}
  157. <ul v-if="dist">
  158. <li
  159. v-for="(item,i) in currentCity"
  160. :key="i"
  161. @click="handleClick('currentSID',i)"
  162. >{{item.s}}</li>
  163. </ul>
  164. </div>
  165. <div class="ant-input">
  166. <input v-model="tempAddress.shipAddress" type="text" placeholder="详细地址" />
  167. </div>
  168. </div>
  169. </div>
  170. <p class="p-dec">请务必详细填写相符无误的地址以免耽误收货</p>
  171. </div>
  172. </div>
  173. <div class="invoice-save">
  174. <button @click="saveInvoice" type="submit" class="ant-btn ant-btn-primary">
  175. <span>提 交</span>
  176. </button>
  177. <button type="submit" class="ant-btn ant-btn-primary cancel" @click="$router.back()">
  178. <span>取 消</span>
  179. </button>
  180. </div>
  181. </div>
  182. </template>
  183. <script>
  184. import { mapState } from 'vuex'
  185. import { citylist } from './city'
  186. let sle = ['prov', 'city', 'dist']
  187. export default {
  188. data () {
  189. let idArr = ['', '', '']
  190. return {
  191. type: 'geren',
  192. amount: '',
  193. tempInvoice2: {},
  194. tempInvoice3: {},
  195. tempAddress: {},
  196. citylist,
  197. prov: false,
  198. city: false,
  199. dist: false,
  200. currentPID: idArr[0] || 18,
  201. currentCID: idArr[1] || 3,
  202. currentSID: idArr[2] || 2,
  203. areaPath: ''
  204. }
  205. },
  206. computed: {
  207. ...mapState({
  208. token: state => state.user.token
  209. }),
  210. currentProv: function () {
  211. let tmp = this.citylist[this.currentPID]
  212. return tmp.c
  213. },
  214. currentCity: function () {
  215. let cprov = this.citylist[this.currentPID]
  216. let tmp = cprov.c[this.currentCID]
  217. return tmp.a
  218. }
  219. },
  220. watch: {
  221. currentProv () {
  222. this.currentCID = 0
  223. this.currentSID = 0
  224. }
  225. },
  226. methods: {
  227. handleSelect (item) {
  228. sle.forEach(i => {
  229. if (i === item) {
  230. this[i] = !this[i]
  231. } else {
  232. this[i] = false
  233. }
  234. })
  235. },
  236. handleClick (id, i) {
  237. this[id] = i
  238. this.handleChange()
  239. },
  240. handleChange () {
  241. let prov = this.citylist[this.currentPID]
  242. let city = prov.c[this.currentCID]
  243. let dist = city.a[this.currentSID]
  244. this.areaPath = [prov.p, city.n, dist.s]
  245. console.log(this.areaPath)
  246. },
  247. async saveInvoice () {
  248. let params = {}
  249. let invoiceType = ''
  250. if (this.type === 'geren') {
  251. invoiceType = 2
  252. let { title = '', code = '' } = this.tempInvoice2
  253. params = {
  254. invoiceType,
  255. title,
  256. code
  257. }
  258. } else {
  259. let {
  260. title = '',
  261. code = '',
  262. organizedAddress = '',
  263. registerPhone = '',
  264. bankName = '',
  265. bankAccount = ''
  266. } = this.tempInvoice3
  267. invoiceType = 3
  268. params = {
  269. invoiceType,
  270. title,
  271. code,
  272. organizedAddress,
  273. registerPhone,
  274. bankName,
  275. bankAccount
  276. }
  277. }
  278. let {
  279. shipName = '',
  280. shipMobile = '',
  281. shipAddress = ''
  282. } = this.tempAddress
  283. this.tempAddress.shipAreaPath = this.areaPath.join(',')
  284. this.tempAddress.amount = Number(this.amount)
  285. this.tempAddress.shipName = shipName || ''
  286. this.tempAddress.shipMobile = shipMobile || ''
  287. this.tempAddress.shipAddress = shipAddress || ''
  288. let temp = Object.keys(this.tempAddress)
  289. temp.forEach(item => {
  290. params[item] = this.tempAddress[item] || ''
  291. })
  292. console.log(params)
  293. let arr = Object.keys(params)
  294. for (let i = 0; i < arr.length; i++) {
  295. if (!params[arr[i]]) {
  296. return this.$toast.show('warn', '信息填写不能为空')
  297. }
  298. }
  299. params['cameraId'] = ''
  300. let res = await this.$http.post('/user/invoice/add', params, {
  301. headers: {
  302. token: this.token
  303. }
  304. })
  305. let response = res.data
  306. if (response.code === 0) {
  307. this.$toast.show('success', '开票成功', () => {
  308. this.$router.replace({name: 'consumption'})
  309. })
  310. } else {
  311. return this.$toast.show('warn', response.msg, () => {})
  312. }
  313. }
  314. },
  315. mounted () {
  316. this.handleChange()
  317. }
  318. }
  319. </script>
  320. <style lang="scss" scoped>
  321. @import "./style.scss";
  322. </style>