InsuranceContractForm.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534
  1. <template>
  2. <div>
  3. <zj-form-container ref="formRef" :formData="formData" :formRules="formRules">
  4. <zj-form-module title="保险基础信息" label-width="110px" :formData="formData" :formItems="formItems" :column="3">
  5. </zj-form-module>
  6. <zj-form-module title="保单内容" label-width="100px" :formData="formData" :formItems="formItems2" :column="3">
  7. </zj-form-module>
  8. <zj-form-module title="网点信息" label-width="0px" :formData="formData" :formItems="items2"> </zj-form-module>
  9. </zj-form-container>
  10. <div v-if="type === 0 || type === 1" style="text-align: right">
  11. <el-button size="mini" @click="submit">提交</el-button>
  12. <el-button size="mini" @click="reset">重置</el-button>
  13. </div>
  14. </div>
  15. </template>
  16. <script>
  17. import { insureDetail, insureAdd, insureUpdate } from '@/api/InsuranceManagement.js'
  18. import { dateFormat } from '@/utils/util'
  19. import pagingTransfer from '@/components/paging-transfer.vue'
  20. import { EventBus } from '@/utils/eventBus'
  21. import { required } from '@/components/template/rules_verify.js'
  22. import { getWebsit } from '@/api/customerManagement.js'
  23. export default {
  24. props: {
  25. type: {
  26. type: Number,
  27. default: null
  28. },
  29. item: {
  30. type: Object,
  31. default: null
  32. }
  33. },
  34. data() {
  35. return {
  36. disabled: this.type === 2,
  37. // 表单数据
  38. formData: {
  39. policyName: '',
  40. policyNumber: '',
  41. policyPrice: '',
  42. startTime: '',
  43. endTime: '',
  44. policyStartTime: '',
  45. isBuy: 'YES',
  46. company: '',
  47. text: '',
  48. month1: '',
  49. month2: '',
  50. month3: '',
  51. month4: '',
  52. month5: '',
  53. month6: '',
  54. month7: '',
  55. month8: '',
  56. month9: '',
  57. month10: '',
  58. month11: '',
  59. month12: '',
  60. policyRanges: [{ rangeName: '', rangeText: '' }],
  61. policyWebsits: []
  62. },
  63. formRules: {
  64. text: [{ required: true, message: '请输入', trigger: 'blur' }],
  65. policyName: [{ required: true, message: '请输入', trigger: 'blur' }],
  66. policyNumber: [{ required: true, message: '请输入', trigger: 'blur' }],
  67. policyPrice: [{ required: true, message: '请输入', trigger: 'blur' }],
  68. startTime: [{ required: true, message: '请输入', trigger: 'blur' }],
  69. endTime: [{ required: true, message: '请输入', trigger: 'blur' }],
  70. policyStartTime: [{ required: true, message: '请输入', trigger: 'blur' }],
  71. company: [{ required: true, message: '请输入', trigger: 'blur' }],
  72. month1: [
  73. { required: true, message: '全部必填', trigger: 'blur' },
  74. {
  75. required: true,
  76. validator: (rule, value, callback) => {
  77. if (value === '') {
  78. callback(new Error('请输入'))
  79. } else if (value > 100 || value < 0) {
  80. callback(new Error('百分比必须为0到100的数值'))
  81. } else {
  82. callback()
  83. }
  84. },
  85. trigger: 'blur'
  86. }
  87. ]
  88. },
  89. monthKeys: [
  90. 'month1',
  91. 'month2',
  92. 'month3',
  93. 'month4',
  94. 'month5',
  95. 'month6',
  96. 'month7',
  97. 'month8',
  98. 'month9',
  99. 'month10',
  100. 'month11',
  101. 'month12'
  102. ],
  103. formInline: {
  104. websitId: '',
  105. websitName: ''
  106. },
  107. itemsList: []
  108. }
  109. },
  110. computed: {
  111. formItems() {
  112. return [
  113. {
  114. name: 'el-input',
  115. attributes: { disabled: this.disabled },
  116. formItemAttributes: { label: '保单名称', prop: 'policyName' }
  117. },
  118. {
  119. name: 'el-input',
  120. attributes: { disabled: this.disabled },
  121. formItemAttributes: { label: '保单编号', prop: 'policyNumber' }
  122. },
  123. {
  124. name: 'el-input',
  125. attributes: { disabled: this.disabled },
  126. formItemAttributes: { label: '保单金额', prop: 'policyPrice' }
  127. },
  128. {
  129. name: 'el-date-picker',
  130. attributes: { disabled: this.disabled, type: 'date', style: { width: '100%' } },
  131. formItemAttributes: { label: '生效时间', prop: 'startTime' }
  132. },
  133. {
  134. name: 'el-date-picker',
  135. attributes: { disabled: this.disabled, type: 'date', style: { width: '100%' } },
  136. formItemAttributes: { label: '失效时间', prop: 'endTime' }
  137. },
  138. {
  139. name: 'el-date-picker',
  140. attributes: {
  141. disabled: this.disabled,
  142. type: 'date',
  143. 'value-format': 'yyyy-MM-dd HH:mm:ss',
  144. style: { width: '100%' }
  145. },
  146. formItemAttributes: { label: '开始购买时间', prop: 'policyStartTime' }
  147. },
  148. {
  149. name: 'el-radio',
  150. options: [
  151. {
  152. label: '是',
  153. value: 'YES'
  154. },
  155. {
  156. label: '否',
  157. value: 'NO'
  158. }
  159. ],
  160. attributes: {
  161. disabled: this.disabled
  162. },
  163. formItemAttributes: {
  164. label: '是否允许购买',
  165. prop: 'isBuy',
  166. rules: [{ required: true, message: '请选择', trigger: 'blur' }]
  167. }
  168. },
  169. {
  170. name: 'slot-component',
  171. md: 24,
  172. attributes: { disabled: this.disabled },
  173. formItemAttributes: { label: '保费率', prop: 'month1' },
  174. render: (h, { props }) => {
  175. var { formData } = props
  176. return (
  177. <div>
  178. <zj-table
  179. columns={[
  180. {
  181. columnAttributes: {
  182. label: '保险期间(个月)',
  183. width: '110px'
  184. },
  185. render: (h, { row, column, index }) => {
  186. return (
  187. <div style="box-sizing: border-box;padding: 0 6px;">
  188. {index ? '保险金额(元)' : '年费率百分比'}
  189. </div>
  190. )
  191. }
  192. },
  193. ...(keys => {
  194. var list = []
  195. for (let i = 0; i < keys.length; i++) {
  196. list.push({
  197. columnAttributes: {
  198. label: i + 1 + ''
  199. },
  200. render: (h, { row, column, index }) => {
  201. if (index) {
  202. return (
  203. <el-form-item prop={keys[i]} label-width="0px" style="margin:0">
  204. {Math.ceil((formData[keys[i]] || 0) * (formData.policyPrice || 0)) / 100}
  205. </el-form-item>
  206. )
  207. } else {
  208. return (
  209. <el-form-item
  210. prop={keys[i]}
  211. rules={this.formRules.month1}
  212. label-width="0px"
  213. style="margin:0"
  214. >
  215. <el-input
  216. disabled={this.disabled}
  217. type="number"
  218. min={0}
  219. max={100}
  220. value={formData[keys[i]]}
  221. onInput={val => {
  222. formData[keys[i]] = val
  223. this.$refs?.formRef?.validateField([keys[i]], () => {})
  224. }}
  225. >
  226. <span slot="suffix">%</span>
  227. </el-input>
  228. </el-form-item>
  229. )
  230. }
  231. }
  232. })
  233. }
  234. return list
  235. })(this.monthKeys)
  236. ]}
  237. tableData={[{}, {}]}
  238. ></zj-table>
  239. </div>
  240. )
  241. }
  242. },
  243. {
  244. name: 'slot-component',
  245. md: 24,
  246. attributes: { disabled: this.disabled },
  247. formItemAttributes: {
  248. label: '保障范围',
  249. prop: 'policyRanges'
  250. },
  251. render: (h, { props }) => {
  252. var { formData } = props
  253. return (
  254. <zj-table
  255. columns={[
  256. ...(list => {
  257. return list.map(item => {
  258. return {
  259. columnAttributes: {
  260. label: item.name,
  261. prop: item.prop,
  262. width: item.prop === 'options' ? '80px' : ''
  263. },
  264. render: (h, { row, column, index }) => {
  265. return column.columnAttributes.prop === 'options' ? (
  266. this.type == 1 || this.type == 0 ? (
  267. <div style="box-sizing: border-box;padding: 0 6px;">
  268. <el-button
  269. type="text"
  270. onClick={() => {
  271. formData.policyRanges.push({ rangeName: '', rangeText: '' })
  272. }}
  273. >
  274. 添加
  275. </el-button>
  276. {formData.policyRanges.length > 1 ? (
  277. <el-button
  278. type="text"
  279. onClick={() => {
  280. formData.policyRanges.splice(index, 1)
  281. }}
  282. >
  283. 删除
  284. </el-button>
  285. ) : null}
  286. </div>
  287. ) : null
  288. ) : (
  289. <el-form-item
  290. label-width="0px"
  291. style="margin:0"
  292. prop={`policyRanges.${index}.${item.prop}`}
  293. rules={[{ required: true, message: '请输入', trigger: 'blur' }]}
  294. >
  295. <el-input
  296. disabled={this.disabled}
  297. value={row[item.prop]}
  298. onInput={val => {
  299. row[item.prop] = val
  300. this.$refs?.formRef?.validateField([`policyRanges.${index}.${item.prop}`], () => {})
  301. }}
  302. ></el-input>
  303. </el-form-item>
  304. )
  305. }
  306. }
  307. })
  308. })([
  309. { name: '名称', prop: 'rangeName' },
  310. { name: '内容', prop: 'rangeText' },
  311. { name: '操作', prop: 'options' }
  312. ])
  313. ]}
  314. tableData={formData.policyRanges}
  315. ></zj-table>
  316. )
  317. }
  318. },
  319. {
  320. name: 'el-input',
  321. attributes: { disabled: true },
  322. formItemAttributes: { label: '创建人', prop: 'createBy' }
  323. },
  324. {
  325. name: 'el-input',
  326. attributes: { disabled: true },
  327. formItemAttributes: { label: '创建时间', prop: 'createTime' }
  328. },
  329. {
  330. name: 'el-input',
  331. attributes: { disabled: true },
  332. formItemAttributes: { label: '修改人', prop: 'updateBy' }
  333. },
  334. {
  335. name: 'el-input',
  336. attributes: { disabled: true },
  337. formItemAttributes: { label: '修改时间', prop: 'updateTime' }
  338. }
  339. ]
  340. },
  341. formItems2() {
  342. return [
  343. {
  344. name: 'el-input',
  345. md: 24,
  346. attributes: { disabled: this.disabled },
  347. formItemAttributes: { label: '承保公司', prop: 'company' }
  348. },
  349. {
  350. name: 'slot-component',
  351. md: 24,
  352. attributes: { disabled: this.disabled },
  353. formItemAttributes: { label: '保单内容', prop: 'text' },
  354. render: (h, { props }) => {
  355. var { formData } = props
  356. return (
  357. <v-quill-editor
  358. disabled={this.disabled}
  359. value={formData.text}
  360. onInput={val => {
  361. formData.text = val
  362. }}
  363. ></v-quill-editor>
  364. )
  365. }
  366. }
  367. ]
  368. },
  369. items2() {
  370. return [
  371. {
  372. name: 'slot-component',
  373. md: 24,
  374. attributes: {},
  375. formItemAttributes: { label: '', 'label-width': '0px', prop: 'policyWebsits', rules: [] },
  376. render: (h, { props, onInput }) => {
  377. var { formData } = props
  378. return (
  379. <div>
  380. <div>
  381. <el-form
  382. size="mini"
  383. inline={true}
  384. value={this.formInline}
  385. onInput={v => {
  386. this.formInline = v
  387. }}
  388. label-width="0px"
  389. >
  390. <el-form-item label="">
  391. <el-input
  392. value={this.formInline.websitId}
  393. onInput={v => {
  394. this.formInline.websitId = v
  395. }}
  396. placeholder="网点编号"
  397. ></el-input>
  398. </el-form-item>
  399. <el-form-item label="">
  400. <el-input
  401. value={this.formInline.websitName}
  402. onInput={v => {
  403. this.formInline.websitName = v
  404. }}
  405. placeholder="网点名称"
  406. ></el-input>
  407. </el-form-item>
  408. <el-form-item>
  409. <el-button
  410. type="primary"
  411. onClick={() => {
  412. EventBus.$emit('handlePaginationCallBack22')
  413. }}
  414. >
  415. 查询
  416. </el-button>
  417. <el-button
  418. onClick={() => {
  419. this.formInline.websitId = ''
  420. this.formInline.websitName = ''
  421. this.$nextTick(() => {
  422. EventBus.$emit('handlePaginationCallBack22')
  423. })
  424. }}
  425. >
  426. 重置
  427. </el-button>
  428. </el-form-item>
  429. </el-form>
  430. </div>
  431. <pagingTransfer
  432. handlePaginationCallBackKey="handlePaginationCallBack22"
  433. value={this.formData.policyWebsits}
  434. onInput={v => {
  435. this.formData.policyWebsits = v
  436. }}
  437. left-columns={[
  438. { id: 'belongCompanyCode', label: '所属公司编号', width: '160' },
  439. { id: 'websitId', label: '网点编号', width: '120' },
  440. { id: 'websitName', label: '网点名称', width: '' }
  441. ]}
  442. right-columns={[
  443. { id: 'belongCompanyCode', label: '所属公司编号', width: '160' },
  444. { id: 'websitId', label: '网点编号', width: '120' },
  445. { id: 'websitName', label: '网点名称', width: '' }
  446. ]}
  447. show-pagination={false}
  448. pagination-call-back={this.paginationCallback}
  449. title-texts={['待选项', '已选项']}
  450. min-height="300px"
  451. table-row-key={row => row.websitId}
  452. />
  453. </div>
  454. )
  455. }
  456. }
  457. ]
  458. }
  459. },
  460. created() {
  461. // 获取详情
  462. if (this.type !== 0) {
  463. insureDetail({
  464. id: this.item.id
  465. }).then(res => {
  466. for (var key in res.data) {
  467. if (~this.monthKeys.indexOf(key)) {
  468. this.formData[key] = res.data[key] * 100
  469. } else if (key == 'policyRanges') {
  470. this.formData[key] = res?.data[key]?.length ? res.data[key] : [{ rangeName: '', rangeText: '' }]
  471. } else {
  472. this.formData[key] = res.data[key]
  473. }
  474. }
  475. })
  476. }
  477. },
  478. methods: {
  479. paginationCallback({ pageIndex, pageSize }) {
  480. return new Promise(resolve => {
  481. getWebsit({ ...this.formInline, attr: 'SELF' }).then(res => {
  482. resolve({
  483. total: res.data.filter(item => item.type !== 'B').length,
  484. data: res.data
  485. .filter(item => item.type !== 'B')
  486. .map(item => {
  487. return {
  488. ...item,
  489. websitName: item.name
  490. }
  491. })
  492. })
  493. })
  494. })
  495. },
  496. submit() {
  497. this.$refs['formRef'].validate(valid => {
  498. console.log(this.formData)
  499. if (valid) {
  500. ;(this.formData.id ? insureUpdate : insureAdd)({
  501. ...this.formData,
  502. startTime: dateFormat('YYYY-mm-dd HH:MM:SS', new Date(this.formData.startTime)),
  503. endTime: this.formData?.endTime
  504. ? `${dateFormat('YYYY-mm-dd HH:MM:SS', new Date(this.formData.endTime))?.split(' ')?.[0]} 23:59:59`
  505. : '',
  506. ...(() => {
  507. var obj = {}
  508. for (var key of this.monthKeys) {
  509. obj[key] = this.formData[key] / 100
  510. }
  511. return obj
  512. })()
  513. }).then(res => {
  514. this.$message({
  515. type: 'success',
  516. message: `保存成功!`
  517. })
  518. this.$emit('success')
  519. })
  520. } else {
  521. console.log('error submit!!')
  522. return false
  523. }
  524. })
  525. },
  526. reset() {
  527. Object.assign(this.$data, this.$options.data())
  528. }
  529. }
  530. }
  531. </script>
  532. <style lang="scss" scoped></style>