addDialog.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. <template>
  2. <!-- <ele-modal
  3. custom-class="ele-dialog-form long-dialog-form"
  4. :centered="true"
  5. v-if="visible"
  6. :visible.sync="visible"
  7. :title="title"
  8. :close-on-click-modal="false"
  9. width="80%"
  10. @close="cancel"
  11. > -->
  12. <div>
  13. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  14. <headerTitle title="基本信息"></headerTitle>
  15. <el-row>
  16. <el-col :span="12">
  17. <el-form-item
  18. label="关联商机"
  19. prop="opportunityId"
  20. style="margin-bottom: 22px"
  21. >
  22. <el-select v-model="form.opportunityId" placeholder="请选择" style="width: 100%;">
  23. <el-option
  24. v-for="item in businessList"
  25. :key="item.id"
  26. :label="item.name"
  27. :value="item.id"
  28. >
  29. </el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item
  33. label="询价方名称"
  34. prop="contactName"
  35. style="margin-bottom: 22px"
  36. >
  37. <el-input
  38. clearable
  39. v-model="form.contactName"
  40. @click.native="handParent"
  41. placeholder="请输入"
  42. />
  43. </el-form-item>
  44. <el-form-item
  45. label="询价方联系人"
  46. prop="contactLinkName"
  47. style="margin-bottom: 22px"
  48. >
  49. <el-select style="width: 100%;"
  50. v-model="form.contactLinkName"
  51. placeholder="请选择"
  52. @change="onchangeLink"
  53. @focus="selectFocus"
  54. >
  55. <el-option
  56. v-for="item in linkNameOptions"
  57. :key="item.id"
  58. :label="item.linkName"
  59. :value="item.id"
  60. >
  61. </el-option>
  62. </el-select>
  63. </el-form-item>
  64. <el-form-item
  65. label="询价方电话"
  66. prop="contactTel"
  67. style="margin-bottom: 22px"
  68. >
  69. <el-input
  70. clearable
  71. :maxlength="20"
  72. v-model="form.contactTel"
  73. placeholder="请输入"
  74. />
  75. </el-form-item>
  76. <el-form-item
  77. label="询价方传真"
  78. prop="contactFax"
  79. style="margin-bottom: 22px"
  80. >
  81. <el-input
  82. clearable
  83. v-model="form.contactFax"
  84. placeholder="请输入"
  85. />
  86. </el-form-item>
  87. <el-form-item
  88. label=" 询价方Email"
  89. prop="contactEmail"
  90. style="margin-bottom: 22px"
  91. >
  92. <el-input
  93. clearable
  94. v-model="form.contactEmail"
  95. placeholder="请输入"
  96. />
  97. </el-form-item>
  98. <el-form-item
  99. label="询价方地址"
  100. prop="contactAddress"
  101. style="margin-bottom: 22px"
  102. >
  103. <el-input
  104. clearable
  105. v-model="form.contactAddress"
  106. placeholder="请输入"
  107. />
  108. </el-form-item>
  109. <el-form-item prop="askFile" label="附件">
  110. <fileUpload
  111. v-model="form.askFile"
  112. module="main"
  113. :showLib="false"
  114. :limit="1"
  115. />
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="12">
  119. <el-form-item
  120. label="报价方名称"
  121. prop="quoteName"
  122. style="margin-bottom: 22px"
  123. >
  124. <el-input clearable v-model="form.quoteName" placeholder="请输入" />
  125. </el-form-item>
  126. <el-form-item
  127. label="报价方联系人"
  128. prop="quoteLinkName"
  129. style="margin-bottom: 22px"
  130. >
  131. <el-input
  132. clearable
  133. v-model="form.quoteLinkName"
  134. @click.native="handHead"
  135. placeholder="请输入"
  136. />
  137. </el-form-item>
  138. <el-form-item prop="quoteTel" label="报价方联系电话">
  139. <el-input clearable v-model="form.quoteTel" placeholder="请输入" />
  140. </el-form-item>
  141. <el-form-item prop="quoteFax" label="报价方传真">
  142. <el-input clearable v-model="form.quoteFax" placeholder="请输入" />
  143. </el-form-item>
  144. <el-form-item
  145. label="报价方Email"
  146. prop="quoteEmail"
  147. style="margin-bottom: 22px"
  148. >
  149. <el-input
  150. clearable
  151. v-model="form.quoteEmail"
  152. placeholder="请输入"
  153. />
  154. </el-form-item>
  155. <el-form-item
  156. label="报价方地址"
  157. prop="quoteAddress"
  158. style="margin-bottom: 22px"
  159. >
  160. <el-input
  161. clearable
  162. v-model="form.quoteAddress"
  163. placeholder="请输入"
  164. />
  165. </el-form-item>
  166. </el-col>
  167. </el-row>
  168. <headerTitle title="报价单产品清单"></headerTitle>
  169. <inventoryTable
  170. ref="inventoryTable"
  171. :isCustomerMark="false"
  172. :isDeliveryDeadline="false"
  173. :isGuaranteePeriod="false"
  174. ></inventoryTable>
  175. <el-row style="margin-top: 20px">
  176. <el-col :span="6">
  177. <el-form-item prop="taxRate" label="税率">
  178. <el-input clearable v-model="form.taxRate" placeholder="请输入">
  179. <template slot="append">%</template>
  180. </el-input>
  181. </el-form-item>
  182. </el-col>
  183. <el-col :span="6">
  184. <el-form-item prop="deliveryDate" label="交货日期">
  185. <el-date-picker
  186. v-model="form.deliveryDate"
  187. value-format="yyyy-MM-dd"
  188. placeholder="请选择交货日期"
  189. type="date"
  190. style="width: 150px"
  191. class="filter-item"
  192. ></el-date-picker>
  193. </el-form-item>
  194. </el-col>
  195. <el-col :span="6">
  196. <el-form-item
  197. label="结算方式"
  198. prop="settlementMode"
  199. style="margin-bottom: 22px"
  200. >
  201. <DictSelection
  202. dictName="结算方式"
  203. clearable
  204. v-model="form.settlementMode"
  205. >
  206. </DictSelection>
  207. </el-form-item>
  208. </el-col>
  209. <el-col :span="6">
  210. <el-form-item
  211. label="是否接受拆单"
  212. prop="acceptUnpack"
  213. style="margin-bottom: 22px"
  214. >
  215. <el-select v-model="form.acceptUnpack" placeholder="请选择">
  216. <el-option
  217. v-for="item in acceptUnpackoptions"
  218. :key="item.value"
  219. :label="item.label"
  220. :value="item.value"
  221. >
  222. </el-option>
  223. </el-select>
  224. </el-form-item>
  225. </el-col>
  226. </el-row>
  227. </el-form>
  228. <parentList
  229. ref="parentRef"
  230. classType="1"
  231. @changeParent="changeParent"
  232. ></parentList>
  233. <head-list ref="headRef" @changeParent="changePersonel"></head-list>
  234. </div>
  235. </template>
  236. <script>
  237. import { emailReg, numberReg } from 'ele-admin';
  238. import { acceptUnpackoptions } from '@/enum/dict';
  239. import inventoryTable from '@/views/bpm/handleTask/components/contractBook/inventoryTable.vue';
  240. import fileUpload from '@/components/upload/fileUpload';
  241. import dictMixins from '@/mixins/dictMixins';
  242. import headList from '@/components/headList';
  243. import parentList from './parentList.vue';
  244. import {
  245. getTableList,
  246. getcontactlink,
  247. getDetail
  248. } from '@/api/bpm/components/saleManage/quotation';
  249. import { copyObj } from '@/utils/util';
  250. import { getFile } from '@/api/system/file';
  251. export default {
  252. mixins: [dictMixins],
  253. components: {
  254. fileUpload,
  255. inventoryTable,
  256. parentList,
  257. headList
  258. },
  259. props: {
  260. businessId: {
  261. default: ''
  262. }
  263. },
  264. data() {
  265. let formDef = {
  266. id: '',
  267. acceptUnpack: null,
  268. askFile: null,
  269. contactAddress: '',
  270. opportunityId: '',
  271. contactEmail: '',
  272. contactFax: '',
  273. contactId: '',
  274. contactLinkId: '',
  275. contactLinkName: '',
  276. contactName: '',
  277. contactTel: '',
  278. deliveryDate: '',
  279. settlementMode: '',
  280. settlementModeName: '',
  281. quoteAddress: '',
  282. quoteEmail: '',
  283. quoteFax: '',
  284. quoteLinkId: '',
  285. quoteLinkName: '',
  286. quoteName: '',
  287. quoteTel: '',
  288. taxRate: null,
  289. totalPrice: null
  290. };
  291. return {
  292. payWayOptions: [],
  293. delDetailIds: [],
  294. linkNameOptions: [],
  295. acceptUnpackoptions,
  296. visible: false,
  297. title: '',
  298. row: {},
  299. activeName: 'base',
  300. formDef,
  301. form: copyObj(formDef),
  302. // removeBankList: [],
  303. // removeLinkList: [],
  304. tableBankData: [],
  305. tableLinkData: [],
  306. businessList: [], //商机列表
  307. rules: {
  308. opportunityId: [
  309. { required: true, message: '请选择关联商机', trigger: 'change' }
  310. ],
  311. contactName: [
  312. { required: true, message: '请选择客户', trigger: 'change' }
  313. ],
  314. name: [
  315. { required: true, message: '请输入客户名称', trigger: 'blur' }
  316. ],
  317. contactLinkName: [
  318. { required: true, message: '请选择联系人', trigger: 'change' }
  319. ],
  320. acceptUnpack: [
  321. { required: true, message: '请选择是否接受', trigger: 'change' }
  322. ],
  323. contactTel: [
  324. {
  325. required: true,
  326. pattern: numberReg,
  327. message: '请输入联系电话',
  328. trigger: 'blur'
  329. }
  330. ],
  331. deliveryDate: [
  332. { required: true, message: '请选择交货日期', trigger: 'change' }
  333. ],
  334. settlementMode: [
  335. { required: true, message: '请选择结算方式', trigger: 'change' }
  336. ],
  337. quoteLinkName: [
  338. { required: true, message: '请输入报价方联系人', trigger: 'change' }
  339. ],
  340. quoteName: [
  341. { required: true, message: '请输入报价方名称', trigger: 'blur' }
  342. ],
  343. quoteTel: [
  344. {
  345. required: true,
  346. pattern: numberReg,
  347. message: '请输入报价方联系电话',
  348. trigger: 'blur'
  349. }
  350. ],
  351. quoteEmail: [
  352. { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
  353. ],
  354. contactEmail: [
  355. { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
  356. ],
  357. taxRate: [
  358. { pattern: numberReg, message: '请输入数字', trigger: 'blur' }
  359. ]
  360. },
  361. // 提交状态
  362. loading: false,
  363. // 是否是修改
  364. isUpdate: false,
  365. // 组织机构树形结构数据
  366. groupTreeData: [],
  367. // 组织机构平铺数据
  368. groupData: []
  369. };
  370. },
  371. created() {
  372. this.getDetailData(this.businessId);
  373. },
  374. methods: {
  375. //获取详情
  376. async getDetailData(id) {
  377. this.loading = true;
  378. const data = await getDetail(id);
  379. this.loading = false;
  380. if (data) {
  381. this.$nextTick(() => {
  382. this.form = data;
  383. if (data.askFile !== '') {
  384. this.$set(this.form, 'askFile', [data?.askFile]);
  385. }
  386. this.$refs.inventoryTable &&
  387. this.$refs.inventoryTable.putTableValue(data);
  388. this.getLinkInfo(data.contactId);
  389. this.getBusinessList(data.contactName);
  390. });
  391. }
  392. },
  393. //更新联系人数据
  394. async getLinkInfo(contactId) {
  395. const data = await getcontactlink({ contactId });
  396. if (data && data?.length) {
  397. this.linkNameOptions = data;
  398. }
  399. },
  400. selectFocus() {
  401. if (this.linkNameOptions.length === 0) {
  402. return this.$message.error('请先选择名称');
  403. }
  404. },
  405. //获取客户的商机列表
  406. async getBusinessList(name) {
  407. if (!this.form.contactName)
  408. return this.$message.error('请先选择询价方名称');
  409. const data = await getTableList({
  410. pageNum: 1,
  411. size: 30,
  412. contactName: name,
  413. approvalStatus:2
  414. });
  415. this.businessList = data.list;
  416. },
  417. //选择下拉框
  418. onchangeLink(selectedOptions) {
  419. const option = this.linkNameOptions.find(
  420. (opt) => opt.id === selectedOptions
  421. );
  422. this.form = Object.assign({}, this.form, {
  423. contactEmail: option?.email,
  424. contactLinkName: option?.linkName || '',
  425. contactTel: option?.mobilePhone || option?.phone || '',
  426. contactLinkId: option?.id
  427. });
  428. },
  429. handHead() {
  430. let item = {
  431. id: this.form.quoteLinkId
  432. };
  433. this.$refs.headRef.open(item);
  434. },
  435. downloadFile(file) {
  436. getFile({ objectName: file.storePath }, file.name);
  437. },
  438. //选择报价方人回调
  439. changePersonel(obj) {
  440. this.$set(this.form, 'quoteLinkId', obj.id);
  441. this.$set(this.form, 'quoteLinkName', obj.name);
  442. this.$set(this.form, 'quoteTel', obj.phone);
  443. this.$set(this.form, 'quoteEmail', obj.email);
  444. },
  445. //选择客户回调
  446. changeParent(obj) {
  447. this.form = Object.assign({}, this.form, {
  448. contactId: obj.id,
  449. contactName: obj.name,
  450. contactAddress: obj.addressName + obj.address,
  451. contactLinkId: '',
  452. contactLinkName: '',
  453. contactEmail: '',
  454. contactTel: ''
  455. });
  456. this.getLinkInfo(obj.id);
  457. this.getBusinessList(obj.name);
  458. },
  459. handParent() {
  460. let item = {
  461. id: this.form.contactId
  462. };
  463. this.$refs.parentRef.open(item);
  464. },
  465. getValidate() {
  466. return Promise.all([
  467. new Promise((resolve, reject) => {
  468. this.$refs.form.validate((valid) => {
  469. if (!valid) {
  470. reject(false);
  471. } else {
  472. resolve(true);
  473. }
  474. });
  475. }),
  476. new Promise((resolve, reject) => {
  477. this.$refs.inventoryTable.validateForm((valid) => {
  478. if (!valid) {
  479. reject(false);
  480. } else {
  481. resolve(true);
  482. }
  483. });
  484. })
  485. ]);
  486. },
  487. async getTableValue() {
  488. try {
  489. await this.getValidate();
  490. // 表单验证通过,执行保存操作
  491. this.loading = true;
  492. let settlementModeName = this.getDictValue(
  493. '结算方式',
  494. this.form.settlementMode
  495. );
  496. if (this.form.askFile && this.form.askFile.length > 0) {
  497. this.form.askFile = this.form.askFile[0];
  498. } else {
  499. this.form.askFile = null;
  500. }
  501. let commitData = Object.assign({}, this.form, {
  502. settlementModeName,
  503. quoteProductList: this.$refs.inventoryTable.getTableValue(),
  504. totalPrice: this.$refs.inventoryTable.getTotalPrice()
  505. });
  506. return commitData;
  507. // UpdateInformation(commitData)
  508. // .then((res) => {
  509. // this.loading = false;
  510. // this.$message.success('修改成功');
  511. // this.cancel();
  512. // this.$emit('done');
  513. // })
  514. // .catch((e) => {
  515. // //this.loading = false;
  516. // });
  517. } catch (error) {
  518. console.log(error);
  519. // 表单验证未通过,不执行保存操作
  520. }
  521. }
  522. }
  523. };
  524. </script>
  525. <style scoped lang="scss">
  526. .TotalAmount {
  527. font-size: 16px;
  528. padding-right: 30px;
  529. }
  530. </style>
  531. @/api/bpm/components/saleManage/quotation