addDialog.vue 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
  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. :close-on-click-modal="false"
  8. :append-to-body="true"
  9. width="70%"
  10. @close="cancel"
  11. :maxable="true"
  12. :resizable="true"
  13. :title="title"
  14. >
  15. <el-form
  16. ref="form"
  17. :model="form"
  18. :rules="rules"
  19. label-width="120px"
  20. class="el-form-box"
  21. >
  22. <headerTitle title="订单信息"></headerTitle>
  23. <el-row>
  24. <el-col :span="12">
  25. <el-form-item label="项目名称" prop="projectName">
  26. <el-input
  27. clearable
  28. v-model="form.projectName"
  29. @clear="clearContrcat"
  30. placeholder="请输入"
  31. style="width: calc(100% - 80px)"
  32. />
  33. <el-button
  34. style="margin-left: 5px"
  35. size="small"
  36. type="primary"
  37. @click.native="handleProjectBtn"
  38. >选择
  39. </el-button>
  40. </el-form-item>
  41. <el-form-item label="销售类型" prop="saleType">
  42. <DictSelection
  43. dictName="销售类型"
  44. clearable
  45. v-model="form.saleType"
  46. :listFormatte="listFormatte"
  47. >
  48. </DictSelection>
  49. </el-form-item>
  50. <el-form-item label="销售部门" prop="salesDeptId">
  51. <ele-tree-select
  52. clearable
  53. :data="groupTreeData"
  54. v-model="form.salesDeptId"
  55. valueKey="id"
  56. labelKey="name"
  57. placeholder="请选择"
  58. @change="change_principalDep"
  59. default-expand-all
  60. />
  61. </el-form-item>
  62. <el-form-item label="订单类型" prop="needProduce">
  63. <el-radio
  64. v-model="form.needProduce"
  65. :label="1"
  66. @change="needProduceChange"
  67. >有客户生产性订单</el-radio
  68. >
  69. <el-radio
  70. v-model="form.needProduce"
  71. :label="0"
  72. @change="needProduceChange"
  73. >库存式订单</el-radio
  74. >
  75. <el-radio
  76. v-model="form.needProduce"
  77. :label="2"
  78. @change="needProduceChange"
  79. >无客户生产性订单</el-radio
  80. >
  81. <el-radio
  82. v-model="form.needProduce"
  83. :label="4"
  84. @change="needProduceChange"
  85. v-if="clientEnvironmentId != 5"
  86. >不定向订单</el-radio
  87. >
  88. </el-form-item>
  89. <el-form-item prop="orderFiles" label="订单附件">
  90. <fileMain v-model="form.orderFiles"></fileMain>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="12">
  94. <el-form-item label="选择合同" prop="contractName">
  95. <el-input
  96. clearable
  97. v-model="form.contractName"
  98. @click.native="handleContractBtn"
  99. @clear="clearContrcat"
  100. placeholder="请选择"
  101. :disabled="!!projectData.contractId"
  102. />
  103. </el-form-item>
  104. <el-form-item label="合同编号" prop="contractNumber">
  105. <el-input disabled v-model="form.contractNumber" />
  106. </el-form-item>
  107. <el-form-item label="结算方式" prop="settlementMode">
  108. <DictSelection
  109. dictName="结算方式"
  110. clearable
  111. @itemChange="settlementModeChange"
  112. v-model="form.settlementMode"
  113. >
  114. </DictSelection>
  115. </el-form-item>
  116. <el-form-item
  117. label="总数"
  118. prop="totalPlanNum"
  119. v-if="form.needProduce == 4"
  120. >
  121. <el-input v-model="form.totalPlanNum" class="totalPlanNum">
  122. <template slot="append">
  123. <DictSelection
  124. dictName="计量单位"
  125. clearable
  126. v-model="form.planNumUnit"
  127. >
  128. </DictSelection>
  129. </template>
  130. </el-input>
  131. </el-form-item>
  132. </el-col>
  133. </el-row>
  134. <headerTitle title="基本信息" v-if="form.needProduce != 2"></headerTitle>
  135. <el-row v-if="form.needProduce != 2">
  136. <el-col :span="12">
  137. <el-form-item label="客户名称" prop="partaName">
  138. <el-input
  139. clearable
  140. v-model="form.partaName"
  141. @click.native="handParent"
  142. placeholder="请选择"
  143. readonly
  144. :disabled="!!contactData?.id"
  145. />
  146. </el-form-item>
  147. <el-form-item
  148. label="客户统一社会信用代码"
  149. prop="partaUnifiedSocialCreditCode"
  150. class="form_item_label"
  151. >
  152. <el-input
  153. clearable
  154. v-model="form.partaUnifiedSocialCreditCode"
  155. placeholder="请输入"
  156. />
  157. </el-form-item>
  158. <el-form-item label="客户联系人" prop="partaLinkName">
  159. <el-select
  160. v-model="form.partaLinkName"
  161. placeholder="请选择"
  162. @change="onchangeLink"
  163. @focus="selectFocus"
  164. style="width: 100%"
  165. >
  166. <el-option
  167. v-for="item in linkNameOptions"
  168. :key="item.id"
  169. :label="item.linkName"
  170. :value="item.id"
  171. >
  172. </el-option>
  173. </el-select>
  174. </el-form-item>
  175. <el-form-item label="客户电话" prop="partaTel">
  176. <el-input
  177. clearable
  178. :maxlength="20"
  179. v-model="form.partaTel"
  180. placeholder="请输入"
  181. />
  182. </el-form-item>
  183. <el-form-item label="客户传真" prop="partaFax">
  184. <el-input clearable v-model="form.partaFax" placeholder="请输入" />
  185. </el-form-item>
  186. <el-form-item label=" 客户Email" prop="partaEmail">
  187. <el-input
  188. clearable
  189. v-model="form.partaEmail"
  190. placeholder="请输入"
  191. />
  192. </el-form-item>
  193. <el-form-item label="客户地址" prop="partaAddress">
  194. <el-input
  195. clearable
  196. v-model="form.partaAddress"
  197. placeholder="请输入"
  198. />
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="12">
  202. <el-form-item label="售出方名称" prop="partbName">
  203. <el-input
  204. v-if="enterprisePage.length <= 1"
  205. clearable
  206. v-model="form.partbName"
  207. placeholder="请输入"
  208. />
  209. <el-select
  210. v-if="enterprisePage.length > 1"
  211. style="width: 100%"
  212. v-model="form.partbName"
  213. placeholder="请选择"
  214. @change="getEnterprise()"
  215. >
  216. <el-option
  217. v-for="item in enterprisePage"
  218. :key="item.id"
  219. :label="item.name"
  220. :value="item.name"
  221. >
  222. </el-option>
  223. </el-select>
  224. </el-form-item>
  225. <el-form-item
  226. label="售出方统一社会信用代码"
  227. prop="partbUnifiedSocialCreditCode"
  228. class="form_item_label"
  229. >
  230. <el-input
  231. clearable
  232. v-model="form.partbUnifiedSocialCreditCode"
  233. placeholder="请输入"
  234. />
  235. </el-form-item>
  236. <el-form-item label="售出方联系人" prop="partbLinkName">
  237. <el-input
  238. clearable
  239. v-model="form.partbLinkName"
  240. @click.native="handHead"
  241. placeholder="请输入"
  242. />
  243. </el-form-item>
  244. <el-form-item prop="partbTel" label="售出方联系电话">
  245. <el-input clearable v-model="form.partbTel" placeholder="请输入" />
  246. </el-form-item>
  247. <el-form-item prop="partbFax" label="售出方传真">
  248. <el-input clearable v-model="form.partbFax" placeholder="请输入" />
  249. </el-form-item>
  250. <el-form-item label="售出方Email" prop="partbEmail">
  251. <el-input
  252. clearable
  253. v-model="form.partbEmail"
  254. placeholder="请输入"
  255. />
  256. </el-form-item>
  257. <el-form-item label="售出方地址" prop="partbAddress">
  258. <el-input
  259. clearable
  260. v-model="form.partbAddress"
  261. placeholder="请输入"
  262. />
  263. </el-form-item>
  264. </el-col>
  265. </el-row>
  266. <headerTitle
  267. title="物品清单"
  268. style="margin-top: 30px"
  269. v-if="form.needProduce != 4"
  270. ></headerTitle>
  271. <inventoryTable
  272. v-if="form.needProduce != 4"
  273. :customerMark="customerMark"
  274. :isCustomerMark="clientEnvironmentId != 4 && form.needProduce != 2"
  275. :isProduceDeliveryDeadline="form.needProduce != 0"
  276. ref="inventoryTable"
  277. @setCountAmount="setCountAmount"
  278. :isContractId="!!form.contractId"
  279. :isChangeCount="false"
  280. :needProduce="form.needProduce"
  281. :isSupplier="true"
  282. :isArrivalWay="true"
  283. :cacheKeyUrl="cacheKeyUrl"
  284. ></inventoryTable>
  285. <headerTitle
  286. title="类型清单"
  287. style="margin-top: 30px"
  288. v-if="form.needProduce == 4"
  289. ></headerTitle>
  290. <typeList
  291. v-if="form.needProduce == 4"
  292. @setCountAmount="setCountAmount"
  293. @setTotalPlanNum="setTotalPlanNum"
  294. ref="typeListRef"
  295. ></typeList>
  296. <el-row v-if="form.needProduce == 1">
  297. <el-col :span="8">
  298. <el-form-item
  299. label="自动生成采购计划:"
  300. label-width="160px"
  301. prop="generatePurchase"
  302. >
  303. <el-radio-group v-model="form.generatePurchase">
  304. <el-radio :label="1">是</el-radio>
  305. <el-radio :label="0">否</el-radio>
  306. </el-radio-group>
  307. </el-form-item>
  308. </el-col>
  309. <el-col :span="8">
  310. <el-form-item
  311. label="自动生成生产计划:"
  312. label-width="160px"
  313. prop="generateProduce"
  314. >
  315. <el-radio-group v-model="form.generateProduce">
  316. <el-radio :label="1">是</el-radio>
  317. <el-radio :label="0">否</el-radio>
  318. </el-radio-group>
  319. </el-form-item>
  320. </el-col>
  321. <el-col :span="8">
  322. <el-form-item
  323. label="自动生成项目立项:"
  324. label-width="160px"
  325. prop="generateProject"
  326. >
  327. <el-radio-group v-model="form.generateProject">
  328. <el-radio :label="1">是</el-radio>
  329. <el-radio :label="0">否</el-radio>
  330. </el-radio-group>
  331. </el-form-item>
  332. </el-col>
  333. </el-row>
  334. <el-row style="margin-top: 20px">
  335. <el-col :span="12">
  336. <el-form-item label="总金额" prop="totalAmount">
  337. {{ form.totalAmount || 0 }}元
  338. </el-form-item>
  339. <el-form-item label="收货地址" prop="receiveAddress">
  340. <el-input
  341. clearable
  342. type="textarea"
  343. v-model="form.receiveAddress"
  344. placeholder="请输入"
  345. />
  346. </el-form-item>
  347. </el-col>
  348. <el-col :span="12">
  349. <el-form-item label="优惠后总金额">
  350. <el-input
  351. type="number"
  352. :min="0"
  353. :max="form.totalAmount"
  354. clearable
  355. :disabled="!!form.contractId || !form.totalAmount"
  356. v-model="form.payAmount"
  357. @input="discountInput"
  358. placeholder="请输入"
  359. >
  360. <template slot="append">元</template>
  361. </el-input>
  362. </el-form-item>
  363. <el-form-item label="备注" prop="remark">
  364. <el-input
  365. clearable
  366. type="textarea"
  367. v-model="form.remark"
  368. placeholder="请输入"
  369. />
  370. </el-form-item>
  371. </el-col>
  372. </el-row>
  373. </el-form>
  374. <div slot="footer" class="footer">
  375. <el-button type="primary" @click="save" v-click-once>保存</el-button>
  376. <el-button
  377. type="primary"
  378. v-if="isNeed_process_is_close"
  379. @click="save('sub')"
  380. v-click-once
  381. >提交</el-button
  382. >
  383. <el-button @click="cancel">返回</el-button>
  384. </div>
  385. <parentList ref="parentRef" @changeParent="changeParent"></parentList>
  386. <head-list ref="headRef" @changeParent="changePersonel"></head-list>
  387. <contractListDialog
  388. ref="selectContractRef"
  389. @changeParent="changeContract"
  390. :contactData="contactData"
  391. ></contractListDialog>
  392. <projectListDialog
  393. :contactData="contactData"
  394. ref="selectProjectRef"
  395. @changeParent="changeProject"
  396. ></projectListDialog>
  397. <process-submit-dialog
  398. :isNotNeedProcess="false"
  399. :processSubmitDialogFlag.sync="processSubmitDialogFlag"
  400. v-if="processSubmitDialogFlag"
  401. ref="processSubmitDialogRef"
  402. @reload="reload"
  403. ></process-submit-dialog>
  404. </ele-modal>
  405. </template>
  406. <script>
  407. import { emailReg, numberReg, telReg } from 'ele-admin';
  408. import inventoryTable from '@/BIZComponents/inventoryTable.vue';
  409. import fileUpload from '@/components/upload/fileUpload';
  410. import dictMixins from '@/mixins/dictMixins';
  411. import parentList from '@/views/saleManage/contact/components/parentList.vue';
  412. import {
  413. getDetail,
  414. updateContractStatus
  415. } from '@/api/contractManage/contractBook';
  416. import {
  417. contactDetail,
  418. updateRelationStatus
  419. } from '@/api/saleManage/contact';
  420. import {
  421. getSaleOrderDetail,
  422. UpdateInformation,
  423. addInformation,
  424. submit
  425. } from '@/api/saleManage/saleorder';
  426. import { getcontactlink } from '@/api/saleManage/businessFollow';
  427. import headList from '@/BIZComponents/user-select/user-select.vue';
  428. import contractListDialog from './contractListDialog.vue';
  429. import projectListDialog from './projectListDialog.vue';
  430. import paymentList from './paymentList.vue';
  431. import { listOrganizations } from '@/api/system/organization';
  432. import { copyObj } from '@/utils/util';
  433. import { enterprisePage } from '@/api/contractManage/contractBook';
  434. import fileMain from '@/components/addDoc/index.vue';
  435. import processSubmitDialog from '@/BIZComponents/processSubmitDialog/processSubmitDialog.vue';
  436. import { getUserDetail } from '@/api/system/organization/index.js';
  437. import typeList from './typeList.vue';
  438. export default {
  439. mixins: [dictMixins],
  440. components: {
  441. processSubmitDialog,
  442. fileMain,
  443. fileUpload,
  444. headList,
  445. contractListDialog,
  446. projectListDialog,
  447. paymentList,
  448. inventoryTable,
  449. parentList,
  450. typeList
  451. },
  452. props: {
  453. contactData: {
  454. type: Object,
  455. default: () => {
  456. return {};
  457. }
  458. }
  459. },
  460. data() {
  461. let formDef = {
  462. id: '',
  463. contractId: '',
  464. orderFiles: [],
  465. contractName: '',
  466. projectName: '',
  467. projectId: '',
  468. pricingWay: 1,
  469. payAmount: '',
  470. generatePurchase: 0,
  471. generateProduce: 0,
  472. generateProject: 0,
  473. projectName: '',
  474. projectId: '',
  475. receiveAddress: '',
  476. remark: '',
  477. saleType: '',
  478. saleTypeName: '',
  479. totalAmount: 0,
  480. settlementMode: '4',
  481. settlementModeName: '分期付款',
  482. partaUnifiedSocialCreditCode: '',
  483. partbUnifiedSocialCreditCode: '',
  484. partaAddress: '',
  485. partaEmail: '',
  486. partaFax: '',
  487. partaId: '',
  488. partaLinkId: '',
  489. partaLinkName: '',
  490. partaName: '',
  491. partaTel: '',
  492. partbAddress: '',
  493. partbEmail: '',
  494. partbFax: '',
  495. partbId: '',
  496. partbLinkId: '',
  497. partbLinkName: '',
  498. partbName: '',
  499. partbTel: '',
  500. needProduce: 1,
  501. planNumUnit: '立方'
  502. };
  503. return {
  504. customerMark: '',
  505. projectData: {}, //项目数据
  506. clearing: false, //是否清除合同
  507. processSubmitDialogFlag: false,
  508. fullscreen: false, //全屏
  509. linkNameOptions: [],
  510. cacheKeyUrl: 'eos-saleManage-saleOrder-inventoryTable',
  511. visible: false,
  512. title: '',
  513. formDef,
  514. form: copyObj(formDef),
  515. tableLinkData: [],
  516. // 组织机构树形结构数据
  517. groupTreeData: [],
  518. groupData: [],
  519. rules: {
  520. settlementMode: [
  521. { required: true, message: '请选择结算方式', trigger: 'change' }
  522. ],
  523. saleType: [
  524. { required: true, message: '请选择销售类型', trigger: 'change' }
  525. ],
  526. partaName: [
  527. { required: true, message: '请选择客户名称', trigger: 'change' }
  528. ],
  529. partaLinkName: [
  530. { required: true, message: '请选择客户联系人', trigger: 'change' }
  531. ],
  532. acceptUnpack: [
  533. { required: true, message: '请选择是否接受', trigger: 'change' }
  534. ],
  535. partaTel: [
  536. {
  537. required: true,
  538. pattern: telReg,
  539. message: '请输入客户联系电话',
  540. trigger: 'blur'
  541. }
  542. ],
  543. partbName: [
  544. { required: true, message: '请输入售出方名称', trigger: 'change' }
  545. ],
  546. partbLinkName: [
  547. { required: true, message: '请输入售出方联系人', trigger: 'change' }
  548. ],
  549. partbTel: [
  550. {
  551. required: true,
  552. pattern: telReg,
  553. message: '请输入售出方联系电话',
  554. trigger: 'blur'
  555. }
  556. ],
  557. partaEmail: [
  558. { pattern: emailReg, message: '邮箱格式不正确', trigger: 'blur' }
  559. ],
  560. payAmount: [{ required: true, message: '请输入', trigger: 'blur' }]
  561. },
  562. // 提交状态
  563. loading: false,
  564. // 是否是修改
  565. isUpdate: false,
  566. enterprisePage: [],
  567. businessId: ''
  568. };
  569. },
  570. computed: {
  571. clientEnvironmentId() {
  572. return this.$store.state.user.info.clientEnvironmentId;
  573. }
  574. },
  575. created() {
  576. this.changePersonel();
  577. this.getGroupAll();
  578. this.getEnterprisePage();
  579. },
  580. methods: {
  581. setCountAmount(allPrice) {
  582. this.form.totalAmount = allPrice;
  583. this.form.payAmount = allPrice;
  584. },
  585. setTotalPlanNum(totalPlanNum) {
  586. this.$set(this.form, 'totalPlanNum', totalPlanNum);
  587. },
  588. discountInput() {
  589. this.$refs.inventoryTable.discountInputByOrder(this.form.payAmount);
  590. },
  591. // 选择负责人部门
  592. change_principalDep(id) {
  593. const info = this.groupData.find((e) => e.id == id);
  594. this.form.salesDeptName = info.name;
  595. },
  596. // 获取公司数据
  597. getGroupAll() {
  598. listOrganizations().then((list) => {
  599. this.groupData = list;
  600. this.groupTreeData = this.$util.toTreeData({
  601. data: list,
  602. idField: 'id',
  603. parentIdField: 'parentId'
  604. });
  605. });
  606. },
  607. //选择合同获取合同的详情
  608. async getDetailData(id) {
  609. this.loading = true;
  610. const data = await getDetail(id);
  611. this.loading = false;
  612. if (data) {
  613. await this.changeParent({ id: data.contractVO?.partaId }, true);
  614. this.$nextTick(() => {
  615. let { contractVO } = data;
  616. let {
  617. partaAddress,
  618. partaEmail,
  619. partaFax,
  620. partaId,
  621. partaLinkId,
  622. partaLinkName,
  623. partaName,
  624. partaTel,
  625. partbAddress,
  626. partbEmail,
  627. partbFax,
  628. partbId,
  629. partbLinkId,
  630. partbLinkName,
  631. partbName,
  632. partbTel,
  633. totalPrice,
  634. discountTotalPrice,
  635. partaUnifiedSocialCreditCode,
  636. partbUnifiedSocialCreditCode,
  637. settlementMode,
  638. settlementModeName,
  639. pricingWay,
  640. contractNo,
  641. contractNumber
  642. } = contractVO;
  643. this.form = Object.assign({}, this.form, {
  644. partaAddress,
  645. partaEmail,
  646. partaFax,
  647. partaId,
  648. partaLinkId,
  649. partaLinkName,
  650. partaName,
  651. partaTel,
  652. partbAddress,
  653. partbEmail,
  654. partbFax,
  655. partbId,
  656. partbLinkId,
  657. partbLinkName,
  658. partbName,
  659. partbTel,
  660. pricingWay,
  661. totalPrice,
  662. discountTotalPrice,
  663. partaUnifiedSocialCreditCode,
  664. partbUnifiedSocialCreditCode,
  665. totalAmount: totalPrice,
  666. payAmount: discountTotalPrice || totalPrice,
  667. receiveAddress: partaAddress,
  668. settlementMode,
  669. settlementModeName,
  670. contractNo,
  671. contractNumber
  672. });
  673. this.getLinkInfo(partaId);
  674. this.$refs.inventoryTable &&
  675. this.$refs.inventoryTable.putTableValue(data);
  676. });
  677. }
  678. },
  679. //获取订单详情
  680. async getSaleOrderDetail(id) {
  681. this.businessId = id;
  682. this.loading = true;
  683. const data = await getSaleOrderDetail(id);
  684. this.loading = false;
  685. this.form = data;
  686. if (data.partaId) {
  687. await this.changeParent({ id: data.partaId }, true);
  688. }
  689. if (data) {
  690. data.saleType = +data.saleType;
  691. this.$nextTick(() => {
  692. this.$refs.inventoryTable &&
  693. this.$refs.inventoryTable.putTableValue(data);
  694. this.$refs.typeListRef &&
  695. this.$refs.typeListRef.putTableValue(data.typedetailList);
  696. this.getLinkInfo(data.partaId);
  697. this.$store.commit('order/setContractId', data.partaId);
  698. });
  699. }
  700. },
  701. //更新联系人数据
  702. async getLinkInfo(contactId) {
  703. const data = await getcontactlink({ contactId });
  704. if (data && data?.length) {
  705. this.linkNameOptions = data;
  706. }
  707. },
  708. selectFocus() {
  709. if (this.linkNameOptions.length === 0) {
  710. return this.$message.error('请先选择名称');
  711. }
  712. },
  713. //选择下拉框
  714. onchangeLink(selectedOptions) {
  715. const option = this.linkNameOptions.find(
  716. (opt) => opt.id === selectedOptions
  717. );
  718. this.form = Object.assign({}, this.form, {
  719. partaEmail: option?.email,
  720. partaLinkName: option?.linkName || '',
  721. partaTel: option?.mobilePhone || option?.phone || '',
  722. partaLinkId: option?.id
  723. });
  724. },
  725. handHead() {
  726. let item = {
  727. id: this.form.partbLinkId
  728. };
  729. this.$refs.headRef.open(item);
  730. },
  731. //选择售出方人回调
  732. changePersonel(obj) {
  733. if (!obj) {
  734. obj = this.$store.getters.user.info;
  735. obj.id = obj.userId;
  736. }
  737. this.$set(this.form, 'partbLinkId', obj.id);
  738. this.$set(this.form, 'partbLinkName', obj.name);
  739. this.$set(this.form, 'partbTel', obj.phone);
  740. this.$set(this.form, 'partbEmail', obj.email);
  741. },
  742. //选择客户回调
  743. async changeParent(obj, isCustomerMark) {
  744. const { base, other } = await contactDetail(obj.id);
  745. const userInfo = base?.salesmanId
  746. ? await getUserDetail(base.salesmanId)
  747. : {};
  748. this.customerMark = base.serialNo;
  749. if (isCustomerMark) {
  750. return;
  751. }
  752. this.form = Object.assign({}, this.form, {
  753. partaId: base.id,
  754. partaName: base.name,
  755. partaAddress: other.addressName + other.address,
  756. partaLinkId: '',
  757. partaLinkName: '',
  758. partaEmail: '',
  759. partaTel: '',
  760. partaUnifiedSocialCreditCode: base.unifiedSocialCreditCode,
  761. customerMark: base.serialNo,
  762. receiveAddress: other.addressName + other.address
  763. });
  764. this.changePersonel(userInfo?.id ? userInfo : '');
  765. await this.getLinkInfo(obj.id);
  766. this.$nextTick(() => {
  767. let firstLink =
  768. this.linkNameOptions.find((item) => item.ifChief == 1) || {};
  769. this.form = Object.assign({}, this.form, {
  770. partaLinkId: firstLink.id || this.linkNameOptions[0]?.id,
  771. partaLinkName:
  772. firstLink.linkName || this.linkNameOptions[0]?.linkName,
  773. partaTel:
  774. firstLink.mobilePhone || this.linkNameOptions[0]?.mobilePhone
  775. });
  776. this.setProductInfo();
  777. });
  778. },
  779. setProductInfo() {
  780. if (this.$refs.inventoryTable && this.$refs.inventoryTable.form) {
  781. this.$refs.inventoryTable?.form?.datasource.forEach((item, index) => {
  782. this.$set(
  783. this.$refs.inventoryTable?.form?.datasource[index],
  784. 'customerMark',
  785. this.customerMark
  786. );
  787. });
  788. }
  789. },
  790. //选择合同回调
  791. changeContract(obj) {
  792. this.form = Object.assign({}, this.form, {
  793. contractId: obj.id,
  794. contractName: obj.contractName
  795. });
  796. this.getDetailData(obj.id);
  797. this.$store.commit('order/setContractId', obj.id);
  798. },
  799. //选择合同弹框
  800. handleContractBtn() {
  801. if (this.clearing) return;
  802. let item = {
  803. id: this.form.contractId
  804. };
  805. this.$refs.selectContractRef.open(item);
  806. },
  807. //选择项目回调
  808. async changeProject(obj) {
  809. this.projectData = obj;
  810. this.form = Object.assign({}, this.form, {
  811. projectName: obj.name,
  812. projectId: obj.id,
  813. projectCode: obj.code
  814. });
  815. if (obj.contractId) {
  816. this.changeContract({
  817. id: obj.contractId,
  818. contractName: obj.contractName
  819. });
  820. } else if (obj.contactId) {
  821. this.changeParent({ id: obj.contactId });
  822. }
  823. },
  824. //选择项目弹框
  825. handleProjectBtn() {
  826. if (this.clearing) return;
  827. let item = {
  828. id: this.form.projectId
  829. };
  830. this.$refs.selectProjectRef.open(item);
  831. },
  832. //清除合同
  833. clearContrcat() {
  834. this.clearing = true;
  835. let {
  836. id,
  837. saleType,
  838. saleTypeName,
  839. // deliveryDate,
  840. orderFiles,
  841. remark
  842. } = this.form;
  843. this.form = Object.assign({}, copyObj(this.formDef), {
  844. id,
  845. saleType,
  846. saleTypeName,
  847. // deliveryDate,
  848. orderFiles,
  849. remark
  850. });
  851. this.projectData = {};
  852. this.$store.commit('order/setContractId', '');
  853. this.$refs.inventoryTable.putTableValue([]);
  854. setTimeout(() => {
  855. this.clearing = false;
  856. }, 500);
  857. },
  858. handParent() {
  859. if (this.form.contractId) {
  860. return this.$message.error('选择了合同不能更改客户名称');
  861. }
  862. let item = {
  863. id: this.form.contactId
  864. };
  865. this.$refs.parentRef.open(item);
  866. },
  867. listFormatte(data) {
  868. return data.filter((item) => item.dictCode !== 0);
  869. },
  870. //打开新增编辑弹框
  871. async open(type, row, contactCategoryId) {
  872. this.title = type === 'add' ? '新增' : '修改';
  873. this.row = row;
  874. if (this.enterprisePage.length == 0) {
  875. await this.getEnterprisePage();
  876. }
  877. this.visible = true;
  878. if (type == 'add') {
  879. this.isUpdate = false;
  880. if (this.enterprisePage.length > 0) {
  881. this.form.partbName = this.enterprisePage[0].name;
  882. this.form.partbUnifiedSocialCreditCode =
  883. this.enterprisePage[0].unifiedSocialCreditCode;
  884. this.form.partbFax = this.enterprisePage[0].fax;
  885. this.form.partbAddress = this.enterprisePage[0].address;
  886. }
  887. if (this.contactData.id) {
  888. this.changeParent({ id: this.contactData.id });
  889. }
  890. //嘉实默认值
  891. if (this.clientEnvironmentId == 5) {
  892. this.form.saleType = 2;
  893. this.form.needProduce = 0;
  894. this.form.settlementMode = '6';
  895. }
  896. //宝悦默认值
  897. if (this.clientEnvironmentId == 4) {
  898. this.form.needProduce = 4;
  899. }
  900. } else {
  901. this.isUpdate = true;
  902. this.getSaleOrderDetail(row.id);
  903. }
  904. },
  905. needProduceChange() {
  906. this.$nextTick(() => {
  907. this.form.totalAmount = 0;
  908. this.form.payAmount = 0;
  909. this.$refs.inventoryTable &&
  910. this.$refs.inventoryTable.putTableValue({});
  911. this.$refs.typeListRef && this.$refs.typeListRef.putTableValue([]);
  912. });
  913. },
  914. //从合同页面新增订单
  915. async contractOpen(row) {
  916. this.title = '新增';
  917. this.visible = true;
  918. this.isUpdate = false;
  919. if (this.enterprisePage.length == 0) {
  920. await this.getEnterprisePage();
  921. }
  922. if (this.enterprisePage.length > 0) {
  923. this.form.partbName = this.enterprisePage[0].name;
  924. this.form.partbUnifiedSocialCreditCode =
  925. this.enterprisePage[0].unifiedSocialCreditCode;
  926. this.form.partbFax = this.enterprisePage[0].fax;
  927. this.form.partbAddress = this.enterprisePage[0].address;
  928. }
  929. await this.changeContract(row);
  930. },
  931. getEnterprisePage() {
  932. enterprisePage({
  933. pageNum: 1,
  934. size: 100
  935. }).then((res) => {
  936. this.enterprisePage = [];
  937. this.enterprisePage.push(...res.list);
  938. });
  939. },
  940. getEnterprise() {
  941. let data = this.enterprisePage.find(
  942. (item) => item.name == this.form.quoteName
  943. );
  944. this.form.partbName = data.name;
  945. this.form.partbUnifiedSocialCreditCode = data.unifiedSocialCreditCode;
  946. this.form.partbFax = data.fax;
  947. this.form.partbAddress = data.address;
  948. },
  949. settlementModeChange(info) {
  950. this.form.settlementModeName = info.dictValue;
  951. },
  952. ifChiefChange(value, idx) {
  953. if (value === 1) {
  954. this.tableLinkData.forEach((e) => (e.ifChief = 0));
  955. this.tableLinkData[idx].ifChief = 1;
  956. }
  957. },
  958. getValidate() {
  959. let arr = [
  960. new Promise((resolve, reject) => {
  961. this.$refs.form.validate((valid) => {
  962. if (!valid) {
  963. reject(false);
  964. } else {
  965. resolve(true);
  966. }
  967. });
  968. })
  969. ];
  970. if (this.form.needProduce != 4) {
  971. arr.push(
  972. new Promise((resolve, reject) => {
  973. this.$refs.inventoryTable.validateForm((valid) => {
  974. if (!valid) {
  975. reject(false);
  976. } else {
  977. resolve(true);
  978. }
  979. });
  980. })
  981. );
  982. }
  983. return Promise.all(arr);
  984. },
  985. async save(type) {
  986. try {
  987. await this.getValidate();
  988. // 表单验证通过,执行保存操作
  989. this.loading = true;
  990. let isTemporary = [];
  991. if (!this.isUpdate) {
  992. delete this.form.id;
  993. }
  994. let commitData = Object.assign({}, this.form, {
  995. productList: this.$refs?.inventoryTable?.getTableValue() || [],
  996. typedetailList: this.$refs?.typeListRef?.getTableValue() || [],
  997. saleTypeName: this.getDictValue('销售类型', this.form.saleType)
  998. });
  999. commitData.productList.forEach((item) => {
  1000. if (!item.productCode) {
  1001. isTemporary.push(item.productName);
  1002. }
  1003. });
  1004. if (isTemporary.length > 0) {
  1005. this.$message.error(
  1006. isTemporary.toString() +
  1007. '是临时产品,无法创建订单,请先去主数据维护!'
  1008. );
  1009. return;
  1010. }
  1011. this.interfaceCall(commitData, type);
  1012. } catch (error) {
  1013. console.log(error);
  1014. // 表单验证未通过,不执行保存操作
  1015. }
  1016. },
  1017. interfaceCall(commitData, type) {
  1018. let API = this.isUpdate ? UpdateInformation : addInformation;
  1019. API(commitData)
  1020. .then((res) => {
  1021. this.loading = false;
  1022. updateRelationStatus([this.form.partaId]);
  1023. if (this.form.contractId) {
  1024. updateContractStatus([this.form.contractId]);
  1025. }
  1026. if (type === 'sub') {
  1027. this.saleOrderSubmit(res, commitData);
  1028. return;
  1029. } else {
  1030. this.$message.success('操作成功');
  1031. }
  1032. this.cancel();
  1033. this.$emit('done');
  1034. })
  1035. .catch((e) => {
  1036. //this.loading = false;
  1037. });
  1038. },
  1039. async saleOrderSubmit(res, commitData) {
  1040. const data = await getSaleOrderDetail(this.businessId || res);
  1041. this.processSubmitDialogFlag = true;
  1042. let businessType =
  1043. data.needProduce == 1
  1044. ? '有客户生产性订单'
  1045. : data.needProduce == 2
  1046. ? '无客户生产性订单'
  1047. : data.needProduce == 4
  1048. ? '不定向订单'
  1049. : '库存式订单';
  1050. this.$nextTick(() => {
  1051. let params = {
  1052. businessId: data.id,
  1053. businessKey: 'sales_order_approve',
  1054. formCreateUserId: data.createUserId,
  1055. variables: {
  1056. businessCode: data.orderNo,
  1057. businessName: data.partaName,
  1058. businessType: businessType
  1059. }
  1060. };
  1061. this.$refs.processSubmitDialogRef.init(params);
  1062. });
  1063. },
  1064. reload() {
  1065. this.cancel();
  1066. this.$emit('done');
  1067. },
  1068. cancel() {
  1069. this.$nextTick(() => {
  1070. // 关闭后,销毁所有的表单数据
  1071. this.$refs['otherForm'] && this.$refs['otherForm'].resetFields();
  1072. this.$refs['formRef'] && this.$refs['formRef'].resetFields();
  1073. this.$store.commit('order/clearUserData');
  1074. this.form = copyObj(this.formDef);
  1075. this.visible = false;
  1076. this.projectData = {};
  1077. });
  1078. },
  1079. //查找合同分类对应name
  1080. findNameById(tree, targetId) {
  1081. for (let i = 0; i < tree.length; i++) {
  1082. const node = tree[i];
  1083. if (node.id === targetId) {
  1084. return node.name;
  1085. }
  1086. if (node.children && node.children.length > 0) {
  1087. const name = this.findNameById(node.children, targetId);
  1088. if (name) {
  1089. return name;
  1090. }
  1091. }
  1092. }
  1093. return null;
  1094. }
  1095. }
  1096. };
  1097. </script>
  1098. <style scoped lang="scss">
  1099. .TotalAmount {
  1100. font-size: 16px;
  1101. padding-right: 30px;
  1102. }
  1103. .totalPlanNum {
  1104. :deep(.el-input-group__append) {
  1105. width: 160px;
  1106. }
  1107. }
  1108. </style>