商城插件更新

This commit is contained in:
wangchen147 2025-05-16 09:57:35 +08:00
parent 0acb40ddd4
commit ecb1212a2b
11 changed files with 78 additions and 2455 deletions

View File

@ -42,7 +42,7 @@
</el-form-item> </el-form-item>
<el-form-item prop="address"> <el-form-item prop="address">
<el-input v-model.trim="formData.address" clearable :placeholder="t('addressPlaceholder')" class="input-width"/> <el-input v-model.trim="formData.address" clearable :placeholder="t('addressPlaceholder')" @input="areaChange()" class="input-width"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -326,7 +326,8 @@ const areaChange = debounce(() => {
const address = [ const address = [
formData.province_id ? provinceRef.value.states.selectedLabel : '', formData.province_id ? provinceRef.value.states.selectedLabel : '',
formData.city_id ? cityRef.value.states.selectedLabel : '', formData.city_id ? cityRef.value.states.selectedLabel : '',
formData.district_id ? districtRef.value.states.selectedLabel : '' formData.district_id ? districtRef.value.states.selectedLabel : '',
formData.address
] ]
addressToLatLng({ mapKey, address: address.join('') }).then(({ message, result }) => { addressToLatLng({ mapKey, address: address.join('') }).then(({ message, result }) => {

View File

@ -1,63 +1,63 @@
<template> <template>
<div class="main-container"> <div class="main-container">
<el-card class="card !border-none mb-[15px]" shadow="never"> <el-card class="card !border-none mb-[15px]" shadow="never">
<el-page-header :content="id ? t('updateStore') : t('addStore')" :icon="ArrowLeft" @back="back" /> <el-page-header :content="id ? t('updateStore') : t('addStore')" :icon="ArrowLeft" @back="back" />
</el-card> </el-card>
<el-card class="box-card !border-none" shadow="never" v-loading="loading"> <el-card class="box-card !border-none" shadow="never" v-loading="loading">
<el-form :model="formData" label-width="140px" ref="formRef" :rules="formRules" class="page-form"> <el-form :model="formData" label-width="140px" ref="formRef" :rules="formRules" class="page-form">
<el-form-item :label="t('storeName')" prop="store_name"> <el-form-item :label="t('storeName')" prop="store_name">
<el-input v-model.trim="formData.store_name" clearable :placeholder="t('storeNamePlaceholder')" <el-input v-model.trim="formData.store_name" clearable :placeholder="t('storeNamePlaceholder')"
class="input-width" /> class="input-width" />
</el-form-item> </el-form-item>
<el-form-item :label="t('storeDesc')"> <el-form-item :label="t('storeDesc')">
<el-input v-model.trim="formData.store_desc" type="textarea" rows="4" clearable <el-input v-model.trim="formData.store_desc" type="textarea" rows="4" clearable
:placeholder="t('storeDescPlaceholder')" class="input-width" /> :placeholder="t('storeDescPlaceholder')" class="input-width" />
</el-form-item> </el-form-item>
<el-form-item :label="t('storeLogo')"> <el-form-item :label="t('storeLogo')">
<upload-image v-model="formData.store_logo" /> <upload-image v-model="formData.store_logo" />
</el-form-item> </el-form-item>
<el-form-item :label="t('storeMobile')" prop="store_mobile"> <el-form-item :label="t('storeMobile')" prop="store_mobile">
<el-input v-model.trim="formData.store_mobile" clearable :placeholder="t('storeMobilePlaceholder')" <el-input v-model.trim="formData.store_mobile" clearable :placeholder="t('storeMobilePlaceholder')"
class="input-width" @keyup="filterNumber($event)" class="input-width" @keyup="filterNumber($event)"
@blur="formData.store_mobile = $event.target.value" /> @blur="formData.store_mobile = $event.target.value" />
</el-form-item> </el-form-item>
<el-form-item :label="t('tradeTime')" prop="trade_time"> <el-form-item :label="t('tradeTime')" prop="trade_time">
<div> <div>
<el-input v-model.trim="formData.trade_time" clearable :placeholder="t('tradeTimePlaceholder')" <el-input v-model.trim="formData.trade_time" clearable :placeholder="t('tradeTimePlaceholder')"
class="input-width" /> class="input-width" />
<p class="text-[12px] text-[#999]">{{ t('tradeTimeTips') }}</p> <p class="text-[12px] text-[#999]">{{ t('tradeTimeTips') }}</p>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item :label="t('storeAddress')" prop="address_area"> <el-form-item :label="t('storeAddress')" prop="address_area">
<el-select v-model="formData.province_id" value-key="id" clearable class="w-[200px]" ref="provinceRef"> <el-select v-model="formData.province_id" value-key="id" clearable class="w-[200px]" ref="provinceRef">
<el-option :label="t('provincePlaceholder')" :value="0"/> <el-option :label="t('provincePlaceholder')" :value="0"/>
<el-option v-for="(item, index) in areaList.province" :key="index" :label="item.name" :value="item.id"/> <el-option v-for="(item, index) in areaList.province" :key="index" :label="item.name" :value="item.id"/>
</el-select> </el-select>
<el-select v-model="formData.city_id" value-key="id" clearable class="w-[200px] ml-3" ref="cityRef"> <el-select v-model="formData.city_id" value-key="id" clearable class="w-[200px] ml-3" ref="cityRef">
<el-option :label="t('cityPlaceholder')" :value="0"/> <el-option :label="t('cityPlaceholder')" :value="0"/>
<el-option v-for="(item, index) in areaList.city " :key="index" :label="item.name" :value="item.id"/> <el-option v-for="(item, index) in areaList.city " :key="index" :label="item.name" :value="item.id"/>
</el-select> </el-select>
<el-select v-model="formData.district_id" value-key="id" clearable class="w-[200px] ml-3" ref="districtRef"> <el-select v-model="formData.district_id" value-key="id" clearable class="w-[200px] ml-3" ref="districtRef">
<el-option :label="t('districtPlaceholder')" :value="0"/> <el-option :label="t('districtPlaceholder')" :value="0"/>
<el-option v-for="(item, index) in areaList.district " :key="index" :label="item.name" :value="item.id"/> <el-option v-for="(item, index) in areaList.district " :key="index" :label="item.name" :value="item.id"/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item prop="address"> <el-form-item prop="address">
<el-input v-model.trim="formData.address" clearable :placeholder="t('addressPlaceholder')" class="input-width"/> <el-input v-model.trim="formData.address" clearable :placeholder="t('addressPlaceholder')" @input="areaChange()" class="input-width"/>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<div id="container" class="w-[800px] h-[520px] relative" v-loading="mapLoading"></div> <div id="container" class="w-[800px] h-[520px] relative" v-loading="mapLoading"></div>
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
<div class="fixed-footer-wrap"> <div class="fixed-footer-wrap">
<div class="fixed-footer !z-[9999]"> <div class="fixed-footer !z-[9999]">
<el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button> <el-button type="primary" @click="onSave(formRef)">{{ t('save') }}</el-button>
<el-button @click="back()">{{ t('cancel') }}</el-button> <el-button @click="back()">{{ t('cancel') }}</el-button>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
@ -112,7 +112,7 @@ onMounted(() => {
}) })
/** /**
* 初始化地图 * 初始化地图
*/ */
let map: any let map: any
let marker: any let marker: any
@ -172,8 +172,8 @@ const latLngChange = (lat: number, lng: number) => {
} }
/** /**
* 表单数据 * 表单数据
*/ */
const initialFormData = { const initialFormData = {
store_id: 0, store_id: 0,
store_name: '', store_name: '',
@ -276,7 +276,7 @@ watch(() => formData.province_id, (nval) => {
}) })
/** /**
* 获取区 * 获取区
*/ */
watch(() => formData.city_id, (nval) => { watch(() => formData.city_id, (nval) => {
if (nval) { if (nval) {
@ -316,7 +316,8 @@ const areaChange = debounce(() => {
const address = [ const address = [
formData.province_id ? provinceRef.value.states.selectedLabel : '', formData.province_id ? provinceRef.value.states.selectedLabel : '',
formData.city_id ? cityRef.value.states.selectedLabel : '', formData.city_id ? cityRef.value.states.selectedLabel : '',
formData.district_id ? districtRef.value.states.selectedLabel : '' formData.district_id ? districtRef.value.states.selectedLabel : '',
formData.address
] ]
addressToLatLng({ mapKey, address: address.join('') }).then(({ message, result }) => { addressToLatLng({ mapKey, address: address.join('') }).then(({ message, result }) => {
@ -350,7 +351,7 @@ watch(() => storeArea.province_id, (nval) => {
}) })
/** /**
* 地图点选获取区 * 地图点选获取区
*/ */
watch(() => storeArea.city_id, (nval) => { watch(() => storeArea.city_id, (nval) => {
if (nval) { if (nval) {
@ -379,8 +380,8 @@ const onSave = async (formEl: FormInstance | undefined) => {
const data = formData const data = formData
formData.province_name = formData.province_id ? provinceRef.value.states.selectedLabel : '', formData.province_name = formData.province_id ? provinceRef.value.states.selectedLabel : '',
formData.city_name = formData.city_id ? cityRef.value.states.selectedLabel : '', formData.city_name = formData.city_id ? cityRef.value.states.selectedLabel : '',
formData.district_name = formData.district_id ? districtRef.value.states.selectedLabel : '' formData.district_name = formData.district_id ? districtRef.value.states.selectedLabel : ''
const address = [ const address = [
data.province_id ? provinceRef.value.states.selectedLabel : '', data.province_id ? provinceRef.value.states.selectedLabel : '',
data.city_id ? cityRef.value.states.selectedLabel : '', data.city_id ? cityRef.value.states.selectedLabel : '',

Binary file not shown.

View File

@ -47,12 +47,12 @@ public class ShopOrderDeliveryController {
} }
@GetMapping("/delivery/package") @GetMapping("/delivery/package")
public Result<ShopOrderDeliveryInfoVo> getOrderPackage(Integer id, String mobile) { public Result<ShopOrderDeliveryInfoVo> getOrderPackage(@RequestParam(name = "id") Integer id, @RequestParam(name = "mobile") String mobile) {
return Result.success(shopOrderDeliveryService.getDeliveryPackage(id, mobile)); return Result.success(shopOrderDeliveryService.getDeliveryPackage(id, mobile));
} }
@GetMapping("'delivery/package/list") @GetMapping("'delivery/package/list")
public Result<List<ShopOrderDeliveryListVo>> getDeliveryPackageList(Integer orderId) { public Result<List<ShopOrderDeliveryListVo>> getDeliveryPackageList(@RequestParam(name = "order_id") Integer orderId) {
return Result.success(shopOrderDeliveryService.getDeliveryPackageList(orderId)); return Result.success(shopOrderDeliveryService.getDeliveryPackageList(orderId));
} }

View File

@ -800,13 +800,6 @@ public class ShopGoodsServiceImpl implements IShopGoodsService {
Integer page = pageParam.getPage(); Integer page = pageParam.getPage();
Integer limit = pageParam.getLimit(); Integer limit = pageParam.getLimit();
// 查询已选的
if (ObjectUtil.isNotEmpty(searchParam.getSkuIds())) {
List<Integer> goodsIds = shopGoodsSkuMapper.selectList(new QueryWrapper<ShopGoodsSku>().in("sku_id", searchParam.getSkuIds()).groupBy("goods_id").select("sku_id"))
.stream().map(i -> i.getSkuId()).collect(Collectors.toList());
if (goodsIds.size() > 0 && ObjectUtil.isEmpty(searchParam.getGoodsIds())) searchParam.setGoodsIds(goodsIds);
}
MPJQueryWrapper<ShopGoods> queryWrapper = new MPJQueryWrapper<>(); MPJQueryWrapper<ShopGoods> queryWrapper = new MPJQueryWrapper<>();
queryWrapper.setAlias("g") queryWrapper.setAlias("g")
.innerJoin("?_shop_goods_sku gs ON g.goods_id = gs.goods_id AND gs.is_default = 1".replace("?_", GlobalConfig.tablePrefix)); .innerJoin("?_shop_goods_sku gs ON g.goods_id = gs.goods_id AND gs.is_default = 1".replace("?_", GlobalConfig.tablePrefix));

View File

@ -198,6 +198,9 @@ public class ShopCartServiceImpl implements IShopCartService {
res.setPromotionMoney(data.getPromotionMoney()); res.setPromotionMoney(data.getPromotionMoney());
res.setGoodsMoney(data.getGoodsMoney()); res.setGoodsMoney(data.getGoodsMoney());
res.setOrderMoney(data.getGoodsMoney().subtract(data.getPromotionMoney())); res.setOrderMoney(data.getGoodsMoney().subtract(data.getPromotionMoney()));
if (res.getOrderMoney().compareTo(BigDecimal.ZERO) < 0) {
res.setOrderMoney(BigDecimal.ZERO);
}
List<ShopCartCalculateVo.Goods> goodsList = data.getGoodsList(); List<ShopCartCalculateVo.Goods> goodsList = data.getGoodsList();
List<ShopCartCalculateResVo.Goods> matchList = new ArrayList<>(); List<ShopCartCalculateResVo.Goods> matchList = new ArrayList<>();
for (ShopCartCalculateVo.Goods goods : goodsList) { for (ShopCartCalculateVo.Goods goods : goodsList) {

View File

@ -352,7 +352,7 @@ public class GoodsServiceImpl implements IGoodsService {
JSONObject memberPriceConfig = ObjectUtil.isNotEmpty(item.getMemberPrice()) ? JSONUtil.parseObj(item.getMemberPrice()) : new JSONObject(); JSONObject memberPriceConfig = ObjectUtil.isNotEmpty(item.getMemberPrice()) ? JSONUtil.parseObj(item.getMemberPrice()) : new JSONObject();
skuVo.setMemberPrice(calculateMemberPrice(memberLevel, goods.getMemberDiscount(), memberPriceConfig, item.getPrice())); skuVo.setMemberPrice(calculateMemberPrice(memberLevel, goods.getMemberDiscount(), memberPriceConfig, item.getPrice()));
} else { } else {
skuVo.setMemberPrice(sku.getPrice()); skuVo.setMemberPrice(item.getPrice());
} }
skuListVo.add(skuVo); skuListVo.add(skuVo);
} }

View File

@ -280,11 +280,11 @@ public class CoreManjianServiceImpl extends ServiceImpl<ShopManjianMapper, ShopM
} }
if (rule.getBool("is_give_point")) { if (rule.getBool("is_give_point")) {
rule.put("point", rule.getBigDecimal("point", BigDecimal.ZERO).multiply(new BigDecimal(cycleNum))); rule.put("point", rule.getBigDecimal("point", BigDecimal.ZERO).multiply(new BigDecimal(cycleNum)));
gift.put("point", rule.getBigDecimal("point", BigDecimal.ZERO).multiply(new BigDecimal(cycleNum))); gift.put("point", rule.getBigDecimal("point"));
} }
if (rule.getBool("is_give_balance")) { if (rule.getBool("is_give_balance")) {
rule.put("balance", rule.getBigDecimal("balance", BigDecimal.ZERO).multiply(new BigDecimal(cycleNum))); rule.put("balance", rule.getBigDecimal("balance", BigDecimal.ZERO).multiply(new BigDecimal(cycleNum)));
gift.put("balance", rule.getBigDecimal("balance", BigDecimal.ZERO).multiply(new BigDecimal(cycleNum))); gift.put("balance", rule.getBigDecimal("balance"));
} }
if (rule.getBool("is_give_coupon")) { if (rule.getBool("is_give_coupon")) {
JSONArray giftCoupon = rule.getJSONArray("coupon"); JSONArray giftCoupon = rule.getJSONArray("coupon");
@ -300,9 +300,7 @@ public class CoreManjianServiceImpl extends ServiceImpl<ShopManjianMapper, ShopM
} else { } else {
coupon.put("coupon_name", "" + couponManjian.getMinConditionMoney() + "元减" + couponManjian.getPrice() + "元券"); coupon.put("coupon_name", "" + couponManjian.getMinConditionMoney() + "元减" + couponManjian.getPrice() + "元券");
} }
if (couponManjian.getRemainCount() > 0 && couponManjian.getLimitCount() > couponManjian.getReceiveCount()) { updatedGiftCoupon.add(coupon);
updatedGiftCoupon.add(coupon);
}
} }
} }
rule.put("coupon", updatedGiftCoupon); rule.put("coupon", updatedGiftCoupon);

View File

@ -243,7 +243,7 @@ public class CoreOrderBatchDeliveryServiceImpl implements ICoreOrderBatchDeliver
Integer itemExpressCompanyId = 0; Integer itemExpressCompanyId = 0;
OrderDeliveryTypeEnum deliveryType = OrderDeliveryTypeEnum.NONE_EXPRESS; OrderDeliveryTypeEnum deliveryType = OrderDeliveryTypeEnum.NONE_EXPRESS;
if (row.getCompanyName().equals("无需物流")) { if (!row.getCompanyName().equals("无需物流")) {
deliveryType = OrderDeliveryTypeEnum.EXPRESS; deliveryType = OrderDeliveryTypeEnum.EXPRESS;
if (!companyMap.containsKey(row.getCompanyName())) { if (!companyMap.containsKey(row.getCompanyName())) {
throw new RuntimeException("物流公司不存在"); throw new RuntimeException("物流公司不存在");

File diff suppressed because it is too large Load Diff

View File

@ -65,7 +65,7 @@
</view> </view>
</template> </template>
</view> </view>
<view v-if="item.manjian_info && Object.keys(item.manjian_info).length && item.manjian_info.is_show" class="flex items-center mt-[8rpx] mb-[auto]" @click.stop="manjianOpenFn(item.manjian_info)"> <view v-if="item.manjian_info && Object.keys(item.manjian_info).length && item.manjian_info.is_join" class="flex items-center mt-[8rpx] mb-[auto]" @click.stop="manjianOpenFn(item.manjian_info)">
<view class="bg-[var(--primary-color-light)] text-[var(--primary-color)] rounded-[6rpx] text-[20rpx] flex items-center justify-center w-[88rpx] h-[36rpx] mr-[6rpx]">满减送</view> <view class="bg-[var(--primary-color-light)] text-[var(--primary-color)] rounded-[6rpx] text-[20rpx] flex items-center justify-center w-[88rpx] h-[36rpx] mr-[6rpx]">满减送</view>
<text class="text-[22rpx] text-[#999]">{{item.manjian_info.manjian_name}}</text> <text class="text-[22rpx] text-[#999]">{{item.manjian_info.manjian_name}}</text>
</view> </view>