37411876339393bca21f6d4fa2d87cf2d594b12a.svn-base 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <template>
  2. <a-modal
  3. :title="title"
  4. :width="1200"
  5. :visible="visible"
  6. :destroyOnClose="true"
  7. :maskClosable="false"
  8. :confirmLoading="confirmLoading"
  9. @ok="handleOk"
  10. @cancel="handleCancel">
  11. <a-spin :spinning="confirmLoading">
  12. <a-form-model ref="form" :label-col="labelCol" :wrapper-col="wrapperCol" :model="model" >
  13. <!-- 主表单区域 -->
  14. <a-row class="form-row" :gutter="0">
  15. <a-col :lg="8">
  16. <a-form-model-item label="订单号" prop="orderCode" :rules="[{ required: true, message: '请输入订单号!' }]">
  17. <a-input placeholder="请输入订单号" v-model="model.orderCode"/>
  18. </a-form-model-item>
  19. </a-col>
  20. <a-col :lg="8">
  21. <a-form-model-item label="订单类型">
  22. <a-select placeholder="请选择订单类型" v-model="model.ctype">
  23. <a-select-option value="1">国内订单</a-select-option>
  24. <a-select-option value="2">国际订单</a-select-option>
  25. </a-select>
  26. </a-form-model-item>
  27. </a-col>
  28. <a-col :lg="8">
  29. <a-form-model-item label="订单日期">
  30. <a-date-picker showTime valueFormat="YYYY-MM-DD HH:mm:ss" style="width: 100%" v-model="model.orderDate"/>
  31. </a-form-model-item>
  32. </a-col>
  33. </a-row>
  34. <a-row class="form-row" :gutter="0">
  35. <a-col :lg="8">
  36. <a-form-model-item label="订单金额">
  37. <a-input-number placeholder="请输入订单金额" style="width: 100%" v-model="model.orderMoney"/>
  38. </a-form-model-item>
  39. </a-col>
  40. <a-col :lg="8">
  41. <a-form-model-item label="订单备注">
  42. <a-input placeholder="请输入订单备注" v-model="model.content"/>
  43. </a-form-model-item>
  44. </a-col>
  45. </a-row>
  46. </a-form-model>
  47. <!-- 子表单区域 -->
  48. <a-tabs v-model="activeKey" @change="handleChangeTabs">
  49. <a-tab-pane tab="客户信息" key="1" :forceRender="true">
  50. <j-vxe-table
  51. ref="editableTable1"
  52. toolbar
  53. row-number
  54. row-selection
  55. keep-source
  56. :height="300"
  57. :loading="table1.loading"
  58. :dataSource="table1.dataSource"
  59. :columns="table1.columns"
  60. style="margin-top: 8px;"/>
  61. </a-tab-pane>
  62. <a-tab-pane tab="机票信息" key="2" :forceRender="true">
  63. <j-vxe-table
  64. ref="editableTable2"
  65. toolbar
  66. row-number
  67. row-selection
  68. keep-source
  69. :height="300"
  70. :loading="table2.loading"
  71. :dataSource="table2.dataSource"
  72. :columns="table2.columns"
  73. style="margin-top: 8px;"/>
  74. </a-tab-pane>
  75. </a-tabs>
  76. </a-spin>
  77. </a-modal>
  78. </template>
  79. <script>
  80. import JEditableTable from '@/components/jeecg/JEditableTable'
  81. import { VALIDATE_FAILED, getRefPromise, validateFormModelAndTables } from '@/components/jeecg/JVxeTable/utils/vxeUtils'
  82. import { httpAction, getAction } from '@/api/manage'
  83. import { JVXETypes } from '@/components/jeecg/JVxeTable'
  84. import JDate from '@/components/jeecg/JDate'
  85. export default {
  86. name: 'JeecgOrderModalForJvexTable',
  87. components: {
  88. JDate, JEditableTable
  89. },
  90. data() {
  91. return {
  92. title: '操作',
  93. visible: false,
  94. confirmLoading: false,
  95. model: {},
  96. labelCol: {
  97. xs: { span: 24 },
  98. sm: { span: 6 }
  99. },
  100. wrapperCol: {
  101. xs: { span: 24 },
  102. sm: { span: 24 - 6 }
  103. },
  104. activeKey: '1',
  105. // 客户信息
  106. table1: {
  107. loading: false,
  108. dataSource: [],
  109. columns: [
  110. {
  111. title: '客户名',
  112. key: 'name',
  113. width: '24%',
  114. type: JVXETypes.input,
  115. defaultValue: '',
  116. placeholder: '请输入${title}',
  117. validateRules: [{ required: true, message: '${title}不能为空' }]
  118. },
  119. {
  120. title: '性别',
  121. key: 'sex',
  122. width: '18%',
  123. type: JVXETypes.select,
  124. options: [ // 下拉选项
  125. { title: '男', value: '1' },
  126. { title: '女', value: '2' }
  127. ],
  128. defaultValue: '',
  129. placeholder: '请选择${title}'
  130. },
  131. {
  132. title: '身份证号',
  133. key: 'idcard',
  134. width: '24%',
  135. type: JVXETypes.input,
  136. defaultValue: '',
  137. placeholder: '请输入${title}',
  138. validateRules: [{
  139. pattern: '^\\d{6}(18|19|20)?\\d{2}(0[1-9]|1[012])(0[1-9]|[12]\\d|3[01])\\d{3}(\\d|[xX])$',
  140. message: '${title}格式不正确'
  141. }]
  142. },
  143. {
  144. title: '手机号',
  145. key: 'telphone',
  146. width: '24%',
  147. type: JVXETypes.input,
  148. defaultValue: '',
  149. placeholder: '请输入${title}',
  150. validateRules: [{
  151. pattern: '^1(3|4|5|7|8)\\d{9}$',
  152. message: '${title}格式不正确'
  153. }]
  154. }
  155. ]
  156. },
  157. // 机票信息
  158. table2: {
  159. loading: false,
  160. dataSource: [],
  161. columns: [
  162. {
  163. title: '航班号',
  164. key: 'ticketCode',
  165. width: '40%',
  166. type: JVXETypes.input,
  167. defaultValue: '',
  168. placeholder: '请输入${title}',
  169. validateRules: [{ required: true, message: '${title}不能为空' }]
  170. },
  171. {
  172. title: '航班时间',
  173. key: 'tickectDate',
  174. width: '30%',
  175. type: JVXETypes.date,
  176. placeholder: '请选择${title}',
  177. defaultValue: ''
  178. }
  179. ]
  180. },
  181. url: {
  182. add: '/test/jeecgOrderMain/add',
  183. edit: '/test/jeecgOrderMain/edit',
  184. orderCustomerList: '/test/jeecgOrderMain/queryOrderCustomerListByMainId',
  185. orderTicketList: '/test/jeecgOrderMain/queryOrderTicketListByMainId'
  186. }
  187. }
  188. },
  189. created() {
  190. },
  191. methods: {
  192. // 获取所有的editableTable实例
  193. getAllTable() {
  194. return Promise.all([
  195. getRefPromise(this, 'editableTable1'),
  196. getRefPromise(this, 'editableTable2')
  197. ])
  198. },
  199. add() {
  200. // 默认新增一条数据
  201. this.getAllTable().then(editableTables => {
  202. //editableTables[0].add()
  203. //editableTables[1].add()
  204. })
  205. this.edit({})
  206. },
  207. edit(record) {
  208. this.visible = true
  209. this.activeKey = '1'
  210. this.model = Object.assign({}, record)
  211. // 加载子表数据
  212. if (this.model.id) {
  213. let params = { id: this.model.id }
  214. this.requestTableData(this.url.orderCustomerList, params, this.table1)
  215. this.requestTableData(this.url.orderTicketList, params, this.table2)
  216. }
  217. },
  218. close() {
  219. this.visible = false
  220. this.getAllTable().then(editableTables => {
  221. this.table1.dataSource=[];
  222. this.table2.dataSource=[];
  223. })
  224. this.$emit('close')
  225. },
  226. /** 查询某个tab的数据 */
  227. requestTableData(url, params, tab) {
  228. tab.loading = true
  229. getAction(url, params).then(res => {
  230. tab.dataSource = res.result || []
  231. }).finally(() => {
  232. tab.loading = false
  233. })
  234. },
  235. handleOk() {
  236. this.validateFields()
  237. },
  238. handleCancel() {
  239. this.close()
  240. },
  241. /** ATab 选项卡切换事件 */
  242. handleChangeTabs(key) {
  243. getRefPromise(this, `editableTable${key}`).then(editableTable => {
  244. editableTable.resetScrollTop()
  245. })
  246. },
  247. /** 触发表单验证 */
  248. validateFields() {
  249. this.getAllTable().then(tables => {
  250. /** 一次性验证主表和所有的次表 */
  251. return validateFormModelAndTables(this.$refs.form,this.model, tables)
  252. }).then(allValues => {
  253. let formData = this.classifyIntoFormData(allValues)
  254. // 发起请求
  255. return this.requestAddOrEdit(formData)
  256. }).catch(e => {
  257. if (e.error === VALIDATE_FAILED) {
  258. // 如果有未通过表单验证的子表,就自动跳转到它所在的tab
  259. this.activeKey = e.index == null ? this.activeKey : (e.index + 1).toString()
  260. } else {
  261. console.error(e)
  262. }
  263. })
  264. },
  265. /** 整理成formData */
  266. classifyIntoFormData(allValues) {
  267. let orderMain = Object.assign(this.model, allValues.formValue)
  268. return {
  269. ...orderMain, // 展开
  270. jeecgOrderCustomerList: allValues.tablesValue[0].tableData,
  271. jeecgOrderTicketList: allValues.tablesValue[1].tableData
  272. }
  273. },
  274. /** 发起新增或修改的请求 */
  275. requestAddOrEdit(formData) {
  276. let url = this.url.add, method = 'post'
  277. if (this.model.id) {
  278. url = this.url.edit
  279. //method = 'put'
  280. }
  281. this.confirmLoading = true
  282. httpAction(url, formData, method).then((res) => {
  283. if (res.success) {
  284. this.$message.success(res.message)
  285. this.$emit('ok')
  286. this.close()
  287. } else {
  288. this.$message.warning(res.message)
  289. }
  290. }).finally(() => {
  291. this.confirmLoading = false
  292. })
  293. }
  294. }
  295. }
  296. </script>
  297. <style scoped>
  298. </style>