LossesEdit.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. <script setup lang="tsx">
  2. import { onMounted, reactive, ref } from 'vue'
  3. import { ContentWrap } from '@/components/ContentWrap'
  4. import {
  5. ElInput,
  6. FormInstance,
  7. // ElSwitch,
  8. ElTabPane,
  9. ElTabs,
  10. ElForm,
  11. ElFormItem,
  12. ElMessage,
  13. ElSelect,
  14. ElOption,
  15. ElTableColumn,
  16. ElTable,
  17. ElDrawer
  18. } from 'element-plus'
  19. import { useRoute, useRouter } from 'vue-router'
  20. import { goodsData, attrsValue } from '@/api/goods/types'
  21. import { AttrBaseItem } from '@/api/goods/types'
  22. import { UpImgButtom } from '@/components/UpFile'
  23. import { outData } from '@/api/erp/types'
  24. import {
  25. getStoreList,
  26. getStoreUser,
  27. getOutGood,
  28. storePutLoss,
  29. getLossType,
  30. getStoreGood,
  31. warePutLoss
  32. } from '@/api/erp'
  33. const pageTitle = ref('添加')
  34. const { params } = useRoute()
  35. const { push } = useRouter()
  36. const actinoTabIndex = ref(1)
  37. const selfBuild = reactive<outData>({
  38. type: 1,
  39. store_id: '',
  40. wid: '',
  41. create_admin_id: '',
  42. up_store_id: '',
  43. up_wid: '',
  44. product_list: []
  45. })
  46. const hzBuild = reactive<outData>({
  47. create_admin_id: '',
  48. store_id: '',
  49. up_store_id: '',
  50. product_list: []
  51. })
  52. const formData = reactive<goodsData & { attrs_value: attrsValue[]; keyword: string[] }>({
  53. // bar_code: '',
  54. product_type: 0,
  55. store_id: '',
  56. id: 0,
  57. store_name: '',
  58. video_open: 0,
  59. video_link: '',
  60. slider_image: [],
  61. image: [],
  62. store_info: '',
  63. keyword: [],
  64. cate_id: [],
  65. sales: 0,
  66. ficti: 0,
  67. spec_type: 0,
  68. is_show: 1,
  69. limit_num: 0,
  70. is_limit: 0,
  71. limit_type: 0,
  72. is_police: 0,
  73. shelf_life: 0,
  74. attrs: [],
  75. attrs_value: [], // 初始化为空数组
  76. sort: 0,
  77. description: '',
  78. show_type: 0,
  79. is_verify: 0,
  80. pay_qudou: 0,
  81. is_vip_product: 0,
  82. is_weigh: 0,
  83. specs: [],
  84. cost: 0
  85. })
  86. const attrs_value = reactive<
  87. attrsValue & {
  88. image: string[]
  89. }
  90. >({
  91. suk: '默认',
  92. image: [],
  93. stock: 0,
  94. detail: {},
  95. price: 0,
  96. ot_price: 0,
  97. cost: 0
  98. })
  99. const rules = reactive({
  100. create_admin_id: [{ required: true, message: '请选择创建人', trigger: 'change' }],
  101. wid: [{ required: true, message: '请选择仓库', trigger: 'change' }],
  102. store_id: [{ required: true, message: '请选择门店', trigger: 'change' }],
  103. })
  104. const formRef = ref<FormInstance>()
  105. const formRefs = ref<FormInstance>()
  106. const checkGoodss = ref<any[]>([])
  107. /**
  108. * 保存表单数据
  109. * 此函数在用户提交表单时被触发,它首先验证表单数据的有效性,如果有效则处理数据并调用相应的API进行保存
  110. * @param {FormInstance | undefined} formEl - 表单实例,用于表单验证和获取表单数据
  111. * @returns {Promise<Array>} - 返回一个空数组,当前函数没有实际返回值,但为了保持接口一致性,返回了空数组
  112. */
  113. const save = async (formEl: FormInstance | undefined) => {
  114. // 检查表单实例是否存在,如果不存在则返回空数组
  115. if (!formEl) return []
  116. // 验证表单数据,如果验证失败,则显示错误消息并中断保存流程
  117. const valid = await formEl.validate((valid, fields) => {
  118. if (valid) {
  119. } else {
  120. for (const key in fields) {
  121. ElMessage.error(fields[key][0].message)
  122. return
  123. }
  124. console.log('error submit!', fields)
  125. }
  126. })
  127. if (valid) {
  128. if (actinoTabIndex.value == 1) {
  129. let ok = true
  130. let good: any[] = []
  131. try {
  132. checkGoods.value.forEach((item) => {
  133. if (item.type == '') {
  134. ok = false
  135. return ElMessage.error('请选择报损理由')
  136. }
  137. if (!item.pur_number) {
  138. ok = false
  139. return ElMessage.error('请输入报损数量')
  140. }
  141. const choose = lossesType.value.find((e) => e.value == item.type)
  142. item.typeValue = choose.lable
  143. good.push(item)
  144. })
  145. if (!ok) {
  146. return
  147. }
  148. const res = await warePutLoss(0,{
  149. info: good,
  150. create_admin_id: selfBuild.create_admin_id,
  151. wid: selfBuild.wid,
  152. type: 'loss'
  153. })
  154. if (res.status == 200) {
  155. ElMessage.success('提交成功')
  156. }
  157. } catch (error) {
  158. console.log(error, 'error')
  159. }
  160. } else if (actinoTabIndex.value == 2) {
  161. let ok = true
  162. let good: any[] = []
  163. try {
  164. checkGoodss.value.forEach((item) => {
  165. if (item.typeValue == '' || item.type == '') {
  166. ok = false
  167. return ElMessage.error('请选择报损理由')
  168. }
  169. if (!item.pur_number) {
  170. ok = false
  171. return ElMessage.error('请输入报损数量')
  172. }
  173. const choose = lossesType.value.find((e) => e.value == item.type)
  174. item.typeValue = choose.lable
  175. item.suk = item.specs[0].name
  176. good.push(item)
  177. })
  178. if (!ok) {
  179. return
  180. }
  181. const res = await storePutLoss({
  182. info: good,
  183. create_admin_id: hzBuild.create_admin_id,
  184. store_id: hzBuild.store_id,
  185. type: 'loss'
  186. })
  187. if (res.status == 200) {
  188. ElMessage.success('提交成功')
  189. }
  190. } catch (error) {
  191. console.log(error, 'error')
  192. }
  193. }
  194. }
  195. }
  196. const loadingData = ref(false)
  197. const lossesType = ref<any[]>([])
  198. onMounted(async () => {
  199. //加载商品规格
  200. // ruleList()
  201. const res = await getLossType({ page: 1, limit: 100 })
  202. lossesType.value = res.data.map((item) => {
  203. return {
  204. value: item.type,
  205. label: item.name
  206. }
  207. })
  208. if (params.type == 'add') {
  209. pageTitle.value = '添加报损'
  210. }
  211. })
  212. const backList = () => {
  213. push('/erp/losses')
  214. }
  215. const storeLoading = ref(false)
  216. const storeOptions = ref<any[]>([])
  217. const getStore = async (query = '', id = '') => {
  218. try {
  219. storeLoading.value = true
  220. const res = await getStoreList({ page: 1, limit: 1000, name: query, id, store: 1 })
  221. if (res) {
  222. storeOptions.value = res.data.data.map((item) => {
  223. return {
  224. value: item.id,
  225. label: item.name
  226. }
  227. })
  228. } else {
  229. return []
  230. }
  231. } catch (error) {
  232. console.log(error)
  233. } finally {
  234. storeLoading.value = false
  235. }
  236. }
  237. let attrBase = reactive<AttrBaseItem[]>([
  238. {
  239. img: [], //图片
  240. bar_code: '', //产品编号
  241. price: 0, //售价
  242. num: 0,
  243. is_default: 0,
  244. price_1: 0,
  245. price_2: 0,
  246. price_3: 0,
  247. name: '',
  248. is_del: 0,
  249. rate: 0
  250. }
  251. ])
  252. const selectPic = ref<string[]>([]) //选中的图片
  253. const selectPicIndex = ref(0) //上传图片选择对象
  254. const selectPicObj = ref('header') //上传图片类型
  255. /**
  256. * 根据不同的图片选择对象类型,更新相应的图片数组
  257. * @param {string[]} pic - 要更新的图片数组
  258. */
  259. const changePic = (pic: string[]) => {
  260. console.log(pic, 'pic')
  261. // 根据选中的图片对象类型,更新对应的图片数组
  262. switch (selectPicObj.value) {
  263. case 'header':
  264. // 更新产品属性列表中的图片数组
  265. attrBase[selectPicIndex.value].img = pic
  266. break
  267. case 'attrBase':
  268. // 更新基础属性中的图片数组
  269. attrBase[0].img = pic
  270. break
  271. case 'banner':
  272. // 更新表单数据中的图片数组
  273. formData.image = pic
  274. break
  275. case 'attrOne':
  276. // 更新单规格的图片数组
  277. attrs_value.image = pic
  278. break
  279. default:
  280. // 其他情况不做处理
  281. break
  282. }
  283. }
  284. const widOptions = ref<any[]>([])
  285. const adminOptions = ref<any[]>([])
  286. const wareLoading = ref(false)
  287. const adminLoading = ref(false)
  288. const checkGoods = ref<any[]>([])
  289. const getWid = async (query = '', id = '') => {
  290. try {
  291. wareLoading.value = true
  292. const res = await getStoreList({ page: 1, limit: 1000, name: query, id, type: 3 })
  293. if (res) {
  294. widOptions.value = res.data.data.map((item) => {
  295. return {
  296. value: item.id,
  297. label: item.name
  298. }
  299. })
  300. } else {
  301. return []
  302. }
  303. } catch (error) {
  304. console.log(error)
  305. } finally {
  306. wareLoading.value = false
  307. }
  308. }
  309. const getAdmin = async () => {
  310. console.log(actinoTabIndex.value, 'actinoTabIndex')
  311. let id: any = 0
  312. if (actinoTabIndex.value == 1) {
  313. id = selfBuild.wid
  314. } else if (actinoTabIndex.value == 2) {
  315. id = hzBuild.store_id
  316. }
  317. const res = await getStoreUser({ page: 1, limit: 20, relation_id: id })
  318. // adminOptions.value = res.data.list
  319. if (res) {
  320. adminOptions.value = res.data.map((item) => {
  321. return {
  322. value: item.id,
  323. label: item.real_name
  324. }
  325. })
  326. } else {
  327. return []
  328. }
  329. }
  330. const fristCheck = ref([])
  331. const changeSw = () => {
  332. selfBuild.create_admin_id = ''
  333. }
  334. const handleSelectionChange = (e) => {
  335. fristCheck.value = e
  336. }
  337. // const
  338. // const handleSelectionChanges = (e) => {
  339. // fristChecks.value = e
  340. // }
  341. const handleCurrentChange = (e: number) => {
  342. getPurgood(e, '')
  343. }
  344. const cancelClick = () => {
  345. dialogVisible.value = false
  346. }
  347. const unique = (arr) => {
  348. return arr.filter((item, index, arr) => arr.findIndex((t) => t.id === item.id) === index)
  349. }
  350. const confirmClick = () => {
  351. // 关闭弹窗
  352. dialogVisible.value = false
  353. //合并选中去重
  354. fristCheck.value = fristCheck.value.map((item) => {
  355. Object.assign(item, { pur_number: '', weight: '' })
  356. return item
  357. })
  358. if (actinoTabIndex.value == 1) {
  359. checkGoods.value = unique(checkGoods.value.concat(fristCheck.value))
  360. } else if (actinoTabIndex.value == 2) {
  361. checkGoodss.value = unique(checkGoodss.value.concat(fristCheck.value))
  362. }
  363. }
  364. const goods = ref([])
  365. const count = ref(0)
  366. const keyword = ref('')
  367. const currentPage = ref(0)
  368. const pageSize = ref(10)
  369. const dialogVisible = ref(false)
  370. const getPurgood = async (page = 1, key = '') => {
  371. if (key == 're') {
  372. keyword.value = ''
  373. }
  374. let qData: {
  375. key: string
  376. page: number
  377. limit: number
  378. store_id?: any
  379. wid?: any
  380. type: any
  381. up_wid?: any
  382. } = {
  383. type: '',
  384. store_id: '',
  385. wid: '',
  386. key: keyword.value,
  387. page: page,
  388. limit: 10,
  389. up_wid: ''
  390. }
  391. if (actinoTabIndex.value == 1) {
  392. if (!selfBuild.wid) {
  393. return ElMessage.error('请选仓库')
  394. }
  395. qData.up_wid = selfBuild.wid
  396. qData.type = 0
  397. const res = await getOutGood(qData)
  398. goods.value = res.data.data
  399. count.value = res.data.count
  400. dialogVisible.value = true
  401. } else if (actinoTabIndex.value == 2) {
  402. if (!hzBuild.store_id) {
  403. return ElMessage.error('请选门店')
  404. }
  405. qData.store_id = hzBuild.store_id
  406. // const res = await getProduct(qData)
  407. const res = await getStoreGood(qData)
  408. goods.value = res.data.data
  409. count.value = res.data.count
  410. dialogVisible.value = true
  411. }
  412. }
  413. const delCheckGoods = (row) => {
  414. console.log(row)
  415. let set1 = new Set(checkGoods.value)
  416. let set2 = new Set([row])
  417. checkGoods.value = Array.from(set1.difference(set2))
  418. }
  419. const delCheckGoodss = (row) => {
  420. console.log(row)
  421. let set1 = new Set(checkGoodss.value)
  422. let set2 = new Set([row])
  423. checkGoodss.value = Array.from(set1.difference(set2))
  424. }
  425. </script>
  426. <template>
  427. <ContentWrap
  428. :title="pageTitle"
  429. class="!min-h-[calc(100vh-var(--top-tool-height)-var(--tags-view-height)-var(--app-footer-height)-var(--app-content-padding))]"
  430. >
  431. <template #header>
  432. <BaseButton size="small" @click="backList"> 返回列表 </BaseButton>
  433. </template>
  434. <ElTabs v-model="actinoTabIndex" type="border-card">
  435. <ElTabPane label="仓库报损" :name="1">
  436. <ElForm
  437. v-loading="loadingData"
  438. ref="formRef"
  439. :model="selfBuild"
  440. :rules="rules"
  441. label-width="100px"
  442. >
  443. <ElFormItem label="仓库" prop="wid">
  444. <ElSelect
  445. filterable
  446. remote
  447. reserve-keyword
  448. v-model="selfBuild.wid"
  449. :remote-method="getWid"
  450. :loading="wareLoading"
  451. remote-show-suffix
  452. placeholder="请选择仓库"
  453. @change="changeSw"
  454. >
  455. <ElOption
  456. v-for="item in widOptions"
  457. :key="item.value"
  458. :label="item.label"
  459. :value="item.value"
  460. />
  461. </ElSelect>
  462. </ElFormItem>
  463. <ElFormItem label="创建人员" prop="create_admin_id" v-if="selfBuild.wid">
  464. <ElSelect
  465. filterable
  466. remote
  467. reserve-keyword
  468. :disabled="params.type == 'edit'"
  469. v-model="selfBuild.create_admin_id"
  470. :remote-method="getAdmin"
  471. :loading="adminLoading"
  472. remote-show-suffix
  473. placeholder="请选择创建人员"
  474. >
  475. <ElOption
  476. v-for="item in adminOptions"
  477. :key="item.value"
  478. :label="item.label"
  479. :value="item.value"
  480. />
  481. </ElSelect>
  482. </ElFormItem>
  483. <ElFormItem label="报损商品">
  484. <BaseButton type="primary" style="margin-bottom: 20px" @click="getPurgood(1, '')">
  485. 选择商品
  486. </BaseButton>
  487. <ElTable
  488. header-cell-class-name="bg-gray-100!"
  489. :data="checkGoods"
  490. class="w-100%"
  491. :border="true"
  492. stripe
  493. >
  494. <ElTableColumn prop="product_id" label="ID"> </ElTableColumn>
  495. <ElTableColumn prop="product_name" label="名称"> </ElTableColumn>
  496. <ElTableColumn prop="suk" label="单位"></ElTableColumn>
  497. <ElTableColumn prop="product_num" label="库存"></ElTableColumn>
  498. <ElTableColumn prop="pur_number" label="报损原因" min-width="220px">
  499. <template #header> <span>报损原因</span><span class="text-red">*</span> </template>
  500. <template #default="{ row }">
  501. <ElSelect
  502. v-model="row.type"
  503. class="m-2"
  504. placeholder="请选择报损原因"
  505. size="large"
  506. style="width: 200px"
  507. >
  508. <ElOption
  509. v-for="item in lossesType"
  510. :key="item.value"
  511. :label="item.label"
  512. :value="item.value"
  513. />
  514. </ElSelect>
  515. </template>
  516. </ElTableColumn>
  517. <ElTableColumn prop="pur_number" label="报损数量">
  518. <template #header> <span>报损数量</span><span class="text-red">*</span> </template>
  519. <template #default="{ row }">
  520. <ElInput type="number" v-model="row.pur_number" />
  521. </template>
  522. </ElTableColumn>
  523. <ElTableColumn prop="action" label="操作">
  524. <template #default="{ row }">
  525. <!-- <div type="text">{{ row.specs.num || 0 }}</div> -->
  526. <BaseButton link size="small" type="primary" @click="delCheckGoods(row)"
  527. >删除</BaseButton
  528. >
  529. </template></ElTableColumn
  530. >
  531. </ElTable>
  532. </ElFormItem>
  533. </ElForm>
  534. </ElTabPane>
  535. <ElTabPane label="门店报损" :name="2">
  536. <ElForm
  537. v-loading="loadingData"
  538. ref="formRefs"
  539. :model="hzBuild"
  540. :rules="rules"
  541. label-width="100px"
  542. >
  543. <ElFormItem label="门店" prop="store_id">
  544. <ElSelect
  545. filterable
  546. remote
  547. reserve-keyword
  548. :disabled="params.type == 'edit'"
  549. v-model="hzBuild.store_id"
  550. :remote-method="getStore"
  551. :loading="storeLoading"
  552. remote-show-suffix
  553. placeholder="请选择门店"
  554. @change="changeSw"
  555. >
  556. <ElOption
  557. v-for="item in storeOptions"
  558. :key="item.value"
  559. :label="item.label"
  560. :value="item.value"
  561. />
  562. </ElSelect>
  563. </ElFormItem>
  564. <ElFormItem label="创建人员" prop="create_admin_id" v-if="hzBuild.store_id">
  565. <ElSelect
  566. filterable
  567. remote
  568. reserve-keyword
  569. :disabled="params.type == 'edit'"
  570. v-model="hzBuild.create_admin_id"
  571. :remote-method="getAdmin"
  572. :loading="adminLoading"
  573. remote-show-suffix
  574. placeholder="请选择创建人员"
  575. >
  576. <ElOption
  577. v-for="item in adminOptions"
  578. :key="item.value"
  579. :label="item.label"
  580. :value="item.value"
  581. />
  582. </ElSelect>
  583. </ElFormItem>
  584. <ElFormItem label="报损商品">
  585. <BaseButton type="primary" style="margin-bottom: 20px" @click="getPurgood(1, '')">
  586. 添加商品
  587. </BaseButton>
  588. <ElTable
  589. header-cell-class-name="bg-gray-100!"
  590. :data="checkGoodss"
  591. class="w-100%"
  592. :border="true"
  593. stripe
  594. >
  595. <ElTableColumn prop="id" label="ID"> </ElTableColumn>
  596. <ElTableColumn prop="store_name" label="名称"> </ElTableColumn>
  597. <ElTableColumn prop="specs[0].name" label="单位"></ElTableColumn>
  598. <ElTableColumn prop="stock" label="库存"></ElTableColumn>
  599. <ElTableColumn prop="pur_number" label="报损原因" min-width="220px">
  600. <template #header> <span>报损原因</span><span class="text-red">*</span> </template>
  601. <template #default="{ row }">
  602. <ElSelect
  603. v-model="row.type"
  604. class="m-2"
  605. placeholder="请选择报损原因"
  606. size="large"
  607. style="width: 200px"
  608. >
  609. <ElOption
  610. v-for="item in lossesType"
  611. :key="item.value"
  612. :label="item.label"
  613. :value="item.value"
  614. />
  615. </ElSelect>
  616. </template>
  617. </ElTableColumn>
  618. <ElTableColumn prop="pur_number" label="报损数量">
  619. <template #header> <span>报损数量</span><span class="text-red">*</span> </template>
  620. <template #default="{ row }">
  621. <ElInput type="number" v-model="row.pur_number" />
  622. </template>
  623. </ElTableColumn>
  624. <ElTableColumn prop="action" label="操作">
  625. <template #default="{ row }">
  626. <!-- <div type="text">{{ row.specs.num || 0 }}</div> -->
  627. <BaseButton link size="small" type="primary" @click="delCheckGoodss(row)"
  628. >删除</BaseButton
  629. >
  630. </template></ElTableColumn
  631. >
  632. </ElTable>
  633. </ElFormItem>
  634. </ElForm>
  635. </ElTabPane>
  636. </ElTabs>
  637. <ElDrawer v-model="dialogVisible" title="选择商品" size="700px">
  638. <div class="mb5">
  639. <ElInput v-model="keyword" style="width: 200px" placeholder="输入商品名称搜索" />
  640. <BaseButton type="primary" class="ml2" @click="getPurgood(1, '')"> 搜索 </BaseButton>
  641. <BaseButton @click="getPurgood(1, 're')"> 重置 </BaseButton>
  642. </div>
  643. <ElTable
  644. header-cell-class-name="bg-gray-100!"
  645. :data="goods"
  646. class="w-100%"
  647. :border="true"
  648. stripe
  649. @selection-change="handleSelectionChange"
  650. >
  651. <template v-if="actinoTabIndex == 1">
  652. <ElTableColumn type="selection" width="55" />
  653. <ElTableColumn prop="product_name" label="名称"> </ElTableColumn>
  654. <ElTableColumn prop="suk" label="单位"></ElTableColumn>
  655. <ElTableColumn prop="product_num" label="库存"></ElTableColumn>
  656. </template>
  657. <template v-if="actinoTabIndex == 2">
  658. <ElTableColumn type="selection" width="55" />
  659. <ElTableColumn prop="store_name" label="名称"> </ElTableColumn>
  660. <ElTableColumn prop="specs[0].name" label="单位"></ElTableColumn>
  661. <ElTableColumn prop="stock" label="库存"></ElTableColumn>
  662. </template>
  663. </ElTable>
  664. <div style="height: 20px"></div>
  665. <ElPagination
  666. v-model:current-page="currentPage"
  667. v-model:page-size="pageSize"
  668. :page-sizes="[2, 3, 4, 5]"
  669. layout="total, prev, pager, next, jumper"
  670. :total="count"
  671. @current-change="handleCurrentChange"
  672. />
  673. <template #footer>
  674. <div style="flex: auto">
  675. <BaseButton @click="cancelClick">取消</BaseButton>
  676. <BaseButton type="primary" @click="confirmClick">确认</BaseButton>
  677. </div>
  678. </template>
  679. </ElDrawer>
  680. <UpImgButtom
  681. class="pos-absolute left-[-200px]"
  682. ref="upImageButtomRef"
  683. v-model="selectPic"
  684. @change="changePic"
  685. />
  686. </ContentWrap>
  687. <div
  688. class="text-center border-t-1px border-solid border-gray-200 py-10px mt-10px position-sticky bottom-0 left-0 right-0 bg-white"
  689. >
  690. <!-- <BaseButton v-if="params.type == 'edit'" @click="save(formRef)"> 保存 </BaseButton> -->
  691. <BaseButton v-if="params.type == 'add' && actinoTabIndex == 1" @click="save(formRef)">
  692. 保存</BaseButton
  693. >
  694. <BaseButton v-if="params.type == 'add' && actinoTabIndex == 2" @click="save(formRefs)">
  695. 保存</BaseButton
  696. >
  697. </div>
  698. </template>