AddShop.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. <template>
  2. <ContainerTit>
  3. <div slot="headr">
  4. <el-button v-if="!shopId" @click="delPauseSave(1)">清除暂存</el-button>
  5. <el-button v-if="!shopId" :loading="loading" @click="temData(true)">
  6. 暂存
  7. </el-button>
  8. <el-button type="primary" :loading="loading" @click="addShop(false)">
  9. 提交保存
  10. </el-button>
  11. </div>
  12. <div class="detail-tab-item" style="padding: 20px">
  13. <el-form ref="form" size="small" :model="form" :rules="rules" label-width="140px">
  14. <el-row>
  15. <el-col :span="14">
  16. <el-form-item prop="logo" label="商铺LOGO">
  17. <UploadQiniu :file-list="img_list" @uploadSuccess="uploadSuccess" @handleRemove="uploadRemove" />
  18. </el-form-item>
  19. <el-form-item label="商铺编码">
  20. <el-input v-model="form.shopCode" disabled placeholder="系统自动创建" style="width: 300px"></el-input>
  21. </el-form-item>
  22. <el-form-item label="商铺名称" prop="name">
  23. <el-input v-model="form.name" placeholder="商铺名称" style="width: 300px"></el-input>
  24. </el-form-item>
  25. <el-form-item label="仓库" prop="warehouseId">
  26. <el-button type="primary" @click="warehouse_show = true">
  27. 选择仓库
  28. </el-button>
  29. <div style="display: inline-block; margin-left: 10px">
  30. <el-tag v-for="(item, index) in useWarehouseNameArr" :key="index" closable @close="closeTag(index)">
  31. {{ item.warehouseName }}
  32. </el-tag>
  33. </div>
  34. </el-form-item>
  35. <el-form-item label="商铺类型" prop="shopType">
  36. <el-select v-model="form.shopType" placeholder="商铺类型" style="width: 300px">
  37. <el-option v-for="item in type_options" :key="item.value" :label="item.label" :value="item.value">
  38. </el-option>
  39. </el-select>
  40. </el-form-item>
  41. <!-- <el-form-item label="成本算法" prop="costType">-->
  42. <!-- <el-select-->
  43. <!-- v-model="form.costType"-->
  44. <!-- style="width: 300px"-->
  45. <!-- :disabled="!!shopId"-->
  46. <!-- placeholder="成本算法"-->
  47. <!-- >-->
  48. <!-- <el-option-->
  49. <!-- v-for="item in cost_algorithm"-->
  50. <!-- :key="item.value"-->
  51. <!-- :label="item.label"-->
  52. <!-- :value="item.value"-->
  53. <!-- ></el-option>-->
  54. <!-- </el-select>-->
  55. <!-- <el-tooltip effect="dark" placement="bottom-start">-->
  56. <!-- <div slot="content">-->
  57. <!-- <p>-->
  58. <!-- 移动加权法:用于价格较为恒定的行业,每次进货的库存与金额会累加,进行成本重算-->
  59. <!-- </p>-->
  60. <!-- <p>-->
  61. <!-- 个别计价法:用于价格波动较大的行业,按批次入库,分批次出库-->
  62. <!-- </p>-->
  63. <!-- </div>-->
  64. <!-- <i class="el-icon-warning-outline"></i>-->
  65. <!-- </el-tooltip>-->
  66. <!-- <div style="font-size: 12px; font-weight: normal; color: #e6a23c">-->
  67. <!-- 温馨提示:成本算法一经设置不允许修改-->
  68. <!-- </div>-->
  69. <!-- </el-form-item>-->
  70. <!-- <el-form-item-->
  71. <!-- label="负责人"-->
  72. <!-- prop="shopPartnerId"-->
  73. <!-- >-->
  74. <!-- <el-input-->
  75. <!-- v-model="form.partnerName"-->
  76. <!-- placeholder="负责人"-->
  77. <!-- readonly-->
  78. <!-- style="width: 300px"-->
  79. <!-- >-->
  80. <!-- <i-->
  81. <!-- @click="show_Partnership=true"-->
  82. <!-- slot="suffix"-->
  83. <!-- class="el-input__icon el-icon-search"-->
  84. <!-- ></i>-->
  85. <!-- </el-input>-->
  86. <!-- <a-->
  87. <!-- href="/#/SystemSettings/liansuoguanli/AddPartnership"-->
  88. <!-- target="_blank"-->
  89. <!-- > <el-button-->
  90. <!-- size="mini"-->
  91. <!-- type="text"-->
  92. <!-- >【新建负责人】</el-button></a>-->
  93. <!-- </el-form-item>-->
  94. <el-form-item label="商铺地址" prop="address">
  95. <div v-if="!!shopId && region.length > 0">
  96. <RegionSelect v-model="region" size="small" style="width: 300px" @getRegion="getRegion"
  97. @change="regionChange" />
  98. </div>
  99. <div v-else>
  100. <RegionSelect v-model="region" size="small" style="width: 300px" @change="regionChange" />
  101. </div>
  102. <el-input v-model="form.address" placeholder="详细地址" style="width: 300px; margin-top: 10px"></el-input>
  103. </el-form-item>
  104. <el-form-item label="商铺坐标">
  105. <el-input v-model="form.latitude" placeholder="经度" style="width: 160px"></el-input>
  106. <el-input v-model="form.longitude" placeholder="纬度" style="width: 160px"></el-input>
  107. </el-form-item>
  108. <el-form-item label="主营">
  109. <el-input v-model="form.describe" placeholder="商铺主营" style="width: 300px"></el-input>
  110. </el-form-item>
  111. <el-form-item v-if="false" label-width="0">
  112. <div style="width: 800px">
  113. <baidu-map v-if="false" class="map" style="height: 400px; overflow-y: auto" :center="'北京'"
  114. @click="mapClick">
  115. <!-- 地区检索-->
  116. <bm-local-search :keyword="mapCenter" :auto-viewport="true" @searchcomplete="searchcomplete">
  117. </bm-local-search>
  118. <!-- 缩放-->
  119. <bm-navigation anchor="BMAP_ANCHOR_TOP_RIGHT"></bm-navigation>
  120. </baidu-map>
  121. </div>
  122. </el-form-item>
  123. </el-col>
  124. <el-col :span="10">
  125. <el-form-item label="营业时间" prop="openTime">
  126. <template>
  127. <el-time-picker v-model="startTime" format="HH:mm" style="width: 130px" placeholder="开始时间"
  128. :disabled="!!form.openTime.isAllDay" @change="startTimeChange" />
  129. <el-time-picker v-model="endTime" style="margin: 0 10px; width: 130px" format="HH:mm" placeholder="结束时间"
  130. :disabled="!!form.openTime.isAllDay" @change="endTimeChange" />
  131. </template>
  132. <el-checkbox v-model="form.openTime.isAllDay">全天</el-checkbox>
  133. </el-form-item>
  134. <el-form-item label="联系人" prop="contactName">
  135. <el-input v-model="form.contactName" placeholder="联系人" style="width: 350px"></el-input>
  136. </el-form-item>
  137. <el-form-item label="联系电话" prop="mobile">
  138. <el-input v-model="form.mobile" placeholder="联系电话" style="width: 350px"></el-input>
  139. </el-form-item>
  140. <el-form-item label="销售区域" prop="region">
  141. <el-radio-group v-model="is_all_region">
  142. <el-radio :label="5">全国</el-radio>
  143. <el-radio :label="4">部分</el-radio>
  144. </el-radio-group>
  145. <div v-show="is_all_region === 4" style="
  146. border-top: 1px solid #ddd;
  147. margin-top: 10px;
  148. padding-top: 10px;
  149. ">
  150. <RegionTree :already-region="already_region" :checked-key="region_arr" @checkChange="selRegion" />
  151. </div>
  152. </el-form-item>
  153. </el-col>
  154. </el-row>
  155. </el-form>
  156. </div>
  157. <PartnershipModel v-if="show_Partnership" :is-show-add="true" :is-check="false" :dialog-visible="show_Partnership"
  158. @close="show_Partnership = false" @confirm="PartnershipConfirm" />
  159. <!-- 选择仓库-->
  160. <WarehouseModel v-if="warehouse_show" :is-show="warehouse_show" @confirm="selWarehouse"
  161. @cancel="warehouse_show = false" />
  162. </ContainerTit>
  163. </template>
  164. <script>
  165. import RegionSelect from "@/component/common/RegionSelectJSON";
  166. import PartnershipModel from "@/component/common/PartnershipModel.vue";
  167. import UploadQiniu from "@/component/common/UploadQiniu.vue";
  168. import RegionTree from "@/component/common/RegionTree";
  169. import WarehouseModel from "@/component/common/WarehouseModel.vue";
  170. import {
  171. getSalesAreaInEnterprise,
  172. getShopInfo,
  173. editShop,
  174. addShop,
  175. } from "@/api/Shop";
  176. import {
  177. getPauseSave,
  178. delPauseSave,
  179. addPauseSave
  180. } from "@/api/common";
  181. import {
  182. mapGetters
  183. } from "vuex";
  184. export default {
  185. name: "AddShop",
  186. components: {
  187. RegionSelect,
  188. RegionTree,
  189. PartnershipModel,
  190. UploadQiniu,
  191. WarehouseModel,
  192. },
  193. data() {
  194. const validateTime = (rule, value, callback) => {
  195. if (!value.isAllDay) {
  196. if (!value.start) {
  197. callback(new Error("请选择开始时间"));
  198. } else if (!value.end) {
  199. callback(new Error("请选择结束时间"));
  200. } else {
  201. callback();
  202. }
  203. } else {
  204. callback();
  205. }
  206. };
  207. const validatePhone = (rule, value, callback) => {
  208. const re = /^1[3456789]\d{9}$/; // 正则表达式
  209. if (value === "") {
  210. callback(new Error("请输入手机号!"));
  211. } else if (!re.test(value)) {
  212. callback(new Error("手机号格式有误,请重新输入!"));
  213. } else {
  214. callback();
  215. }
  216. };
  217. const validateRegion = (rule, value, callback) => {
  218. if (!this.form.salesArea.length) {
  219. callback(new Error("请选择销售区域"));
  220. } else {
  221. callback();
  222. }
  223. };
  224. return {
  225. warehouse_show: false,
  226. useWarehouseNameArr: [],
  227. useWarehouseName: [],
  228. is_all_region: 5, // 销售区域是否选择全国,默认全国
  229. loading: false,
  230. cost_algorithm: [{
  231. label: "移动加权法",
  232. value: 1,
  233. },
  234. {
  235. label: "个别计价法",
  236. value: 2,
  237. },
  238. ],
  239. region_arr: [],
  240. already_region: [],
  241. endTime: "",
  242. startTime: "",
  243. show_Partnership: false,
  244. region: [],
  245. regionName: "",
  246. img_list: [],
  247. shopId: "",
  248. map_center: "北京",
  249. type_options: [{
  250. value: 1,
  251. label: "联营商铺",
  252. },
  253. {
  254. value: 2,
  255. label: "直营商铺",
  256. },
  257. ],
  258. form: {
  259. logo: "",
  260. name: "",
  261. costType: "",
  262. shopCode: "",
  263. shopType: "",
  264. shopPartnerId: "",
  265. contactName: "",
  266. partnerName: "",
  267. salesArea: ["0-0-0"],
  268. openTime: {
  269. start: "",
  270. end: "",
  271. isAllDay: "",
  272. },
  273. mobile: "",
  274. provinceCode: "",
  275. cityCode: "",
  276. districtCode: "",
  277. address: "",
  278. describe: "",
  279. latitude: "",
  280. longitude: "",
  281. warehouseId: [],
  282. },
  283. isAllCountry: false,
  284. rules: {
  285. logo: [{
  286. required: true,
  287. message: "请上传商铺LOGO",
  288. trigger: "change"
  289. }, ],
  290. name: [{
  291. required: true,
  292. message: "请输入商铺名称",
  293. trigger: "blur"
  294. }, ],
  295. shopType: [{
  296. required: true,
  297. message: "请选择商铺类型",
  298. trigger: "change"
  299. }, ],
  300. costType: [{
  301. required: true,
  302. message: "请选择成本算法",
  303. trigger: "change"
  304. }, ],
  305. provinceCode: [{
  306. required: true,
  307. message: "请选择商铺地址",
  308. trigger: "change"
  309. }, ],
  310. model: [{
  311. required: true,
  312. message: "请选择经营模式",
  313. trigger: "change"
  314. }, ],
  315. address: [{
  316. required: true,
  317. message: "请输入详细地址",
  318. trigger: "blur"
  319. }, ],
  320. // shopPartnerId: [
  321. // { required: true, message: '请选择商铺负责人', trigger: 'blur' }
  322. // ],
  323. contactName: [{
  324. required: true,
  325. message: "请选择商铺联系人",
  326. trigger: "blur"
  327. }, ],
  328. mobile: [{
  329. required: true,
  330. message: "请输入联系电话",
  331. trigger: "blur"
  332. },
  333. {
  334. validator: validatePhone,
  335. trigger: "blur"
  336. },
  337. ],
  338. openTime: [{
  339. required: true,
  340. validator: validateTime,
  341. trigger: "change"
  342. }, ],
  343. region: [{
  344. required: true,
  345. validator: validateRegion,
  346. trigger: "change"
  347. }, ],
  348. warehouseId: [{
  349. type: "array",
  350. required: true,
  351. message: "请选择仓库",
  352. trigger: "change",
  353. }, ],
  354. },
  355. brand: "",
  356. };
  357. },
  358. computed: {
  359. ...mapGetters({
  360. storeData: "MUser/storeData",
  361. systemType: "MUser/systemType",
  362. }),
  363. mapCenter() {
  364. if (!this.regionName.provinceName) {
  365. return "";
  366. }
  367. return (
  368. this.regionName.provinceName +
  369. this.regionName.cityName +
  370. this.regionName.districtName +
  371. this.form.address
  372. );
  373. },
  374. },
  375. async created() {
  376. //多门店
  377. if ([2, 3].includes(this.systemType)) {
  378. this.shopId = this.storeData.id;
  379. // 进入客户详情
  380. await this.getShopInfo();
  381. return;
  382. }
  383. // 企业
  384. this.brand = this.$route.path.includes("brand");
  385. await this.getSalesAreaInEnterprise();
  386. if (this.$route.params.id) {
  387. this.shopId = this.$route.params.id;
  388. // 进入客户详情
  389. await this.getShopInfo();
  390. } else {
  391. await this.getTempShopData();
  392. }
  393. },
  394. methods: {
  395. // 选择仓库
  396. selWarehouse(row) {
  397. if (this.useWarehouseNameArr.length) {
  398. this.useWarehouseNameArr.forEach((item, index) => {
  399. if (Number(item.id) === row[0].id) {
  400. this.useWarehouseNameArr.splice(index, 1);
  401. }
  402. });
  403. this.useWarehouseNameArr = this.$_common.unique(
  404. this.useWarehouseNameArr.concat(row),
  405. ["id"]
  406. );
  407. } else {
  408. this.useWarehouseNameArr = row;
  409. }
  410. this.form.warehouseId = this.useWarehouseNameArr.map((item) => {
  411. return item.id;
  412. });
  413. this.useWarehouseName = this.useWarehouseNameArr.map((item) => {
  414. return item.warehouseName;
  415. });
  416. },
  417. // 关闭标签
  418. closeTag(index) {
  419. this.useWarehouseNameArr.splice(index, 1);
  420. this.form.warehouseId = this.useWarehouseNameArr.map((item) => {
  421. return item.id;
  422. });
  423. },
  424. // 地区检索
  425. getRegion(province, city, district) {
  426. this.regionName = {
  427. provinceName: province.label,
  428. cityName: city.label || "",
  429. districtName: district.label || "",
  430. };
  431. },
  432. // 当前企业下已有的销售区域
  433. async getSalesAreaInEnterprise() {
  434. const data = await getSalesAreaInEnterprise();
  435. this.already_region = data.data;
  436. },
  437. // 选择区域 树形插件
  438. selRegion(row) {
  439. this.form.salesArea = row.map((item) => {
  440. return item.codePath;
  441. });
  442. },
  443. // 选择时间
  444. startTimeChange(val) {
  445. const hours =
  446. val.getHours() < 10 ? "0" + val.getHours() : val.getHours();
  447. const minutes =
  448. val.getMinutes() < 10 ? "0" + val.getMinutes() : val.getMinutes();
  449. this.form.openTime.start = hours + ":" + minutes;
  450. },
  451. // 选择时间
  452. endTimeChange(val) {
  453. const hours =
  454. val.getHours() < 10 ? "0" + val.getHours() : val.getHours();
  455. const minutes =
  456. val.getMinutes() < 10 ? "0" + val.getMinutes() : val.getMinutes();
  457. this.form.openTime.end = hours + ":" + minutes;
  458. },
  459. // 地图
  460. searchcomplete(res) {
  461. if (!res || !res.Ir || !res.Ir[0]) return;
  462. const points = res.Ir[0].point;
  463. this.form.latitude = points.lat;
  464. this.form.longitude = points.lng;
  465. },
  466. // 地图组件点击事件
  467. mapClick({
  468. type,
  469. target,
  470. point,
  471. pixel,
  472. overlay
  473. }) {
  474. this.form.latitude = point.lat;
  475. this.form.longitude = point.lng;
  476. if (overlay && overlay.z.title) {
  477. this.form.address = overlay.z.title;
  478. }
  479. },
  480. // 选择图片
  481. uploadSuccess(val, res, file, fileList) {
  482. this.form.logo = val;
  483. },
  484. uploadRemove() {
  485. this.form.logo = "";
  486. },
  487. // 选择合伙人
  488. PartnershipConfirm(val) {
  489. this.form.partnerName = val[0].name;
  490. this.form.shopPartnerId = val[0].id;
  491. },
  492. // 选择区域
  493. regionChange(val, params) {
  494. this.form.provinceCode = val[0];
  495. this.form.cityCode = val[1];
  496. this.form.districtCode = val[2];
  497. const provinceName = params[0].label;
  498. const cityName = params[1].label;
  499. const districtName = params[2].label;
  500. this.regionName = {
  501. provinceName: provinceName,
  502. cityName: cityName,
  503. districtName: districtName,
  504. };
  505. },
  506. // 商铺详情
  507. async getShopInfo() {
  508. const {
  509. data
  510. } = await getShopInfo(this.shopId);
  511. this.form = {
  512. ...data,
  513. warehouseId: data.warehouseId.split(","),
  514. };
  515. this.startTime = new Date(
  516. "1970/01/01" + " " + data.openTime.start + ":00"
  517. );
  518. this.endTime = new Date(
  519. "1970/01/01" + " " + data.openTime.end + ":00"
  520. );
  521. this.img_list = [{
  522. name: "",
  523. url: data.logo,
  524. }, ];
  525. if (JSON.stringify(data.salesArea) === '["0-0-0"]') {
  526. this.is_all_region = 5;
  527. } else {
  528. this.is_all_region = 4;
  529. }
  530. let useWarehouseNameArr = [];
  531. for (let i in data.warehouseData) {
  532. useWarehouseNameArr.push({
  533. ...data.warehouseData[i],
  534. id: data.warehouseData[i].warehouseId,
  535. });
  536. }
  537. this.useWarehouseNameArr = useWarehouseNameArr;
  538. this.region_arr = data.salesArea;
  539. this.form.openTime.isAllDay = data.openTime.isAllDay === 1;
  540. // 将字符串转为数组
  541. this.region = [data.provinceCode, data.cityCode, data.districtCode].map(
  542. (item) => {
  543. return parseInt(item);
  544. }
  545. );
  546. },
  547. // 获取暂存数据
  548. async getTempShopData() {
  549. const {
  550. data
  551. } = await getPauseSave({
  552. key: this.$route.name,
  553. });
  554. if (JSON.stringify(data) === "{}") return;
  555. this.form = data;
  556. this.startTime = new Date(
  557. "1970/01/01" + " " + data.openTime.start + ":00"
  558. );
  559. this.endTime = new Date(
  560. "1970/01/01" + " " + data.openTime.end + ":00"
  561. );
  562. if (data.logo !== "") {
  563. this.img_list = [{
  564. name: "",
  565. url: data.logo,
  566. }, ];
  567. }
  568. this.useWarehouseNameArr = data.useWarehouseName ?
  569. data.useWarehouseName.map((item, index) => {
  570. return {
  571. warehouseName: item,
  572. id: parseInt(this.form.warehouseId[index]),
  573. };
  574. }) :
  575. [];
  576. this.is_all_region = data.is_all_region || 4;
  577. this.region_arr = data.salesArea;
  578. this.form.openTime.isAllDay = data.openTime.isAllDay === 1;
  579. // 将字符串转为数组
  580. this.region = [data.provinceCode, data.cityCode, data.districtCode].map(
  581. (item) => {
  582. return parseInt(item);
  583. }
  584. );
  585. },
  586. // 删除暂存信息
  587. async delPauseSave(type) {
  588. const data = delPauseSave({
  589. key: this.$route.name,
  590. });
  591. if (type) {
  592. this.$message({
  593. type: "success",
  594. message: "清除暂存成功",
  595. });
  596. this.$closeCurrentGoEdit("/Multistore/AddStore");
  597. }
  598. },
  599. // 暂存数据
  600. async temData(tempSave) {
  601. if (this.form.openTime.isAllDay) {
  602. this.form.openTime.isAllDay = 1;
  603. }
  604. const params = {
  605. ...this.form,
  606. is_all_region: this.is_all_region,
  607. area: this.regionName,
  608. tempSave: tempSave,
  609. useWarehouseName: this.useWarehouseName,
  610. };
  611. this.loading = true;
  612. const data = await addPauseSave({
  613. key: this.$route.name,
  614. data: params,
  615. });
  616. this.loading = false;
  617. this.$message({
  618. message: "暂存成功",
  619. type: "success",
  620. });
  621. this.$closeCurrentGoEdit("/Multistore/StoreList");
  622. },
  623. // 创建商铺 addShop
  624. async addShop(tempSave) {
  625. if (!this.form.name.trim() || !this.form.contactName.trim()) {
  626. this.$message.warning("必填项不能为空");
  627. return;
  628. }
  629. if (this.form.openTime.isAllDay) {
  630. this.form.openTime.isAllDay = 1;
  631. }
  632. this.$refs.form.validate(async (valid) => {
  633. if (valid) {
  634. if (!this.form.salesArea.length) {
  635. this.$message.warning("请选择销售区域");
  636. return;
  637. }
  638. const params = {
  639. ...this.form,
  640. area: this.regionName,
  641. tempSave: tempSave,
  642. };
  643. if (this.is_all_region === 5) {
  644. params.salesArea = ["0-0-0"];
  645. }
  646. this.loading = true;
  647. let target = {};
  648. if (this.shopId) {
  649. target = await editShop(this.shopId, {
  650. ...params,
  651. });
  652. } else {
  653. target = await addShop(params);
  654. }
  655. const data = target;
  656. this.loading = false;
  657. this.$message({
  658. message: "提交成功",
  659. type: "success",
  660. });
  661. if (parseInt(this.$store.getters["MUser/enterpriseScope"]) === 5) {
  662. this.$closeCurrentGoEdit("/Multistore/StoreList");
  663. } else {
  664. if (this.systemType === 1) {
  665. this.$closeCurrentGoEdit(
  666. "/SystemSettings/liansuoguanli/ShopList"
  667. );
  668. }
  669. }
  670. }
  671. });
  672. },
  673. },
  674. };
  675. </script>