addDialog.vue 17 KB

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