爱简收旧衣按件回收前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

669 lines
22 KiB

"use strict";
const common_vendor = require("../../common/vendor.js");
const pages_mixins_tabBarMixin = require("../mixins/tabBarMixin.js");
const utils_pinyin = require("../../utils/pinyin.js");
const common_assets = require("../../common/assets.js");
const _sfc_main = {
mixins: [pages_mixins_tabBarMixin.tabBarMixin],
data() {
return {
value: 1,
ishow: true,
// 动态数据
allProducts: {},
// { [categoryId]: [商品数组] }
allProductsPage: {},
// { [categoryId]: 当前已加载页码 }
allProductsTotal: {},
// { [categoryId]: 总数 }
pageSize: 10,
currentCategory: 0,
tabbarHeight: 0,
showDetailPanel: false,
showBrandPopup: false,
showRulePopup: false,
ruleImgUrl: "/static/回收/回收规则.png",
showPickupConfirm: false,
showBrandConfirm: false,
brandConfirmInfo: {
logo: "",
name: ""
},
brandList: [],
brandIndexList: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"],
currentLetter: "A",
scrollToView: "",
brandSearch: "",
ruleHtml: "",
// 回收规则富文本内容
loadingMore: false,
finished: false,
pendingBrandIndex: null
// 记录待加一的品牌商品index
};
},
computed: {
// 当前分类的商品列表
recycleList() {
var _a;
const currentCategoryId = (_a = this.categories[this.currentCategory]) == null ? void 0 : _a.id;
return this.allProducts[currentCategoryId] || [];
},
// 计算总数量
totalCount() {
return Object.values(this.allProducts).reduce((total, categoryItems) => {
return total + categoryItems.reduce((sum, item) => sum + (item.quantity || 0), 0);
}, 0);
},
// 计算总价格
totalPrice() {
const total = Object.values(this.allProducts).reduce((categoryTotal, categoryItems) => {
return categoryTotal + categoryItems.reduce((sum, item) => sum + (item.quantity || 0) * Number(item.price), 0);
}, 0);
return total.toFixed(1);
},
// 计算价格范围
priceRange() {
if (this.totalCount === 0) {
return {
min: "0.0",
max: "0.0"
};
}
const total = Number(this.totalPrice);
const min = Math.max(0, total - 2.2).toFixed(1);
const max = (total + 2.2).toFixed(1);
return { min, max };
},
selectedProducts() {
return Object.values(this.allProducts).flat().filter((item) => item.quantity > 0);
},
filteredBrandList() {
if (!this.brandSearch)
return this.brandList;
const keyword = this.brandSearch.trim().toLowerCase();
return this.brandList.filter((b) => b.name.toLowerCase().includes(keyword));
},
bannerList() {
return getApp().globalData.bannerList || [];
},
categories() {
const list = getApp().globalData.pricePreviewList || [];
return list.filter((item) => item.pid === "0").sort((a, b) => a.sort - b.sort);
}
},
methods: {
changeTo(e) {
this.value = e;
if (e == 2) {
common_vendor.index.reLaunch({
url: "/pages/component/my"
});
} else if (e == 0) {
common_vendor.index.__f__("log", "at pages/component/recycle.vue:354", e, "111");
common_vendor.index.reLaunch({
url: "/pages/component/home"
});
}
},
fetchGoodsList(categoryId, page = 1, callback) {
this.$api("getClassGoodsList", {
classId: categoryId,
pageNo: page,
pageSize: this.pageSize
}, (res) => {
if (res.code === 200 && res.result && Array.isArray(res.result.records)) {
const oldList = this.allProducts[categoryId] || [];
const newList = page === 1 ? res.result.records : oldList.concat(res.result.records);
this.$set(this.allProducts, categoryId, newList);
this.$set(this.allProductsPage, categoryId, page);
this.$set(this.allProductsTotal, categoryId, res.result.total);
}
if (callback)
callback();
});
},
// 获取分类商品总数
getCategoryItemCount(index) {
var _a;
const categoryId = (_a = this.categories[index]) == null ? void 0 : _a.id;
const categoryItems = this.allProducts[categoryId] || [];
return categoryItems.reduce((sum, item) => sum + (item.quantity || 0), 0);
},
// 切换分类
switchCategory(index) {
var _a;
this.currentCategory = index;
this.loadingMore = false;
this.finished = false;
const categoryId = (_a = this.categories[index]) == null ? void 0 : _a.id;
if (!this.allProducts[categoryId]) {
this.fetchGoodsList(categoryId, 1);
}
},
// 更新商品数量
updateQuantity(index, delta) {
var _a, _b;
const categoryId = (_a = this.categories[this.currentCategory]) == null ? void 0 : _a.id;
const item = (_b = this.allProducts[categoryId]) == null ? void 0 : _b[index];
if (!item)
return;
if (item.shopCion && (item.quantity || 0) === 0 && delta > 0) {
this.pendingBrandIndex = index;
this.getGoodsBrandList(item.shopCion);
this.showBrandPopup = true;
return;
}
let newQuantity = (item.quantity || 0) + delta;
if (newQuantity < 0)
newQuantity = 0;
this.$set(item, "quantity", newQuantity);
},
// 显示回收规则
showRules(item) {
this.$api("getGoodsRecycleRule", { goodsId: item.id }, (res) => {
if (res.code === 200 && res.result) {
this.ruleHtml = res.result;
} else {
this.ruleHtml = "<p>暂无回收规则</p>";
}
this.showRulePopup = true;
});
},
showMore() {
common_vendor.index.showToast({
title: "更多规则请咨询客服",
icon: "none"
});
},
submitOrder() {
if (this.totalCount === 0) {
common_vendor.index.showToast({
title: "请选择要回收的物品",
icon: "none"
});
return;
}
this.showPickupConfirm = true;
},
handlePickupCancel() {
this.showPickupConfirm = false;
},
handlePickupAgree() {
this.showPickupConfirm = false;
common_vendor.index.showLoading({
title: "提交中..."
});
setTimeout(() => {
common_vendor.index.hideLoading();
common_vendor.index.showToast({
title: "预约成功",
icon: "success"
});
this.goToPickup();
}, 1500);
},
goToPickup() {
const selectedItems = this.selectedProducts.map((item) => ({
id: item.id,
name: item.name,
icon: item.image,
quantity: item.quantity,
unitPrice: item.price,
desc: "允许脏破烂,160码以上"
}));
const itemsStr = encodeURIComponent(JSON.stringify(selectedItems));
common_vendor.index.navigateTo({
url: `/pages/subcomponent/pickup?fromRecycle=true&items=${itemsStr}`
});
},
checkBrand(index) {
var _a, _b;
const categoryId = (_a = this.categories[this.currentCategory]) == null ? void 0 : _a.id;
const item = (_b = this.allProducts[categoryId]) == null ? void 0 : _b[index];
if (item == null ? void 0 : item.shopCion) {
this.pendingBrandIndex = index;
this.getGoodsBrandList(item.shopCion);
this.showBrandPopup = true;
}
},
closeBrandPopup() {
this.showBrandPopup = false;
},
scrollToLetter(letter) {
this.currentLetter = letter;
this.scrollToView = "brand-letter-" + letter;
},
// 添加下拉刷新方法
async refreshData() {
try {
this.currentCategory = 0;
Object.values(this.allProducts).forEach((categoryItems) => {
categoryItems.forEach((item) => {
item.quantity = 0;
});
});
await new Promise((resolve) => setTimeout(resolve, 1e3));
common_vendor.index.showToast({
title: "刷新成功",
icon: "success"
});
} catch (error) {
common_vendor.index.showToast({
title: "刷新失败",
icon: "none"
});
} finally {
common_vendor.index.stopPullDownRefresh();
}
},
toggleDetailPanel() {
this.showDetailPanel = !this.showDetailPanel;
},
updateQuantityByProduct(item, delta) {
if (!item.quantity)
item.quantity = 0;
item.quantity += delta;
if (item.quantity < 0)
item.quantity = 0;
this.updateTotal();
},
openRulePopup() {
this.showRulePopup = true;
},
closeRulePopup() {
this.showRulePopup = false;
},
loadMoreGoods() {
var _a;
const categoryId = (_a = this.categories[this.currentCategory]) == null ? void 0 : _a.id;
const page = (this.allProductsPage[categoryId] || 1) + 1;
const total = this.allProductsTotal[categoryId] || 0;
const loaded = (this.allProducts[categoryId] || []).length;
if (this.loadingMore || this.finished)
return;
if (loaded < total) {
this.loadingMore = true;
this.fetchGoodsList(categoryId, page, () => {
this.loadingMore = false;
const newLoaded = (this.allProducts[categoryId] || []).length;
this.finished = newLoaded >= (this.allProductsTotal[categoryId] || 0);
});
} else {
this.finished = true;
}
},
openBrandConfirm(brand) {
this.brandConfirmInfo = {
logo: brand.logo,
name: brand.name
};
this.showBrandConfirm = true;
},
closeBrandConfirm() {
this.showBrandConfirm = false;
},
confirmBrand() {
var _a, _b;
this.showBrandConfirm = false;
this.showBrandPopup = false;
if (this.pendingBrandIndex !== null) {
const categoryId = (_a = this.categories[this.currentCategory]) == null ? void 0 : _a.id;
const item = (_b = this.allProducts[categoryId]) == null ? void 0 : _b[this.pendingBrandIndex];
if (item) {
this.$set(item, "quantity", 1);
}
this.pendingBrandIndex = null;
}
},
getGoodsBrandList(iconId) {
this.$api("getGoodsBrandList", { iconId }, (res) => {
if (res && res.success && res.result && res.result.records) {
this.brandList = res.result.records.map((item) => {
const firstChar = this.getPinyinFirstLetter(item.name);
return {
logo: item.image || "/static/brand/alexander.png",
name: item.name,
letter: firstChar
};
});
}
});
},
// 获取中文拼音首字母
getPinyinFirstLetter(str) {
if (!str)
return "#";
const firstChar = str.charAt(0);
for (let key in utils_pinyin.pinyin) {
const chars = utils_pinyin.pinyin[key];
if (chars && chars.indexOf(firstChar) !== -1) {
return key.charAt(0).toUpperCase();
}
}
return "#";
}
},
created() {
this.currentCategory = 0;
this.$nextTick(() => {
var _a;
if (this.categories.length > 0) {
const firstCategoryId = (_a = this.categories[0]) == null ? void 0 : _a.id;
if (firstCategoryId) {
this.fetchGoodsList(firstCategoryId, 1);
}
}
});
},
mounted() {
this.$nextTick(() => {
const query = common_vendor.index.createSelectorQuery().in(this);
query.select(".uv-tabbar").boundingClientRect((rect) => {
if (rect && rect.height) {
this.tabbarHeight = rect.height;
} else {
this.tabbarHeight = common_vendor.index.upx2px ? common_vendor.index.upx2px(95) : 45;
}
}).exec();
});
},
onLoad(options) {
if (options && options.categoryId) {
const idx = this.categories.findIndex((c) => c.id == options.categoryId);
if (idx !== -1)
this.currentCategory = idx;
}
this.fetchGoodsList(this.categories[this.currentCategory].id, 1);
common_vendor.index.$on("bannerListUpdated", () => {
this.$forceUpdate && this.$forceUpdate();
});
if (getApp().globalData.bannerList && getApp().globalData.bannerList.length > 0) {
this.$forceUpdate && this.$forceUpdate();
}
if (getApp().globalData.shouldClearRecycle) {
Object.values(this.allProducts).forEach((categoryItems) => {
categoryItems.forEach((item) => {
this.$set(item, "quantity", 0);
});
});
this.showDetailPanel = false;
this.$forceUpdate();
getApp().globalData.shouldClearRecycle = false;
}
},
onUnload() {
common_vendor.index.$off("bannerListUpdated");
common_vendor.index.$off("clearRecycleOrderData");
},
onShow() {
const id = getApp().globalData.targetRecycleCategoryId;
if (id) {
const trySwitch = () => {
var _a;
if (this.categories.length > 0) {
const idx = this.categories.findIndex((c) => String(c.id) === String(id));
if (idx !== -1) {
this.currentCategory = idx;
const categoryId = (_a = this.categories[idx]) == null ? void 0 : _a.id;
if (categoryId && !this.allProducts[categoryId]) {
this.loadingMore = false;
this.finished = false;
this.fetchGoodsList(categoryId, 1);
}
}
getApp().globalData.targetRecycleCategoryId = null;
} else {
setTimeout(trySwitch, 100);
}
};
trySwitch();
}
if (getApp().globalData.shouldClearRecycle) {
Object.values(this.allProducts).forEach((categoryItems) => {
categoryItems.forEach((item) => {
this.$set(item, "quantity", 0);
});
});
this.showDetailPanel = false;
this.$forceUpdate();
getApp().globalData.shouldClearRecycle = false;
}
common_vendor.index.$on("clearRecycleOrderData", () => {
Object.values(this.allProducts).forEach((categoryItems) => {
categoryItems.forEach((item) => {
this.$set(item, "quantity", 0);
});
});
this.showDetailPanel = false;
this.$forceUpdate();
});
},
watch: {
categories(newVal) {
var _a;
const id = getApp().globalData.targetRecycleCategoryId;
const idx = newVal.findIndex((c) => String(c.id) === String(id));
if (id && newVal.length > 0 && idx !== -1) {
this.currentCategory = idx;
getApp().globalData.targetRecycleCategoryId = null;
const categoryId = (_a = newVal[idx]) == null ? void 0 : _a.id;
if (categoryId && !this.allProducts[categoryId]) {
this.loadingMore = false;
this.finished = false;
this.fetchGoodsList(categoryId, 1);
}
}
}
}
};
const __injectCSSVars__ = () => {
common_vendor.useCssVars((_ctx) => ({
"a20a0960": _ctx.tabbarHeight + "px"
}));
};
const __setup__ = _sfc_main.setup;
_sfc_main.setup = __setup__ ? (props, ctx) => {
__injectCSSVars__();
return __setup__(props, ctx);
} : __injectCSSVars__;
if (!Array) {
const _easycom_uni_icons2 = common_vendor.resolveComponent("uni-icons");
const _easycom_uv_tabbar_item2 = common_vendor.resolveComponent("uv-tabbar-item");
const _easycom_uv_tabbar2 = common_vendor.resolveComponent("uv-tabbar");
(_easycom_uni_icons2 + _easycom_uv_tabbar_item2 + _easycom_uv_tabbar2)();
}
const _easycom_uni_icons = () => "../../uni_modules/uni-icons/components/uni-icons/uni-icons.js";
const _easycom_uv_tabbar_item = () => "../../uni_modules/uv-tabbar/components/uv-tabbar-item/uv-tabbar-item.js";
const _easycom_uv_tabbar = () => "../../uni_modules/uv-tabbar/components/uv-tabbar/uv-tabbar.js";
if (!Math) {
(_easycom_uni_icons + _easycom_uv_tabbar_item + _easycom_uv_tabbar)();
}
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return common_vendor.e({
a: common_vendor.f($options.bannerList, (item, index, i0) => {
return {
a: item.image,
b: item.id || index
};
}),
b: common_vendor.f($options.categories, (category, index, i0) => {
return common_vendor.e({
a: $options.getCategoryItemCount(index) > 0
}, $options.getCategoryItemCount(index) > 0 ? {} : {}, {
b: common_vendor.t(category.title),
c: category.id || index,
d: $data.currentCategory === index ? 1 : "",
e: common_vendor.o(($event) => $options.switchCategory(index), category.id || index)
});
}),
c: common_vendor.f($options.recycleList, (item, index, i0) => {
return common_vendor.e({
a: item.image
}, item.image ? {
b: item.image
} : {}, {
c: common_vendor.t(item.name),
d: "9e04663e-0-" + i0,
e: common_vendor.o(($event) => $options.showRules(item), index),
f: common_vendor.t(item.service),
g: common_vendor.t(item.price),
h: common_vendor.o(($event) => $options.updateQuantity(index, -1), index),
i: common_vendor.t(item.quantity || 0),
j: common_vendor.o(($event) => $options.updateQuantity(index, 1), index),
k: item.shopCion
}, item.shopCion ? {
l: "9e04663e-1-" + i0,
m: common_vendor.p({
type: "right",
size: "14",
color: "#ff7a0e"
}),
n: common_vendor.o(($event) => $options.checkBrand(index), index)
} : {}, {
o: index
});
}),
d: common_vendor.p({
type: "right",
size: "14",
color: "#999"
}),
e: common_assets._imports_0$1,
f: $data.loadingMore
}, $data.loadingMore ? {} : $data.finished ? {} : {}, {
g: $data.finished,
h: common_vendor.o((...args) => $options.loadMoreGoods && $options.loadMoreGoods(...args)),
i: !$data.showDetailPanel
}, !$data.showDetailPanel ? {
j: common_vendor.t($options.totalCount),
k: common_vendor.p({
type: "help",
size: "18",
color: "#b2b2b2"
}),
l: common_vendor.o($options.toggleDetailPanel),
m: common_vendor.p({
type: $data.showDetailPanel ? "up" : "down",
size: "18",
color: "#5e5e5e"
}),
n: common_vendor.t($options.priceRange.min),
o: common_vendor.t($options.priceRange.max),
p: common_vendor.o((...args) => $options.submitOrder && $options.submitOrder(...args))
} : {}, {
q: $data.showDetailPanel
}, $data.showDetailPanel ? {
r: common_vendor.o((...args) => $options.toggleDetailPanel && $options.toggleDetailPanel(...args)),
s: common_vendor.f($options.selectedProducts, (item, idx, i0) => {
return common_vendor.e({
a: item.image
}, item.image ? {
b: item.image
} : {}, {
c: common_vendor.t(item.name),
d: common_vendor.t(item.price),
e: common_vendor.o(($event) => $options.updateQuantityByProduct(item, -1), idx),
f: common_vendor.t(item.quantity),
g: common_vendor.o(($event) => $options.updateQuantityByProduct(item, 1), idx),
h: idx
});
}),
t: common_vendor.t(2222),
v: common_vendor.t($options.totalCount),
w: common_vendor.p({
type: "help",
size: "18",
color: "#b2b2b2"
}),
x: common_vendor.o($options.toggleDetailPanel),
y: common_vendor.p({
type: $data.showDetailPanel ? "up" : "down",
size: "18",
color: "#5e5e5e"
}),
z: common_vendor.t($options.priceRange.min),
A: common_vendor.t($options.priceRange.max),
B: common_vendor.o((...args) => $options.submitOrder && $options.submitOrder(...args)),
C: common_vendor.o(() => {
}),
D: common_vendor.o((...args) => $options.toggleDetailPanel && $options.toggleDetailPanel(...args))
} : {}, {
E: $data.ishow
}, $data.ishow ? {
F: common_assets._imports_5,
G: common_assets._imports_6,
H: common_vendor.p({
text: "首页"
}),
I: common_assets._imports_7,
J: common_assets._imports_8,
K: common_vendor.p({
text: "回收"
}),
L: common_assets._imports_9,
M: common_assets._imports_10,
N: common_vendor.p({
text: "我的"
}),
O: common_vendor.o($options.changeTo),
P: common_vendor.p({
value: $data.value,
fixed: true
})
} : {}, {
Q: $data.showBrandPopup
}, $data.showBrandPopup ? {
R: common_vendor.o((...args) => $options.closeBrandPopup && $options.closeBrandPopup(...args)),
S: $data.brandSearch,
T: common_vendor.o(($event) => $data.brandSearch = $event.detail.value),
U: common_vendor.f($data.brandIndexList, (letter, k0, i0) => {
return {
a: common_vendor.t(letter),
b: common_vendor.f($options.filteredBrandList.filter((b) => b.letter === letter), (brand, k1, i1) => {
return {
a: brand.logo,
b: common_vendor.t(brand.name),
c: brand.name,
d: common_vendor.o(($event) => $options.openBrandConfirm(brand), brand.name)
};
}),
c: letter,
d: "brand-letter-" + letter
};
}),
V: $data.scrollToView,
W: common_vendor.f($data.brandIndexList, (letter, k0, i0) => {
return {
a: common_vendor.t(letter),
b: letter,
c: $data.currentLetter === letter ? 1 : "",
d: common_vendor.o(($event) => $options.scrollToLetter(letter), letter)
};
})
} : {}, {
X: $data.showRulePopup
}, $data.showRulePopup ? {
Y: $data.ruleHtml,
Z: common_vendor.o((...args) => $options.closeRulePopup && $options.closeRulePopup(...args)),
aa: common_vendor.o((...args) => $options.closeRulePopup && $options.closeRulePopup(...args))
} : {}, {
ab: $data.showPickupConfirm
}, $data.showPickupConfirm ? {
ac: common_vendor.o((...args) => $options.handlePickupCancel && $options.handlePickupCancel(...args)),
ad: common_vendor.o((...args) => $options.handlePickupAgree && $options.handlePickupAgree(...args))
} : {}, {
ae: $data.showBrandConfirm
}, $data.showBrandConfirm ? {
af: $data.brandConfirmInfo.logo,
ag: common_vendor.t($data.brandConfirmInfo.name),
ah: common_vendor.o((...args) => $options.closeBrandConfirm && $options.closeBrandConfirm(...args)),
ai: common_vendor.o((...args) => $options.confirmBrand && $options.confirmBrand(...args)),
aj: common_vendor.o((...args) => $options.closeBrandConfirm && $options.closeBrandConfirm(...args))
} : {}, {
ak: common_vendor.s(_ctx.__cssVars())
});
}
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-9e04663e"]]);
wx.createPage(MiniProgramPage);
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/component/recycle.js.map