index.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814
  1. <template>
  2. <a-card>
  3. <a-form class="smart-query-form" ref="stepFormRef" labelWrap :label-col="labelCol" :model="formState"
  4. :rules="formRules">
  5. <div class="approval-steps">
  6. <div>
  7. <div class="basic-title">
  8. <div class="basic-title-left">
  9. <div class="basic-title-line"></div>
  10. <span class="basic-title-text">线索登记</span>
  11. </div>
  12. <div class="basic-title-right">
  13. <a-button type="primary" @click="reset">重置</a-button>
  14. <a-button type="primary" @click="submit">提交</a-button>
  15. </div>
  16. </div>
  17. <div class="steps-content">
  18. <a-row :gutter="16">
  19. <a-col :span="8">
  20. <a-form-item label="项目类型" name="projectType">
  21. <a-select
  22. v-model:value="formState.projectType"
  23. placeholder="请选择"
  24. :options="serviceProviderOptions"
  25. />
  26. </a-form-item>
  27. </a-col>
  28. <a-col :span="16">
  29. <a-form-item label="线索名称">
  30. <a-input
  31. v-model:value="formState.clueName"
  32. placeholder="请输入线索名称"
  33. />
  34. </a-form-item>
  35. </a-col>
  36. </a-row>
  37. <a-row :gutter="16">
  38. <a-col :span="24">
  39. <a-form-item label="项目名称" name="projectName">
  40. <a-input
  41. v-model:value="formState.projectName"
  42. placeholder="自动生成(甲方-分厂-几期-机组-工程属性)"
  43. />
  44. </a-form-item>
  45. </a-col>
  46. </a-row>
  47. <a-row :gutter="16">
  48. <a-col :span="8">
  49. <a-form-item label="线索来源" name="clueSource">
  50. <a-select
  51. v-model:value="formState.clueSource"
  52. placeholder="请选择线索来源"
  53. :options="clueSourceOptions"
  54. @change="handleClueSourceChange"
  55. />
  56. </a-form-item>
  57. </a-col>
  58. <a-col :span="8">
  59. <a-form-item :label="dynamicField.label" :name="dynamicField.name">
  60. <a-select
  61. v-if="formState.clueSource === 'serviceProvider'"
  62. v-model:value="formState.providerName"
  63. :placeholder="dynamicField.placeholder"
  64. :options="serviceProviderOptions"
  65. />
  66. <a-select
  67. v-else-if="formState.clueSource === 'marketActivity'"
  68. v-model:value="formState.providerName"
  69. :placeholder="dynamicField.placeholder"
  70. :options="activityOptions"
  71. />
  72. <a-input
  73. v-else-if="formState.clueSource === 'referral'"
  74. v-model:value="formState.providerName"
  75. :placeholder="dynamicField.placeholder"
  76. />
  77. <a-select
  78. v-else
  79. disabled
  80. placeholder="请先选择线索来源"
  81. />
  82. </a-form-item>
  83. </a-col>
  84. <a-col :span="8">
  85. <a-form-item label="工程属性" name="engineeringAttribute">
  86. <a-select
  87. v-model:value="formState.engineeringAttribute"
  88. placeholder="请选择"
  89. :options="ownerUnitOptions1"
  90. />
  91. </a-form-item>
  92. </a-col>
  93. </a-row>
  94. <a-row :gutter="16">
  95. <a-col :span="8">
  96. <a-form-item label="地区" name="countryRegion">
  97. <a-cascader
  98. v-model:value="formState.countryRegion"
  99. :options="regionOptions"
  100. placeholder="请选择"
  101. />
  102. </a-form-item>
  103. </a-col>
  104. <a-col :span="8">
  105. <a-form-item label="省市区" name="province">
  106. <a-cascader
  107. v-model:value="formState.province"
  108. :options="regionOptions"
  109. placeholder="请选择"
  110. />
  111. </a-form-item>
  112. </a-col>
  113. <a-col :span="8">
  114. <a-form-item label="项目地址">
  115. <a-input
  116. v-model:value="formState.projectAddress"
  117. placeholder="请输入"
  118. />
  119. </a-form-item>
  120. </a-col>
  121. </a-row>
  122. <a-row :gutter="16">
  123. <a-col :span="12">
  124. <a-form-item label="业主单位">
  125. <div class="flex-container">
  126. <a-select
  127. v-model:value="formState.ownerUnit"
  128. placeholder="请选择"
  129. style="flex: 1; margin-right: 8px"
  130. :options="ownerUnitOptions"
  131. :disabled="isAnyPartyASelected && !formState.isOwnerPartyA"
  132. @change="handleOwnerUnitChange"
  133. />
  134. <a-radio-group
  135. v-model:value="formState.isOwnerPartyA"
  136. button-style="solid"
  137. @change="() => handlePartyAChange('owner')"
  138. >
  139. <a-radio-button value="yes">甲方</a-radio-button>
  140. </a-radio-group>
  141. </div>
  142. </a-form-item>
  143. </a-col>
  144. <a-col :span="12">
  145. <a-form-item label="设计单位">
  146. <div class="flex-container">
  147. <a-select
  148. v-model:value="formState.designFlats"
  149. placeholder="请选择"
  150. style="flex: 1; margin-right: 8px"
  151. :options="ownerUnitOptions"
  152. :disabled="isAnyPartyASelected && !formState.isDesignPartyA"
  153. />
  154. <a-radio-group
  155. v-model:value="formState.isDesignPartyA"
  156. button-style="solid"
  157. @change="() => handlePartyAChange('design')"
  158. >
  159. <a-radio-button value="yes">甲方</a-radio-button>
  160. </a-radio-group>
  161. </div>
  162. </a-form-item>
  163. </a-col>
  164. </a-row>
  165. <a-row :gutter="16">
  166. <a-col :span="12">
  167. <a-form-item label="总承包单位">
  168. <div class="flex-container">
  169. <a-select
  170. v-model:value="formState.generalContractingFlats"
  171. placeholder="请选择"
  172. style="flex: 1; margin-right: 8px"
  173. :options="ownerUnitOptions"
  174. :disabled="isAnyPartyASelected && !formState.isTrustPartyA"
  175. />
  176. <a-radio-group
  177. v-model:value="formState.isTrustPartyA"
  178. button-style="solid"
  179. @change="() => handlePartyAChange('trust')"
  180. >
  181. <a-radio-button value="yes">甲方</a-radio-button>
  182. </a-radio-group>
  183. </div>
  184. </a-form-item>
  185. </a-col>
  186. <a-col :span="12">
  187. <a-form-item label="招标代理单位">
  188. <div class="flex-container">
  189. <a-select
  190. v-model:value="formState.investmentAgentFlats"
  191. placeholder="请选择"
  192. style="flex: 1; margin-right: 8px"
  193. :options="ownerUnitOptions"
  194. :disabled="isAnyPartyASelected && !formState.isBiddingAgentPartyA"
  195. />
  196. <a-radio-group
  197. v-model:value="formState.isBiddingAgentPartyA"
  198. button-style="solid"
  199. @change="() => handlePartyAChange('biddingAgent')"
  200. >
  201. <a-radio-button value="yes">甲方</a-radio-button>
  202. </a-radio-group>
  203. </div>
  204. </a-form-item>
  205. </a-col>
  206. </a-row>
  207. <a-row :gutter="16">
  208. <a-col :span="8">
  209. <a-form-item label="是否联合体" name="complex">
  210. <a-select
  211. v-model:value="formState.complex"
  212. placeholder="请选择"
  213. :options="serviceProviderOptions"
  214. />
  215. </a-form-item>
  216. </a-col>
  217. <a-col :span="16">
  218. <a-form-item label="联合体情况" name="complexDescription">
  219. <a-input
  220. v-model:value="formState.complexDescription"
  221. placeholder="请输入"
  222. />
  223. </a-form-item>
  224. </a-col>
  225. </a-row>
  226. <a-row :gutter="16">
  227. <a-col :span="8">
  228. <a-form-item label="项目所属行业" name="projectBelongIndustry">
  229. <a-select
  230. v-model:value="formState.projectBelongIndustry"
  231. placeholder="请选择"
  232. :options="ownerUnitOptions5"
  233. />
  234. </a-form-item>
  235. </a-col>
  236. <a-col :span="8">
  237. <a-form-item label="业务类型" name="businessType">
  238. <a-select
  239. v-model:value="formState.businessType"
  240. placeholder="请选择"
  241. :options="ownerUnitOptions4"
  242. />
  243. </a-form-item>
  244. </a-col>
  245. <a-col :span="8">
  246. <a-form-item label="招标平台" name="tenderPlatform">
  247. <a-input v-model:value="formState.tenderPlatform" placeholder="请输入"/>
  248. </a-form-item>
  249. </a-col>
  250. </a-row>
  251. <a-row :gutter="16">
  252. <a-col :span="8">
  253. <a-form-item label="项目总概算" name="projectBudget">
  254. <a-input v-model:value="formState.projectBudget" placeholder="自动生成(各标段概算之和)"/>
  255. </a-form-item>
  256. </a-col>
  257. <a-col :span="8">
  258. <a-form-item label="项目资金来源" name="projectMoneySource">
  259. <a-select
  260. v-model:value="formState.projectMoneySource"
  261. placeholder="请选择"
  262. :options="ownerUnitOptions3"
  263. />
  264. </a-form-item>
  265. </a-col>
  266. <a-col :span="8">
  267. <a-form-item label="分厂/几期/机组" name="factory">
  268. <a-input v-model:value="formState.factory" placeholder="请输入"/>
  269. </a-form-item>
  270. </a-col>
  271. </a-row>
  272. <a-row :gutter="16">
  273. <a-col :span="24">
  274. <a-form-item label="项目背景" name="projectBackground" class="smart-query-form-item">
  275. <a-input v-model:value="formState.projectBackground" placeholder="请输入"/>
  276. </a-form-item>
  277. </a-col>
  278. </a-row>
  279. <a-row :gutter="16">
  280. <a-col :span="24">
  281. <a-form-item label="项目阶段" name="projectStage" class="smart-query-form-item">
  282. <a-input v-model:value="formState.projectStage" placeholder="请输入"/>
  283. </a-form-item>
  284. </a-col>
  285. </a-row>
  286. <a-row :gutter="16">
  287. <a-col :span="8">
  288. <a-form-item label="归属营销人员" class="smart-query-form-item">
  289. <a-select
  290. v-model:value="formState.belongMarketer"
  291. placeholder="请选择"
  292. :options="ownerUnitOptions5"
  293. />
  294. </a-form-item>
  295. </a-col>
  296. </a-row>
  297. </div>
  298. </div>
  299. <div>
  300. <div class="basic-title">
  301. <div class="basic-title-left">
  302. <div class="basic-title-line"></div>
  303. <span class="basic-title-text">协作团队</span>
  304. </div>
  305. </div>
  306. <div class="steps-content">
  307. <bs-table v-bind="tableOptions">
  308. </bs-table>
  309. <a-button type="dashed" @click="showModal" block>
  310. <plus-outlined/>
  311. 添加成员
  312. </a-button>
  313. <a-modal
  314. v-model:visible="visible"
  315. title="添加团队成员"
  316. @ok="handleOk"
  317. @cancel="handleCancel"
  318. >
  319. <a-form layout="vertical">
  320. <a-form-item label="营销经理">
  321. <a-input v-model:value="formStates.manager" />
  322. </a-form-item>
  323. <a-form-item label="营销团队">
  324. <a-input v-model:value="formStates.team" />
  325. </a-form-item>
  326. <a-form-item label="支持说明">
  327. <a-textarea v-model:value="formStates.description" />
  328. </a-form-item>
  329. </a-form>
  330. </a-modal>
  331. <!-- <bs-table></bs-table>-->
  332. <!-- <a-table-->
  333. <!-- :columns="teamColumns"-->
  334. <!-- :data-source="teamData"-->
  335. <!-- :pagination="false"-->
  336. <!-- bordered-->
  337. <!-- >-->
  338. <!-- <template #bodyCell="{ column, record }">-->
  339. <!-- <template v-if="column.key === 'action'">-->
  340. <!-- <a-button type="link" danger @click="removeTeam(record.key)">删除</a-button>-->
  341. <!-- </template>-->
  342. <!-- </template>-->
  343. <!-- </a-table>-->
  344. </div>
  345. </div>
  346. <div>
  347. <div class="basic-title">
  348. <div class="basic-title-left">
  349. <div class="basic-title-line"></div>
  350. <span class="basic-title-text">其他信息</span>
  351. </div>
  352. </div>
  353. <div class="steps-content">
  354. <a-row :gutter="16" class="smart-query-form-row">
  355. <a-col :span="24">
  356. <a-form-item label="附件">
  357. <a-upload-dragger
  358. v-model:file-list="fileList"
  359. name="file"
  360. :multiple="true"
  361. :before-upload="beforeUpload"
  362. @change="handleUploadChange"
  363. :accept="'.png,.jpg,.doc,.pdf,.mp4,.avi'"
  364. >
  365. <p class="ant-upload-drag-icon">
  366. <inbox-outlined/>
  367. </p>
  368. <p class="ant-upload-text">点击或将文件拖拽到这里上传</p>
  369. <p class="ant-upload-hint">支持:png、jpg、doc、pdf、mp4、avi...</p>
  370. </a-upload-dragger>
  371. </a-form-item>
  372. </a-col>
  373. </a-row>
  374. </div>
  375. </div>
  376. </div>
  377. </a-form>
  378. </a-card>
  379. </template>
  380. <script setup lang="jsx">
  381. import {reactive, ref, computed} from 'vue';
  382. const visible = ref(false);
  383. import {
  384. PlusOutlined,
  385. InboxOutlined,
  386. } from '@ant-design/icons-vue';
  387. import {useRouter} from 'vue-router';
  388. import {message} from 'ant-design-vue';
  389. import _ from 'lodash';
  390. import BsTable, {useBsTable} from '/@/components/BsUi/Table/index.js';
  391. const stepFormRef = ref(null);
  392. const router = useRouter();
  393. const formStates = reactive({
  394. manager: '',
  395. team: '',
  396. description: ''
  397. });
  398. // --------------------- 数据 ---------------------
  399. // 表单数据
  400. const formState = reactive({
  401. projectType: '',
  402. clueName: '',
  403. projectName: '',
  404. providerName: '',
  405. engineeringAttribute: '',
  406. countryRegion: '',
  407. province: '',
  408. designFlats: '',
  409. generalContractingFlats: '',
  410. investmentAgentFlats: '',
  411. complex: '',
  412. complexDescription: '',
  413. projectBelongIndustry: '',
  414. businessType: '',
  415. tenderPlatform: '',
  416. projectBudget: '',
  417. projectMoneySource: '',
  418. factory: '',
  419. projectBackground: '',
  420. projectStage: '',
  421. belongMarketer: '',
  422. attachment: '',
  423. projectAddress: '',
  424. clueSource: 'serviceProvider',
  425. isOwnerPartyA: undefined,
  426. isDesignPartyA: undefined,
  427. isTrustPartyA: undefined,
  428. isBiddingAgentPartyA: undefined,
  429. serviceProvider: undefined,
  430. region: undefined,
  431. teamDTOList: []
  432. });
  433. // --------------------- 校验规则 ---------------------
  434. const formRules = {
  435. // customerName: [{ required: true, message: '请输入客户名称', trigger: 'change' }],
  436. };
  437. const {
  438. tableOptions,
  439. setTablePropsValue: setValue,
  440. getTablePropsValue: getValue,
  441. } = useBsTable({
  442. tableOptions: {
  443. // url:''
  444. gridOptions: {
  445. loading: false,
  446. displayToolbar:'123',
  447. data: [],
  448. columns: [
  449. {
  450. field: 'key',
  451. title: '序号',
  452. },
  453. {
  454. field: 'manager',
  455. title: '营销经理',
  456. },
  457. {
  458. field: 'team',
  459. title: '营销团队',
  460. },
  461. {
  462. field: 'description',
  463. title: '支持说明',
  464. },
  465. {
  466. field: 'opt',
  467. title: '操作',
  468. width: '120px',
  469. fixed: 'right',
  470. align: 'center',
  471. slots: {
  472. default({row, column}) {
  473. return (
  474. <a-button
  475. type='text'
  476. size='small'
  477. onClick={() => {
  478. deleteRow(row.key);
  479. }}
  480. >
  481. 删除
  482. </a-button>
  483. );
  484. },
  485. },
  486. },
  487. ],
  488. },
  489. toolbarConfig: {
  490. enable: false,
  491. },
  492. pagerConfig: {
  493. enabled: true,
  494. isFixed: false,
  495. pageSize: 10,
  496. pageNum: 1,
  497. total: 0,
  498. },
  499. },
  500. });
  501. const showModal = () => {
  502. formStates.manager = '';
  503. formStates.team = '';
  504. formStates.description = '';
  505. visible.value = true;
  506. };
  507. // 确认添加
  508. const handleOk = () => {
  509. const currentData = getValue('gridOptions.data') || [];
  510. const newRow = {
  511. key: Date.now().toString(), // 生成唯一key
  512. manager: formStates.manager,
  513. team: formStates.team,
  514. description: formStates.description
  515. };
  516. setValue('gridOptions.data', [...currentData, newRow]);
  517. console.log(setValue('gridOptions.data', [...currentData, newRow]))
  518. resetForm();
  519. visible.value = false;
  520. };
  521. // 取消
  522. const handleCancel = () => {
  523. resetForm();
  524. visible.value = false;
  525. };
  526. // 重置表单
  527. const resetForm = () => {
  528. formState.manager = '';
  529. formState.team = '';
  530. formState.description = '';
  531. };
  532. // 删除行
  533. const deleteRow = (key) => {
  534. const currentData = getValue('gridOptions.data') || [];
  535. const newData = currentData.filter(item => item.key !== key);
  536. setValue('gridOptions.data', newData);
  537. };
  538. const addTeam = () => {
  539. const newKey = String(teamData.value.length + 1);
  540. teamData.value.push({
  541. key: newKey,
  542. manager: '',
  543. team: '',
  544. support: '',
  545. });
  546. };
  547. const dynamicField = computed(() => {
  548. switch (formState.clueSource) {
  549. case 'serviceProvider':
  550. return {
  551. label: '服务商名称',
  552. name: 'serviceProvider',
  553. placeholder: '请选择服务商'
  554. };
  555. case 'marketActivity':
  556. return {
  557. label: '活动名称',
  558. name: 'activityName',
  559. placeholder: '请选择活动'
  560. };
  561. case 'referral':
  562. return {
  563. label: '介绍备注',
  564. name: 'referralNote',
  565. placeholder: '请输入介绍备注'
  566. };
  567. default:
  568. return {
  569. label: '请选择',
  570. name: '',
  571. placeholder: '请先选择线索来源'
  572. };
  573. }
  574. });
  575. const handleClueSourceChange = () => {
  576. // 清空相关字段的值
  577. formState.serviceProvider = undefined;
  578. formState.activityName = undefined;
  579. formState.referralNote = undefined;
  580. };
  581. const isAnyPartyASelected = computed(() => {
  582. return (
  583. formState.isOwnerPartyA === 'yes' ||
  584. formState.isDesignPartyA === 'yes' ||
  585. formState.isTrustPartyA === 'yes' ||
  586. formState.isBiddingAgentPartyA === 'yes'
  587. );
  588. });
  589. // 处理单位选择变化
  590. const handleOwnerUnitChange = (value) => {
  591. if (value) {
  592. formState.isOwnerPartyA = 'yes';
  593. resetOtherPartyAs('owner');
  594. }
  595. };
  596. // 处理甲方选择变化
  597. const handlePartyAChange = (currentType) => {
  598. console.log(currentType, 'currentType')
  599. if (formState[`is${capitalizeFirstLetter(currentType)}PartyA`] === 'yes') {
  600. resetOtherPartyAs(currentType);
  601. }
  602. };
  603. const resetOtherPartyAs = (currentType) => {
  604. const types = ['owner', 'design', 'trust', 'biddingAgent'];
  605. types.forEach(type => {
  606. if (type !== currentType) {
  607. formState[`is${capitalizeFirstLetter(type)}PartyA`] = undefined;
  608. formState[`${type}Unit`] = undefined;
  609. }
  610. });
  611. };
  612. // 首字母大写辅助函数
  613. const capitalizeFirstLetter = (string) => {
  614. return string.charAt(0).toUpperCase() + string.slice(1);
  615. };
  616. const removeTeam = (key) => {
  617. teamData.value = teamData.value.filter(item => item.key !== key);
  618. };
  619. const labelCol = {style: {width: '110px'}};
  620. // ----------------------- 上传附件 ----------------------------
  621. // 已上传的附件列表
  622. const defaultFileList = ref([]);
  623. function changeAttachment(fileList) {
  624. defaultFileList.value = fileList;
  625. formState.attachment = _.isEmpty(fileList) ? [] : fileList;
  626. }
  627. // ----------------------- 步骤相关 ---------------------------
  628. const submit = () => {
  629. router.push('/market-manage/external-manage/clue-management/clue-list');
  630. // stepFormRef.value
  631. // .validateFields()
  632. // .then((values) => {
  633. // Modal.confirm({
  634. // title: '提示',
  635. // content: '确定要提交吗?',
  636. // okText: '确认',
  637. // onOk() {
  638. // postFormData();
  639. // },
  640. // cancelText: '取消',
  641. // onCancel() {
  642. // },
  643. // });
  644. // })
  645. // .catch((error) => {
  646. // console.log('step1_error', error);
  647. // });
  648. };
  649. const postFormData = () => {
  650. // customerApi.CustomerAddition(formModel).then((res) => {
  651. // message.success('提交成功');
  652. // router.push({path: '/teamwork/customer-manage/customer-list'});
  653. // });
  654. };
  655. //------------------------地区-------------------------------------
  656. // 文件上传
  657. const fileList = ref([]);
  658. const handleUploadChange = (info) => {
  659. let fileList = [...info.fileList];
  660. fileList = fileList.slice(-5); // 限制上传数量
  661. fileList.value = fileList;
  662. };
  663. const beforeUpload = (file) => {
  664. const isLt10M = file.size / 1024 / 1024 < 10;
  665. if (!isLt10M) {
  666. message.error('文件大小不能超过10MB!');
  667. return false;
  668. }
  669. return true;
  670. };
  671. const clueSourceOptions = ref([
  672. {value: 'serviceProvider', label: '服务商提供'},
  673. {value: 'marketActivity', label: '市场活动'},
  674. {value: 'referral', label: '转介绍'}
  675. ]);
  676. const serviceProviderOptions = ref([
  677. {value: 'provider1', label: '项目类'},
  678. {value: 'provider2', label: '贸易类'},
  679. ]);
  680. // 活动选项
  681. const activityOptions = ref([
  682. {value: 'activity1', label: '国内客户'},
  683. {value: 'activity2', label: '国外客户'}
  684. ]);
  685. const ownerUnitOptions = ref([
  686. {value: 'owner1', label: '国内客户'},
  687. {value: 'owner2', label: '国外客户'},
  688. ]);
  689. const ownerUnitOptions1 = ref([
  690. {value: 'owner1', label: '新建'},
  691. {value: 'owner2', label: '旧改'},
  692. ]);
  693. const ownerUnitOptions3 = ref([
  694. {value: 'owner1', label: '客户提供'},
  695. ]);
  696. const ownerUnitOptions4 = ref([
  697. {value: 'owner1', label: '业务一部'},
  698. {value: 'owner2', label: '业务二部'},
  699. {value: 'owner3', label: '业务三部'},
  700. ]);
  701. const ownerUnitOptions5 = ref([
  702. {value: 'owner1', label: '政府机构'},
  703. {value: 'owner2', label: '民营企业'},
  704. ]);
  705. const regionOptions = ref([
  706. {
  707. value: 'zhejiang',
  708. label: '浙江省',
  709. children: [
  710. {
  711. value: 'hangzhou',
  712. label: '杭州市',
  713. children: [
  714. {value: 'xihu', label: '西湖区'},
  715. ],
  716. },
  717. ],
  718. },
  719. // 其他省份...
  720. ]);
  721. </script>
  722. <style scoped lang="less">
  723. .flex-container {
  724. display: flex;
  725. align-items: center;
  726. }
  727. .approval-steps {
  728. display: flex;
  729. flex-direction: column;
  730. gap: 20px;
  731. // width: 1350px;
  732. margin: 0 auto;
  733. .basic-title {
  734. display: flex;
  735. justify-content: space-between;
  736. align-items: center;
  737. width: 100%;
  738. height: 40px;
  739. padding: 0 16px 4px 16px;
  740. border-bottom: 2px solid #f6f6f6;
  741. background: #ffffff;
  742. border-top-left-radius: 8px;
  743. border-top-right-radius: 8px;
  744. .basic-title-left {
  745. height: 100%;
  746. display: flex;
  747. align-items: center;
  748. .basic-title-line {
  749. width: 4px;
  750. height: 20px;
  751. border-radius: 4px;
  752. background: #267ef8;
  753. margin-right: 5px;
  754. }
  755. .basic-title-text {
  756. font-size: 16px;
  757. font-style: normal;
  758. font-weight: 600;
  759. line-height: 20px;
  760. }
  761. }
  762. .basic-title-right {
  763. display: flex;
  764. gap: 10px;
  765. }
  766. }
  767. .steps-content {
  768. margin-top: 14px;
  769. }
  770. .steps-action {
  771. display: flex;
  772. justify-content: center;
  773. margin-top: 18px;
  774. }
  775. }
  776. </style>