addDialog.vue 41 KB

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