diff --git a/src/views/app/shop/addEdit.vue b/src/views/app/shop/addEdit.vue index a3d8365..03ad4fd 100644 --- a/src/views/app/shop/addEdit.vue +++ b/src/views/app/shop/addEdit.vue @@ -320,8 +320,6 @@ bindShopPrinter, getShopPrintConfig, findShopWorkerByMobile, - initShopArea, - loadShopArea, } from "@/api/app"; export default { name: "addEdit", @@ -350,6 +348,7 @@ roleList: [], roleList2: [], shopAreaList: [], + shopType: [], businessDistrictLevelList: [], userDepartmentId: userInfo.departmentId || "", visible: this.value, @@ -521,22 +520,9 @@ this.businessDistrictLevelList = res.result; } }); - initShopArea().then((res) => { - - if (res.success) { - res.result.forEach(function(e) { - if (e.isParent) { - e.loading = false; - e.children = []; - e._loading = false; - } - }); - this.data = res.result; - } - }); getDictDataByType("shopType").then((res) => { if (res.success) { - this.shopType = res.result; + this.shopType = Array.isArray(res.result) ? res.result : []; } }); }, @@ -681,7 +667,7 @@ }, applyShopImages(data) { const form = Object.assign({}, data); - if (form.shopImages) { + if (typeof form.shopImages === "string" && form.shopImages) { const images = form.shopImages.split("@@"); form.zhengzhao = form.zhengzhao || images[0] || ""; form.fanzhao = form.fanzhao || images[1] || ""; @@ -691,6 +677,55 @@ form.qita = this.parseOtherImages(form.qita); return form; }, + normalizeNumber(value, fallback) { + if (value === null || value === undefined || value === "") return fallback; + const numberValue = Number(value); + return Number.isFinite(numberValue) ? numberValue : fallback; + }, + clearFormValidate() { + const form = this.$refs.form; + if (!form || !Array.isArray(form.fields)) return; + form.fields.forEach((field) => { + if (!field || field._isDestroyed) return; + field.validateState = ""; + field.validateMessage = ""; + }); + }, + validateBeforeSubmit() { + if (!this.form.shopLename) { + this.$Message.warning("请输入联系人"); + return false; + } + if (!this.form.shopArea) { + this.$Message.warning("请选择所属区域"); + return false; + } + if (this.form.merchantType == 1 && this.form.supportShopDelivery == 1) { + if (!this.form.shopDeliveryLocation) { + this.$Message.warning("请选择送达位置"); + return false; + } + if (!this.form.shopDeliveryDuration || Number(this.form.shopDeliveryDuration) <= 0) { + this.$Message.warning("请输入配送时长"); + return false; + } + if (!this.form.workerId) { + this.$Message.warning("请查询并绑定配送员"); + return false; + } + } + if (this.form.merchantType == 1 && this.form.supportTransferDelivery == 1) { + if (!this.form.transferDeliveryDuration || Number(this.form.transferDeliveryDuration) <= 0) { + this.$Message.warning("请输入中转配送时长"); + return false; + } + if (!this.form.transferAddressId) { + this.$Message.warning("请选择中转地点"); + return false; + } + } + return true; + }, normalizeRegisterFields() { if (this.form.merchantType == null || this.form.merchantType === "") { this.$set(this.form, "merchantType", 1); @@ -758,78 +793,99 @@ this.form.transferDeliveryDuration = Number(this.form.transferDeliveryDuration || 0); } }, - cleanDisplayFields() { - delete this.form.users - delete this.form.products - delete this.form.shopTakeaway - delete this.form.clerks - delete this.form.keyWord - delete this.form.isAdmin - delete this.form.saleCounts - delete this.form.groupDeliveryTime + cleanDisplayFields(payload) { + const data = payload || {}; + delete data.users; + delete data.products; + delete data.shopTakeaway; + delete data.clerks; + delete data.keyWord; + delete data.isAdmin; + delete data.saleCounts; + delete data.groupDeliveryTime; + // 旧项目复制过来的金额字段,当前页面不编辑。null 经表单编码会变成字符串 "null",无法转成 BigDecimal + const unusedNumberFields = ["balance", "yearFee", "baseDeliveryFee", "shopScore"]; + for (let i = 0; i < unusedNumberFields.length; i++) { + const key = unusedNumberFields[i]; + const value = data[key]; + if (value === null || value === undefined || value === "" || value === "null") { + delete data[key]; + } + } + const keys = Object.keys(data); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (data[key] === null || data[key] === undefined) { + delete data[key]; + } + } + return data; + }, + formatSubmitDate(value) { + if (!(value instanceof Date) || isNaN(value.getTime())) return value; + return this.format(value, "yyyy-MM-dd"); + }, + buildSubmitPayload() { + const payload = Object.assign({}, this.form); + payload.chargeTime = this.formatSubmitDate(payload.chargeTime); + payload.startTime = this.formatSubmitDate(payload.startTime); + payload.endTime = this.formatSubmitDate(payload.endTime); + const shopTypes = Array.isArray(this.shopType) ? this.shopType : []; + if (payload.shopType !== "" && payload.shopType != null) { + for (let i = 0; i < shopTypes.length; i++) { + const item = shopTypes[i]; + if (item && payload.shopType == item.value) { + payload.shopTypeTitle = item.title; + break; + } + } + } + payload.shopMangerId = payload.shopOwnerId; + this.cleanDisplayFields(payload); + if (this.type == "1") { + delete payload.saleCount; + delete payload.storeFlag; + delete payload.printingMethod; + } + return payload; }, changePass(v, grade, strength) { this.form.passStrength = strength; }, submit() { - this.normalizeRegisterFields(); - this.normalizeSelfDeliveryForm(); - this.normalizeTransferDeliveryForm(); - this.$refs.form.validate((valid) => { - if (valid) { - if (typeof this.form.chargeTime == "object") { - this.form.chargeTime = this.format(this.form.chargeTime, "yyyy-MM-dd"); - } - if (typeof this.form.startTime == "object") { - this.form.startTime = this.format(this.form.startTime, "yyyy-MM-dd"); - } - if (typeof this.form.endTime == "object") { - this.form.endTime = this.format(this.form.endTime, "yyyy-MM-dd"); - } - // 处理商品分类的名称 - if (this.form.shopType != '' && this.form.shopType != null) { - this.shopType.forEach(item => { - if (this.form.shopType == item.value) { - this.form.shopTypeTitle = item.title; - } - }); - } - this.form.shopMangerId = this.form.shopOwnerId - this.cleanDisplayFields() - if (this.type == "1") { - // 编辑 - this.submitLoading = true; - delete this.form.saleCount - delete this.form.storeFlag - delete this.form.printingMethod - delete this.form.printingMethod - editShop(this.form).then((res) => { - this.submitLoading = false; - if (res.success) { - this.$Message.success("操作成功"); - this.$emit("on-submit", true); - this.visible = false; - } - }); - } else { - // 添加 - this.submitLoading = true; - addShop(this.form).then((res) => { - this.submitLoading = false; - if (res.success) { - this.$Message.success("操作成功"); - this.$emit("on-submit", true); - this.visible = false; - } - }); + if (this.submitLoading) return; + try { + this.normalizeRegisterFields(); + this.normalizeSelfDeliveryForm(); + this.normalizeTransferDeliveryForm(); + if (!this.validateBeforeSubmit()) return; + const payload = this.buildSubmitPayload(); + const finishSubmit = (res) => { + this.submitLoading = false; + if (res && res.success) { + this.$Message.success("操作成功"); + this.$emit("on-submit", true); + this.visible = false; } - } - }); + }; + this.submitLoading = true; + const request = this.type == "1" ? editShop(payload) : addShop(payload); + request.then(finishSubmit).catch(() => { + this.submitLoading = false; + }); + } catch (e) { + this.submitLoading = false; + this.$Message.error((e && e.message) || "提交失败"); + } }, setCurrentValue(value) { if (value === this.visible) { return; } + if (!value) { + this.visible = false; + return; + } if (this.type == "1") { this.title = "编辑店铺"; this.maxHeight = @@ -842,26 +898,23 @@ this.title = "店铺详情"; this.maxHeight = "100%"; } - // 清空数据 - this.$refs.form.resetFields(); if (this.type == "0" || this.type == "1") { - // 回显数据 - let data = this.data; - // 地址 - if (data.address) { + const data = Object.assign({}, this.data || {}); + if (Array.isArray(data.address)) { + data.address = data.address.slice(); + } else if (typeof data.address === "string" && data.address) { data.address = data.address.split(","); } else { data.address = []; } - // 回显 const registerData = this.applyShopImages(data); this.form = Object.assign({}, registerData, { - merchantType: registerData.merchantType == null ? 1 : Number(registerData.merchantType), - isStudent: registerData.isStudent == null ? 0 : Number(registerData.isStudent), - startingPrice: registerData.startingPrice == null ? 0 : Number(registerData.startingPrice), + merchantType: this.normalizeNumber(registerData.merchantType, 1), + isStudent: this.normalizeNumber(registerData.isStudent, 0), + startingPrice: this.normalizeNumber(registerData.startingPrice, 0), openKitchenVideoUrl: registerData.openKitchenVideoUrl || "", - supportDineIn: registerData.supportDineIn == null ? 0 : Number(registerData.supportDineIn), - storeConsumeOnly: registerData.storeConsumeOnly == null ? 0 : Number(registerData.storeConsumeOnly), + supportDineIn: this.normalizeNumber(registerData.supportDineIn, 0), + storeConsumeOnly: this.normalizeNumber(registerData.storeConsumeOnly, 0), contactPhone: registerData.contactPhone || registerData.mobile || "", mobile: registerData.mobile || registerData.contactPhone || "", zhengzhao: registerData.zhengzhao || "", @@ -870,12 +923,12 @@ shopLename: registerData.shopLename || "", shopLecard: registerData.shopLecard || "", qita: registerData.qita || [], - supportShopDelivery: data.supportShopDelivery == null ? 0 : Number(data.supportShopDelivery), - orderBkge: data.orderBkge == null ? 0 : Number(data.orderBkge), - shopDeliveryLocation: data.shopDeliveryLocation == null ? null : Number(data.shopDeliveryLocation), - shopDeliveryDuration: data.shopDeliveryDuration == null ? null : Number(data.shopDeliveryDuration), - supportTransferDelivery: data.supportTransferDelivery == null ? 0 : Number(data.supportTransferDelivery), - transferDeliveryDuration: data.transferDeliveryDuration == null ? null : Number(data.transferDeliveryDuration), + supportShopDelivery: this.normalizeNumber(data.supportShopDelivery, 0), + orderBkge: this.normalizeNumber(data.orderBkge, 0), + shopDeliveryLocation: this.normalizeNumber(data.shopDeliveryLocation, ""), + shopDeliveryDuration: this.normalizeNumber(data.shopDeliveryDuration, null), + supportTransferDelivery: this.normalizeNumber(data.supportTransferDelivery, 0), + transferDeliveryDuration: this.normalizeNumber(data.transferDeliveryDuration, null), transferAddressId: data.transferAddressId || "", transferAddressName: data.transferAddressName || "", }); @@ -887,18 +940,16 @@ this.loadPrintConfig(); this.workerMobile = this.form.workerPhone || ""; this.$nextTick(() => { - // 商圈 - this.$refs.shopAreaTree.setData(this.form.shopArea, this.form.shopAreaTitle); + this.clearFormValidate(); + if (this.$refs.shopAreaTree) { + this.$refs.shopAreaTree.setData(this.form.shopArea, this.form.shopAreaTitle); + } if (this.$refs.transferAddressTree) { this.$refs.transferAddressTree.setData(this.form.transferAddressId, this.form.transferAddressName); } }); } else { - // 添加 this.form = { - /*type: 0, - sex: "", - address: [],*/ merchantType: 1, isStudent: 0, startingPrice: 0, @@ -917,7 +968,10 @@ }; this.workerMobile = ""; this.$nextTick(() => { - this.$refs.shopAreaTree.setData("", ""); + this.clearFormValidate(); + if (this.$refs.shopAreaTree) { + this.$refs.shopAreaTree.setData("", ""); + } if (this.$refs.transferAddressTree) { this.$refs.transferAddressTree.setData("", ""); } diff --git a/src/views/app/shop/shop.vue b/src/views/app/shop/shop.vue index d9cef4e..3236d7a 100644 --- a/src/views/app/shop/shop.vue +++ b/src/views/app/shop/shop.vue @@ -319,7 +319,8 @@ h( "a", { on: { - click: () => { + click: (event) => { + event.stopPropagation(); this.edit(params.row); }, }, @@ -440,15 +441,16 @@ getShopData(this.searchForm).then((res) => { this.loading = false; if (res.success) { + const rows = res.result && Array.isArray(res.result.content) ? res.result.content : []; if (!this.getStore("roles").includes("ROLE_ADMIN")) { - res.result.content.forEach((e) => { + rows.forEach((e) => { e.mobile = "您无权查看该数据"; }); } - this.data = res.result.content; + this.data = rows; - this.total = res.result.totalElements; + this.total = res.result && res.result.totalElements ? res.result.totalElements : 0; if (this.data.length == 0 && this.searchForm.pageNumber > 1) { this.searchForm.pageNumber -= 1; this.getDataList(); @@ -538,17 +540,23 @@ }); }, edit(v) { - // 转换null为"" - for (let attr in v) { - if (v[attr] == null) { - v[attr] = ""; - } + let data = {}; + try { + data = JSON.parse(JSON.stringify(v)); + } catch (e) { + data = Object.assign({}, v); } - let str = JSON.stringify(v); - let data = JSON.parse(str); this.form = data; this.showType = "1"; - this.showUser = true; + // 上次打开如果中途报错,showUser 会停在 true,再次赋值不会触发抽屉 + if (this.showUser) { + this.showUser = false; + this.$nextTick(() => { + this.showUser = true; + }); + } else { + this.showUser = true; + } }, mernage(v) { // 转换null为"" diff --git a/src/views/my-components/hiver/dict.vue b/src/views/my-components/hiver/dict.vue index b7f6505..a916fb4 100644 --- a/src/views/my-components/hiver/dict.vue +++ b/src/views/my-components/hiver/dict.vue @@ -70,7 +70,7 @@ getDictDataByType(v).then((res) => { this.loading = false; if (res.success) { - this.dictData = res.result; + this.dictData = Array.isArray(res.result) ? res.result : []; } }); diff --git a/src/views/my-components/hiver/shopArea-tree-choose.vue b/src/views/my-components/hiver/shopArea-tree-choose.vue index 4360012..cba2fd5 100644 --- a/src/views/my-components/hiver/shopArea-tree-choose.vue +++ b/src/views/my-components/hiver/shopArea-tree-choose.vue @@ -90,21 +90,27 @@ }; }, methods: { + normalizeAreaList(list) { + const areas = Array.isArray(list) ? list : []; + for (let i = 0; i < areas.length; i++) { + const item = areas[i]; + if (!item) continue; + if (item.isParent) { + item.loading = false; + item.children = []; + } + if (item.status == -1) { + item.title = "[已禁用] " + item.title; + item.disabled = true; + } + } + return areas; + }, initShopAreaData() { const request = this.rootId ? loadShopArea(this.rootId) : initShopArea(); request.then((res) => { if (res.success) { - res.result.forEach(function(e) { - if (e.isParent) { - e.loading = false; - e.children = []; - } - if (e.status == -1) { - e.title = "[已禁用] " + e.title; - e.disabled = true; - } - }); - this.dataDep = res.result; + this.dataDep = this.normalizeAreaList(res.result); this.syncSelectedTitle(); } }); @@ -112,18 +118,12 @@ loadData(item, callback) { loadShopArea(item.id).then((res) => { if (res.success) { - res.result.forEach(function(e) { - if (e.isParent) { - e.loading = false; - e.children = []; - } - if (e.status == -1) { - e.title = "[已禁用] " + e.title; - e.disabled = true; - } - }); - callback(res.result); + callback(this.normalizeAreaList(res.result)); + } else { + callback([]); } + }).catch(() => { + callback([]); }); }, searchDep() { @@ -140,13 +140,7 @@ searchShopArea(params).then((res) => { this.depLoading = false; if (res.success) { - res.result.forEach(function(e) { - if (e.status == -1) { - e.title = "[已禁用] " + e.title; - e.disabled = true; - } - }); - this.dataDep = res.result; + this.dataDep = this.normalizeAreaList(res.result); } }); } else { @@ -156,7 +150,8 @@ selectTree(v) { let ids = [], title = ""; - v.forEach((e) => { + const selected = Array.isArray(v) ? v : []; + selected.forEach((e) => { ids.push(e.id); if (title == "") { title = e.title; @@ -214,7 +209,7 @@ if (selectedIds.includes(String(item.id))) { titles.push(item.title); } - if (item.children && item.children.length) { + if (Array.isArray(item.children) && item.children.length) { findTitles(item.children); } }); diff --git a/src/views/sys/order-manage/logisticsAddress.vue b/src/views/sys/order-manage/logisticsAddress.vue index 67f7805..e754026 100644 --- a/src/views/sys/order-manage/logisticsAddress.vue +++ b/src/views/sys/order-manage/logisticsAddress.vue @@ -633,3 +633,7 @@ + + + +