newGroup.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718
  1. <template>
  2. <div class="table-box" style="width: 100%; min-height: 100%; background-color: white">
  3. <div class="content">
  4. <div class="contentLeft">
  5. <!-- 商铺信息设置模块 -->
  6. <div class="model">
  7. <h3 style="font-weight: bold">基础信息:</h3>
  8. <el-form :model="storeInfoModel" ref="ruleFormRef1" :rules="rules" label-width="120px" class="formBox">
  9. <el-form-item label="图片" prop="fileList">
  10. <template v-if="isDisabled">
  11. <div
  12. v-for="(item, idx) in storeInfoModel.fileList"
  13. :key="item.url || idx"
  14. style="width: 150px; height: 150px; overflow: hidden; border: 1px solid rgb(0 0 0 / 10%); border-radius: 6px"
  15. >
  16. <el-image :src="item.url" style="width: 100%; height: 100%" fit="contain" />
  17. </div>
  18. </template>
  19. <el-upload
  20. v-else
  21. v-model:file-list="storeInfoModel.fileList"
  22. :action="uploadUrl"
  23. list-type="picture-card"
  24. :accept="'.jpg,.png'"
  25. :limit="9"
  26. :on-preview="handlePictureCardPreview"
  27. :on-remove="handleRemove"
  28. :on-success="handleSuccess"
  29. :show-file-list="true"
  30. >
  31. <el-icon>
  32. <Plus />
  33. </el-icon>
  34. </el-upload>
  35. </el-form-item>
  36. <el-form-item label="团购名称" prop="storeName">
  37. <el-input maxlength="50" v-model="storeInfoModel.storeName" placeholder="请填写团购名称" clearable />
  38. </el-form-item>
  39. <el-form-item label="开始售卖时间" prop="storeStatus">
  40. <el-radio-group v-model="storeInfoModel.storeStatus" class="ml-4">
  41. <el-radio v-for="status in storeStatusList" :value="status.value" :key="status.value">
  42. {{ status.label }}
  43. </el-radio>
  44. </el-radio-group>
  45. </el-form-item>
  46. <el-form-item label="" prop="startTime" v-show="storeInfoModel.storeStatus == 1">
  47. <el-date-picker
  48. v-model="storeInfoModel.startTime"
  49. format="YYYY/MM/DD hh:mm:ss"
  50. value-format="YYYY-MM-DD h:m:s"
  51. type="datetime"
  52. placeholder="请选择开始售卖时间"
  53. />
  54. </el-form-item>
  55. <el-form-item label="结束售卖时间" prop="endTime">
  56. <el-date-picker
  57. v-model="storeInfoModel.endTime"
  58. format="YYYY/MM/DD hh:mm:ss"
  59. value-format="YYYY-MM-DD h:m:s"
  60. type="datetime"
  61. placeholder="请选择结束售卖时间"
  62. />
  63. </el-form-item>
  64. <el-form-item label="库存数量" prop="storeTel">
  65. <el-input v-model="storeInfoModel.storeTel" maxlength="15" placeholder="请填写库存数量" clearable />
  66. </el-form-item>
  67. <el-form-item label="每人限购" prop="purchaseLimitPerPerson">
  68. <el-radio-group v-model="storeInfoModel.purchaseLimitPerPerson" class="ml-4">
  69. <el-radio v-for="status in perList" :value="status.value" :key="status.value">
  70. {{ status.label }}
  71. </el-radio>
  72. </el-radio-group>
  73. </el-form-item>
  74. <el-form-item label="" prop="purchaseLimit" v-show="storeInfoModel.purchaseLimitPerPerson == 1">
  75. <el-input v-model="storeInfoModel.purchaseLimit" maxlength="15" placeholder="请填写自定义限购数量" clearable />
  76. </el-form-item>
  77. <el-form-item label="容纳人数" prop="storeCapacity">
  78. <el-input-number
  79. type="storeCapacity"
  80. :disabled="isDisabled"
  81. v-model="storeInfoModel!.storeCapacity"
  82. placeholder="容纳人数"
  83. clearable
  84. :min="0"
  85. :max="9999999"
  86. />
  87. </el-form-item>
  88. <el-form-item label="门店面积" prop="storeArea">
  89. <el-radio-group :disabled="isDisabled" v-model="storeInfoModel!.storeArea" class="ml-4">
  90. <el-radio v-for="storeArea in storeAreaList" :value="storeArea.value" :key="storeArea.value">
  91. {{ storeArea.label }}
  92. </el-radio>
  93. </el-radio-group>
  94. </el-form-item>
  95. <!-- <el-form-item label="是否连锁" prop="isChain">-->
  96. <!-- <el-radio-group :disabled="isDisabled" v-model="storeInfoModel!.isChain" class="ml-4">-->
  97. <!-- <el-radio label="0" :value="0"> 否 </el-radio>-->
  98. <!-- <el-radio label="1" :value="1"> 是 </el-radio>-->
  99. <!-- </el-radio-group>-->
  100. <!-- </el-form-item>-->
  101. <el-form-item label="详细地址" prop="storeAddress">
  102. <el-input
  103. maxlength="100"
  104. :disabled="isDisabled"
  105. v-model="storeInfoModel!.storeAddress"
  106. :rows="2"
  107. type="textarea"
  108. placeholder="请输入详细地址"
  109. />
  110. </el-form-item>
  111. <el-form-item label="行政区域" prop="district">
  112. <el-cascader :props="props" :disabled="isDisabled" v-model="storeInfoModel!.district" style="width: 100%" />
  113. </el-form-item>
  114. <el-form-item label="门店简介" prop="storeBlurb">
  115. <el-input
  116. maxlength="100"
  117. :disabled="isDisabled"
  118. v-model="storeInfoModel!.storeBlurb"
  119. :rows="2"
  120. type="textarea"
  121. placeholder="请输入门店简介"
  122. />
  123. </el-form-item>
  124. </el-form>
  125. </div>
  126. <div class="model">
  127. <h3 style="font-weight: bold">价格:</h3>
  128. <el-form :model="storeInfoModel" ref="ruleFormRef2" :rules="rules" label-width="120px" class="formBox">
  129. <el-form-item label="原价" prop="price">
  130. <el-input maxlength="50" v-model="storeInfoModel.price" placeholder="请填写原价" clearable />
  131. </el-form-item>
  132. <el-form-item label="优惠价" prop="discountedPrice">
  133. <el-input maxlength="50" v-model="storeInfoModel.discountedPrice" placeholder="请填写优惠价" clearable />
  134. </el-form-item>
  135. </el-form>
  136. </div>
  137. </div>
  138. <div class="contentRight">
  139. <div class="model">
  140. <h3 style="font-weight: bold">购买须知:</h3>
  141. <el-form :model="storeInfoModel" ref="ruleFormRef3" :rules="rules" label-width="120px" class="formBox">
  142. <el-form-item label="预约规则" prop="appointmentRules">
  143. <el-input
  144. maxlength="300"
  145. v-model="storeInfoModel.appointmentRules"
  146. :rows="4"
  147. type="textarea"
  148. placeholder="请输入预约规则"
  149. />
  150. </el-form-item>
  151. <el-form-item label="使用规则" prop="rulesOfUse">
  152. <el-input
  153. maxlength="300"
  154. v-model="storeInfoModel.rulesOfUse"
  155. :rows="4"
  156. type="textarea"
  157. placeholder="请输入详细地址"
  158. />
  159. </el-form-item>
  160. <el-form-item label="适用人数" prop="numberOfPeople">
  161. <el-input v-model="storeInfoModel.numberOfPeople" maxlength="15" placeholder="请填写适用人数" clearable />
  162. </el-form-item>
  163. <el-form-item label="其他规则" prop="otherRules">
  164. <el-input
  165. maxlength="300"
  166. v-model="storeInfoModel.otherRules"
  167. :rows="4"
  168. type="textarea"
  169. placeholder="请输入详细地址"
  170. />
  171. </el-form-item>
  172. <el-form-item label="发票信息" prop="businessTypes">
  173. <el-checkbox-group v-model="storeInfoModel.businessTypes">
  174. <el-checkbox v-for="bt in businessTypes" :key="bt.value" :value="bt.value" :label="bt.label">
  175. {{ bt.label }}
  176. <el-tooltip
  177. class="box-item"
  178. effect="dark"
  179. content="指射箭、射击、赛车、攀岩、滑翔伞、滑雪滑冰等"
  180. placement="top"
  181. >
  182. <el-icon v-if="bt.label == '休闲运动'" :size="13">
  183. <QuestionFilled />
  184. </el-icon>
  185. </el-tooltip>
  186. </el-checkbox>
  187. </el-checkbox-group>
  188. </el-form-item>
  189. <el-form-item label="发票说明" prop="invoiceDescription">
  190. <el-input v-model="storeInfoModel.invoiceDescription" maxlength="15" placeholder="请填写发票说明" clearable />
  191. </el-form-item>
  192. </el-form>
  193. <el-button v-if="type != 'show'" type="primary" @click="handleSubmit"> 确定 </el-button>
  194. </div>
  195. </div>
  196. </div>
  197. <!--图片预览-->
  198. <el-dialog v-model="imagePopupVisible" title="预览" width="30%">
  199. <el-image style="width: 100%" :src="previewImage" fit="contain" />
  200. </el-dialog>
  201. <el-button @click="goBack"> 返回 </el-button>
  202. </div>
  203. </template>
  204. <script setup lang="tsx" name="useProTable">
  205. import { ref, reactive, computed, onMounted, nextTick } from "vue";
  206. import { StoreUser } from "@/api/interface";
  207. import { ElMessage } from "element-plus";
  208. import ProTable from "@/components/ProTable/index.vue";
  209. import ImportExcel from "@/components/ImportExcel/index.vue";
  210. import StoreUserDrawer from "@/views/proTable/components/StoreUserDrawer.vue";
  211. import { ProTableInstance, ColumnProps } from "@/components/ProTable/interface";
  212. import {
  213. CirclePlus,
  214. Delete,
  215. EditPen,
  216. Download,
  217. Upload,
  218. Refresh,
  219. Check,
  220. Close,
  221. Search,
  222. QuestionFilled
  223. } from "@element-plus/icons-vue";
  224. import {
  225. getStoreUserList,
  226. addStoreUser,
  227. editStoreUser,
  228. deleteStoreUser,
  229. resetStoreUserPassWord,
  230. getStoreAuditStatus,
  231. getBusinessSection,
  232. getBusinessSectionTypes,
  233. getUnboundAccountList,
  234. addBusinessSectionAndTypes,
  235. saveStoreInfo,
  236. getStoreDetail,
  237. editStoreInfo,
  238. getInputPrompt,
  239. getDistrict
  240. } from "@/api/modules/storeUser";
  241. import { useHandleData } from "@/hooks/useHandleData";
  242. import { useRouter, useRoute } from "vue-router";
  243. import type { UploadProps, UploadUserFile, FormInstance } from "element-plus";
  244. import { forEach } from "lodash";
  245. const imagePopupVisible = ref(false);
  246. const rules = reactive({
  247. fileList: [{ required: true, message: "请上传图片" }],
  248. storeName: [{ required: true, message: "请填写团购名称" }],
  249. storeStatus: [{ required: true, message: "请选择开始售卖时间" }],
  250. startTime: [{ required: true, message: "请选择开始售卖时间" }],
  251. endTime: [{ required: true, message: "请选择结束售卖时间" }],
  252. storeTel: [{ required: true, message: "请填写库存数量" }],
  253. purchaseLimitPerPerson: [{ required: true, message: "请选择每人限购" }],
  254. purchaseLimit: [{ required: true, message: "请输入每人限购" }],
  255. price: [{ required: true, message: "请输入原价" }],
  256. discountedPrice: [{ required: true, message: "请输入优惠价" }],
  257. appointmentRules: [{ required: true, message: "请输入预约规则" }],
  258. rulesOfUse: [{ required: true, message: "请输入使用规则" }],
  259. numberOfPeople: [{ required: true, message: "请输入适用人数" }],
  260. otherRules: [{ required: true, message: "请输入其他规则" }],
  261. businessTypes: [{ required: true, message: "请选择发票信息" }],
  262. invoiceDescription: [{ required: true, message: "请输入发票说明" }],
  263. storeContact: [{ required: true, message: "请填写联系人" }],
  264. name: [{ required: true, message: "请填写联系人" }],
  265. storePhone: [{ required: true, message: "请填写联系人电话" }],
  266. phone: [{ required: true, message: "请填写联系人电话" }],
  267. password: [{ required: true, message: "请填写密码" }],
  268. payPassword: [{ required: true, message: "请填写支付密码" }],
  269. storeCapacity: [{ required: true, message: "请填写容纳人数" }],
  270. isChain: [{ required: true, message: "请选择是否连锁" }],
  271. district: [{ required: true, message: "请选择行政区域" }],
  272. storeBlurb: [{ required: true, message: "请输入门店简介" }],
  273. storeTypeList: [{ required: true, message: "请选择经营种类" }],
  274. businessStatus: [{ required: true, message: "请选择门店营业状态" }],
  275. storePositionLongitude: [{ required: true, message: "请选择门店经度" }],
  276. storePositionLatitude: [{ required: true, message: "请选择门店纬度" }],
  277. foodLicenceExpirationTime: [{ required: true, message: "请选择门店经营许可证到期时间" }],
  278. storePass: [{ required: true, message: "请输入门店密码" }],
  279. storeArea: [{ required: true, message: "请选择门店面积" }],
  280. businessSection: [{ required: true, message: "请选择经营板块" }],
  281. userAccount: [{ required: true, message: "请选择用户账号" }],
  282. contractImage: [{ required: true, message: "请上传合同图片" }],
  283. foodLicenceImage: [{ required: true, message: "请上传食品经营许可证图片" }],
  284. commissionRate: [{ required: true, message: "请填写抽成比例" }],
  285. // createdTime: [{ required: true, message: "请选择创建时间" }],
  286. storeApplicationStatus: [{ required: true, message: "请填写审核状态" }]
  287. // reason: [{ required: true, message: "请填写拒绝原因" }],
  288. });
  289. //文件上传地址
  290. const uploadUrl = ref(`${import.meta.env.VITE_API_URL_STORE}/file/upload`);
  291. //行政区域组件
  292. const props: any = {
  293. lazy: true,
  294. async lazyLoad(node, resolve) {
  295. const { level } = node;
  296. try {
  297. let param = { adCode: node.data.adCode ? node.data.adCode : "" };
  298. // 调用后台接口获取数据
  299. const response: any = await getDistrict(param as any);
  300. // 转换数据格式
  301. const nodes = (response?.data?.districts?.[0]?.districts || []).map((item: any) => ({
  302. value: item.adcode,
  303. adCode: item.adcode,
  304. label: item.name,
  305. leaf: level >= 2 // 假设最多三级,可以根据实际需求调整
  306. }));
  307. // 返回数据
  308. resolve(nodes);
  309. } catch (error) {
  310. console.error("获取区域数据失败:", error);
  311. resolve([]);
  312. }
  313. }
  314. };
  315. const fileList = ref<UploadUserFile[]>([]);
  316. const router = useRouter();
  317. const route = useRoute();
  318. const InputRef = ref<any>();
  319. //页面操作列是否禁用
  320. const isDisabled = ref<boolean>(false);
  321. //进入页面类型(新增:add,查看:show,编辑:edit)
  322. //用户账号
  323. const userAccountModel = ref<any>({ userAccount: "" });
  324. //新增板块
  325. const storeSectionModel = ref<any>({ sectionName: "", types: [] });
  326. //页面展开类型
  327. const type = ref<string>("");
  328. //页面id参数
  329. const id = ref<string>("");
  330. //地址名称
  331. const addressName = ref<string>("");
  332. //查询地址名称
  333. const queryAddress = ref<string>("");
  334. //地址集合
  335. const addressList = ref<any[]>([]);
  336. //商铺信息模块
  337. const storeInfoModel = ref<any>({
  338. //店铺名称
  339. storeName: "",
  340. //容纳人数
  341. storeCapacity: "1",
  342. //门店电话
  343. storeTel: "",
  344. //门店面积
  345. storeArea: 1,
  346. //是否连锁
  347. isChain: 1,
  348. //详细地址
  349. storeAddress: "",
  350. //门店简介
  351. storeBlurb: "",
  352. //经营板块
  353. businessSection: "1",
  354. //经营种类
  355. businessTypes: [],
  356. //营业执照
  357. fileList: [],
  358. //用户账号id
  359. userAccount: "",
  360. //门店状态
  361. storeStatus: 1,
  362. purchaseLimitPerPerson: 0,
  363. //门店营业状态
  364. businessStatus: 0,
  365. //行政区域
  366. district: [],
  367. // 抽成比例
  368. commissionRate: "3",
  369. // 创建时间
  370. createdTime: "",
  371. // 审核状态
  372. storeApplicationStatus: "",
  373. // 拒绝原因
  374. reason: ""
  375. });
  376. //用户列表
  377. const userOptions = ref<StoreUser.UserOptions[]>([]);
  378. //用户经营板块对话框开启标识
  379. const addSectionDialogVisible = ref<boolean>(false);
  380. //添加板块类型开启标识
  381. const sectionTypeVisable = ref<boolean>(false);
  382. //添加板块类型值
  383. const sectionTypeValue = ref<string>("");
  384. //添加板块类型名称
  385. const sectionSectionName = ref<string>("");
  386. //添加板块类型英文值
  387. const businessTypeValue = ref<string>("");
  388. //添加板块类型名称
  389. const sectionSectionTypes = ref<string[]>([]);
  390. //营业执照图片集合
  391. const videoUrlList = ref<string[]>([]);
  392. //合同图片集合
  393. const contractImageList = ref<string[]>([]);
  394. //合同图片集合
  395. const foodLicenceImageList = ref<string[]>([]);
  396. // 门店面积列表
  397. const storeAreaList = ref<any[]>([
  398. { value: 1, label: "小于20平米" },
  399. { value: 2, label: "20~50平米" },
  400. { value: 3, label: "50~100平米" },
  401. { value: 4, label: "100~300平米" },
  402. { value: 5, label: "300~500平米" },
  403. { value: 6, label: "500~1000平米" },
  404. { value: 7, label: "大于1000平米" }
  405. ]);
  406. // 经营板块列表
  407. const businessSectionList = ref<any[]>([]);
  408. //经营种类列表
  409. const businessTypes = ref<any[]>([
  410. { value: 1, label: "提供电子发票" },
  411. { value: 2, label: "提供纸质发票" }
  412. ]);
  413. //获取用户列表
  414. const getUserOptions = async () => {
  415. let res: any = await getUnboundAccountList({ id: id.value } as any);
  416. //todo 此处修改成调用接口
  417. // let a = { name: "张三", id: 1 };
  418. // let b = { name: "李四", id: 2 };
  419. (res?.data || []).forEach((element: any) => {
  420. let addData = {
  421. name: `${element.phone}(${element.name ? element.name : "未知"})`,
  422. id: element.id
  423. };
  424. userOptions.value.push(addData);
  425. });
  426. };
  427. const storeStatusList = ref<any[]>([
  428. { value: 0, label: "审核通过后立即开始" },
  429. { value: 1, label: "设置售卖时间" }
  430. ]);
  431. const perList = ref<any[]>([
  432. { value: 0, label: "不限量" },
  433. { value: 1, label: "自定义限购数量" }
  434. ]);
  435. // 门店营业状态列表
  436. const businessStatusList = ref<any[]>([
  437. { value: 0, label: "正常营业" },
  438. { value: 1, label: "暂停营业" },
  439. { value: 2, label: "筹建中" },
  440. { value: 99, label: "永久关门" }
  441. ]);
  442. //新增经营板块
  443. const addSection = () => {
  444. addSectionDialogVisible.value = true;
  445. };
  446. //关闭新增经营板块弹窗
  447. const closeSection = () => {
  448. sectionSectionName.value = "";
  449. businessTypeValue.value = "";
  450. sectionSectionTypes.value = [];
  451. addSectionDialogVisible.value = false;
  452. };
  453. //删除门店经营板块分类
  454. const handleClose = (tag: string) => {
  455. storeSectionModel.value.types.splice(storeSectionModel.value.types.indexOf(tag), 1);
  456. };
  457. //新增标签
  458. const handleInputConfirm = () => {
  459. if (sectionTypeValue.value) {
  460. sectionSectionTypes.value.push(sectionTypeValue.value);
  461. }
  462. sectionTypeVisable.value = false;
  463. sectionTypeValue.value = "";
  464. };
  465. //展示新增标签input
  466. const showInput = () => {
  467. sectionTypeVisable.value = true;
  468. nextTick(() => {
  469. InputRef.value!.input!.focus();
  470. });
  471. };
  472. //返回上一页
  473. const goBack = () => {
  474. router.go(-1);
  475. };
  476. const handleRemove: UploadProps["onRemove"] = (uploadFile, uploadFiles) => {
  477. videoUrlList.value = [];
  478. };
  479. const handleSuccess = (response: any, uploadFile: UploadUserFile) => {
  480. ElMessage.success("图片上传成功");
  481. console.log(response);
  482. if (response.data) {
  483. videoUrlList.value.push(response.data);
  484. // videoUrl.value = response.data;
  485. }
  486. console.log("videoUrlList.value ===> ", videoUrlList.value);
  487. };
  488. const handleContractRemove: UploadProps["onRemove"] = (uploadFile, uploadFiles) => {
  489. contractImageList.value = [];
  490. (uploadFiles || []).forEach((f: any) => {
  491. if (f.url) contractImageList.value.push(f.url);
  492. });
  493. // storeInfoModel.value.contractImageList = storeInfoModel.value.contractImageList.filter(item => item.uid !== uploadFile.uid)
  494. };
  495. const handleContractSuccess = (response: any, uploadFile: UploadUserFile) => {
  496. ElMessage.success("合同上传成功");
  497. if (response.data) {
  498. contractImageList.value.push(response.data);
  499. }
  500. console.log(contractImageList.value);
  501. };
  502. const handleFoodLicenceSuccess = (response: any, uploadFile: UploadUserFile) => {
  503. ElMessage.success("食品经营许可上传成功");
  504. if (response.data) {
  505. foodLicenceImageList.value.push(response.data);
  506. }
  507. console.log(response);
  508. };
  509. const handleFoodLicenceRemove: UploadProps["onRemove"] = (uploadFile, uploadFiles) => {
  510. foodLicenceImageList.value = [];
  511. (uploadFiles || []).forEach((item: any) => {
  512. if (item.url) foodLicenceImageList.value.push(item.url);
  513. });
  514. console.log("foodLicenceImageList.value ===> ", foodLicenceImageList.value);
  515. };
  516. const getBusinessSectionList = async () => {
  517. let res: any = await getBusinessSection();
  518. let addData: any[] = [];
  519. (res?.data || []).forEach((element: any) => {
  520. addData.push({ value: element.dictId, label: element.dictDetail, parentId: element.parentId });
  521. });
  522. //默认 storeInfoModel!.businessSection 为第一个元素
  523. storeInfoModel.value.businessSection = addData[0].value;
  524. businessSectionList.value = addData;
  525. changeSection();
  526. };
  527. const changeSection = async () => {
  528. storeInfoModel.value.businessTypes = [];
  529. //获取经营种类
  530. const resType: any = await getBusinessSectionTypes({ parentId: storeInfoModel.value.businessSection } as any);
  531. let addData: any[] = [];
  532. (resType?.data || []).forEach((element: any) => {
  533. addData.push({ value: element.dictId, label: element.dictDetail, parentId: element.parentId });
  534. });
  535. businessTypes.value = addData;
  536. if (type.value == "add") {
  537. storeInfoModel.value.businessTypes = ["0"];
  538. }
  539. };
  540. // const handlePictureCardPreview: UploadProps["onPreview"] = uploadFile => {};
  541. const previewImage = ref("");
  542. const handlePictureCardPreview = (e: any) => {
  543. imagePopupVisible.value = true;
  544. previewImage.value = e.url;
  545. };
  546. const closeImagePopup = () => {
  547. imagePopupVisible.value = false;
  548. previewImage.value = "";
  549. };
  550. // 提交数据(新增/编辑)
  551. const ruleFormRef = ref<FormInstance>();
  552. const ruleFormRef2 = ref<FormInstance>();
  553. const ruleFormRef3 = ref<FormInstance>();
  554. const handleSubmit = () => {
  555. ruleFormRef.value!.validate(async valid => {
  556. if (!valid) return;
  557. ruleFormRef2.value!.validate(async valid2 => {
  558. if (!valid2) return;
  559. ruleFormRef3.value!.validate(async valid3 => {
  560. if (!valid3) return;
  561. if (!storeInfoModel.value.district[0] || !storeInfoModel.value.district[1] || !storeInfoModel.value.district[2]) {
  562. ElMessage.error("请完整选择行政区域");
  563. return;
  564. }
  565. let param: any = storeInfoModel.value;
  566. param.queryAddress = queryAddress.value;
  567. console.log("videoUrlList.value ===> ", videoUrlList.value);
  568. console.log("storeInfoModel.value ===> ", storeInfoModel.value);
  569. param.businessLicenseAddress = videoUrlList.value;
  570. param.contractImageList = handleImageResult(contractImageList.value);
  571. let arr = handleImageResult(foodLicenceImageList.value);
  572. param.foodLicenceUrl = arr.length > 0 ? arr[0] : "";
  573. param.createTime = null;
  574. param.updatedTime = null;
  575. param.administrativeRegionProvinceAdcode = storeInfoModel.value.district[0];
  576. param.administrativeRegionCityAdcode = storeInfoModel.value.district[1];
  577. param.administrativeRegionDistrictAdcode = storeInfoModel.value.district[2];
  578. if (type.value == "add") {
  579. let res = await saveStoreInfo(param);
  580. if (res.code == "200") {
  581. ElMessage.success("新增成功");
  582. router.go(-1);
  583. } else {
  584. ElMessage.error("新增失败");
  585. }
  586. } else if (type.value == "edit") {
  587. let res = await editStoreInfo(param);
  588. if (res.code == "200") {
  589. ElMessage.success("编辑成功");
  590. router.go(-1);
  591. } else {
  592. ElMessage.error("编辑失败");
  593. }
  594. }
  595. });
  596. });
  597. });
  598. };
  599. onMounted(async () => {
  600. id.value = (route.query.id as string) || "";
  601. type.value = (route.query.type as string) || "";
  602. //调用获取用户列表
  603. getUserOptions();
  604. //获取商铺经营板块
  605. if (type.value != "add") {
  606. if (type.value == "show") {
  607. isDisabled.value = true;
  608. }
  609. let res: any = await getStoreDetail({ id: id.value } as any);
  610. storeInfoModel.value = res.data as any;
  611. storeInfoModel.value.businessSection = storeInfoModel.value.businessSection + "";
  612. storeInfoModel.value.userAccount = Number(storeInfoModel.value.userAccount);
  613. await changeSection();
  614. storeInfoModel.value.businessTypes = storeInfoModel.value.businessTypesList;
  615. storeInfoModel.value.storePositionLongitude = storeInfoModel.value.storePosition.split(",")[0];
  616. storeInfoModel.value.storePositionLatitude = storeInfoModel.value.storePosition.split(",")[1];
  617. let district: any[] = [];
  618. district[0] = storeInfoModel.value.administrativeRegionProvinceAdcode;
  619. district[1] = storeInfoModel.value.administrativeRegionCityAdcode;
  620. district[2] = storeInfoModel.value.administrativeRegionDistrictAdcode;
  621. storeInfoModel.value.district = district;
  622. videoUrlList.value = (res.data as any).businessLicenseAddress || [];
  623. let fileList: any[] = [];
  624. handleImageParam((res.data as any).businessLicenseAddress || [], fileList);
  625. let contractImageList: any[] = [];
  626. handleImageParam((res.data as any).contractImageList || [], contractImageList);
  627. let foodLicenceImageList: any[] = [];
  628. handleImageParam((res.data as any).foodLicenceImageList || [], foodLicenceImageList);
  629. storeInfoModel.value.fileList = fileList;
  630. storeInfoModel.value.contractImage = contractImageList;
  631. storeInfoModel.value.contractImageList = contractImageList;
  632. (contractImageList as any).value = contractImageList as any;
  633. storeInfoModel.value.foodLicenceImage = foodLicenceImageList;
  634. storeInfoModel.value.foodLicenceImageList = foodLicenceImageList;
  635. }
  636. });
  637. //图片list 转换为upload 组件的参数
  638. const handleImageParam = (list: any[], result: any[]) => {
  639. (list || []).forEach((item: any) => {
  640. // 使用split方法以'/'为分隔符将URL拆分成数组
  641. const parts = item.split("/");
  642. // 取数组的最后一项,即图片名称
  643. const imageName = parts[parts.length - 1];
  644. result.push({
  645. name: imageName,
  646. percentage: 100,
  647. url: item
  648. });
  649. });
  650. };
  651. const handleImageResult = (list: any[]) => {
  652. let result: any[] = [];
  653. (list || []).forEach((item: any) => {
  654. if (item.uid) {
  655. result.push(item.url);
  656. } else {
  657. result.push(item);
  658. }
  659. });
  660. return result;
  661. };
  662. // 判断审核状态
  663. const storeApplicationStatusText = computed(() => {
  664. const status = storeInfoModel.value.storeApplicationStatus;
  665. if (status == 0) return "待审核";
  666. if (status == 1) return "审核通过";
  667. if (status == 2) return "审核拒绝";
  668. return "";
  669. });
  670. </script>
  671. <style scoped lang="scss">
  672. .content {
  673. display: flex;
  674. width: 98%;
  675. height: 98%;
  676. margin: auto;
  677. .contentLeft {
  678. width: 50%;
  679. }
  680. .contentRight {
  681. width: 50%;
  682. }
  683. }
  684. .model {
  685. margin-bottom: 50px;
  686. }
  687. .formBox {
  688. width: 70%;
  689. }
  690. .table-box {
  691. height: auto !important;
  692. }
  693. </style>