This commit is contained in:
雷欧(林平凡)
2025-08-21 16:01:40 +08:00
parent fd53ce5c98
commit 03f69d8361
2 changed files with 143 additions and 3 deletions

View File

@@ -84,4 +84,22 @@ export function getProperties(params) {
method: 'get',
params
})
}
// 开礼金
export function createGiftCoupon(data) {
return request({
url: '/jarvis/jdorder/createGiftCoupon',
method: 'post',
data
})
}
// 转链(支持礼金)
export function transferWithGift(data) {
return request({
url: '/jarvis/jdorder/transfer',
method: 'post',
data
})
}

View File

@@ -198,6 +198,7 @@
<div slot="footer" class="dialog-footer">
<el-button @click="childDetailVisible = false"> </el-button>
<el-button type="primary" @click="openQuickLink(currentChild)" v-if="currentChild.jsonQueryResult">一键转链</el-button>
<el-button type="warning" @click="openGiftDialog(currentChild)" v-if="currentChild.jsonQueryResult">开礼金</el-button>
<el-button type="success" @click="addToFavorites(currentChild)" v-if="currentChild.jsonQueryResult">添加到常用</el-button>
<el-button type="warning" @click="quickLinkAndAddToFavorites(currentChild)" v-if="currentChild.jsonQueryResult">转链并入常用</el-button>
</div>
@@ -317,6 +318,21 @@
<!-- 公共发品对话框组件复用 -->
<PublishDialog :visible.sync="publishDialogVisible" :initial-data="publishInitialData" @success="onPublishDialogSuccess" />
<!-- 礼金设置弹窗 -->
<el-dialog title="开礼金" :visible.sync="giftDialogVisible" width="420px" append-to-body>
<el-form :model="giftForm" label-width="100px" ref="giftForm">
<el-form-item label="金额(元)">
<el-input v-model.number="giftForm.amount" type="number" min="1" max="50" step="0.01" placeholder="1-50" />
</el-form-item>
<el-form-item label="数量">
<el-input v-model.number="giftForm.quantity" type="number" min="1" max="100" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="giftDialogVisible = false"> </el-button>
<el-button type="primary" :loading="giftLoading" @click="submitGift"> </el-button>
</div>
</el-dialog>
</div>
</template>
@@ -324,7 +340,7 @@
import { listXbmessage, delXbmessage, getGroupNameOptions } from "@/api/system/xbmessage";
import { parseTime } from "@/utils/ruoyi";
import PublishDialog from '@/components/PublishDialog.vue'
import { generatePromotionContent, createProductByPromotion, getProvinces, getCities, getAreas, getCategories, getUsernames, getERPAccounts, getProperties } from "@/api/system/jdorder";
import { generatePromotionContent, createProductByPromotion, getProvinces, getCities, getAreas, getCategories, getUsernames, getERPAccounts, getProperties, createGiftCoupon, transferWithGift } from "@/api/system/jdorder";
import { addToFavorites, getBySkuid } from "@/api/system/favoriteProduct";
export default {
@@ -372,6 +388,10 @@ export default {
activeQuickLinkTab: 0,
activeQuickLinkWenanTab: {},
quickLinkLoading: false,
giftDialogVisible: false,
giftForm: { amount: null, quantity: 10 },
giftLoading: false,
giftContext: { materialUrl: '', owner: 'g', skuName: '' },
// 发品相关
quickLinkPublishDialog: {
visible: false,
@@ -490,7 +510,7 @@ export default {
methods: {
openPublishFromXb(child) {
const parsedQuery = this.safeJsonParse(child.jsonQueryResult);
const images = (parsedQuery && parsedQuery.images && Array.isArray(parsedQuery.images)) ? parsedQuery.images : [];
const images = this.extractImageUrlsFromQuery(parsedQuery, child);
// 记录当前线报项,便于发品成功后加入常用
this.currentXbMessageItem = child;
@@ -531,15 +551,18 @@ export default {
} catch (e) { arr = []; }
let wenanOptions = [];
let detailImages = [];
if (Array.isArray(arr) && arr.length > 0) {
const first = arr[0] || {};
const wenanArr = Array.isArray(first.wenan) ? first.wenan : [];
wenanOptions = wenanArr.map((w, i) => ({ label: w.type || `版本${i+1}`, content: w.content || '' }));
detailImages = this.extractImageUrlsFromGenerateResult(first);
}
this.publishInitialData = Object.assign({}, baseInitialData, {
content: (wenanOptions[0] && wenanOptions[0].content) || '',
wenanOptions
wenanOptions,
images: (detailImages && detailImages.length) ? detailImages : baseInitialData.images
});
}).catch(() => {
// 忽略错误,仍然打开弹窗(无文案)
@@ -549,6 +572,68 @@ export default {
this.publishDialogVisible = true;
});
},
// 兼容多种结构提取图片URL线报查询结果/行数据)
extractImageUrlsFromQuery(queryObj, rowFallback) {
try {
const urls = [];
const pushIfUrl = (v) => {
if (!v) return;
const s = String(v).trim();
if (/^https?:\/\//.test(s)) urls.push(s);
};
if (queryObj && Array.isArray(queryObj.images)) {
queryObj.images.forEach(it => {
if (typeof it === 'string') pushIfUrl(it);
else if (it && (it.url || it.imageUrl || it.imgUrl)) pushIfUrl(it.url || it.imageUrl || it.imgUrl);
});
}
if (queryObj && queryObj.imageInfo) {
const ii = queryObj.imageInfo;
pushIfUrl(ii.mainImage);
if (Array.isArray(ii.imageList)) {
ii.imageList.forEach(it => {
if (typeof it === 'string') pushIfUrl(it);
else if (it && (it.url || it.imageUrl || it.imgUrl)) pushIfUrl(it.url || it.imageUrl || it.imgUrl);
});
} else if (typeof ii.imageList === 'string') {
ii.imageList.split(/[\s,]+/).forEach(pushIfUrl);
}
}
// 兜底:从行数据尝试
if (urls.length === 0 && rowFallback) {
if (Array.isArray(rowFallback.images)) {
rowFallback.images.forEach(it => { if (typeof it === 'string') pushIfUrl(it); else if (it && it.url) pushIfUrl(it.url); });
}
pushIfUrl(rowFallback.productImage);
pushIfUrl(rowFallback.imageUrl);
pushIfUrl(rowFallback.image);
}
return Array.from(new Set(urls));
} catch (e) { return []; }
},
// 兼容 generatePromotionContent 返回结构提取图片
extractImageUrlsFromGenerateResult(obj) {
try {
const urls = [];
const pushIfUrl = (v) => {
if (!v) return;
const s = String(v).trim();
if (/^https?:\/\//.test(s)) urls.push(s);
};
if (Array.isArray(obj.images)) {
obj.images.forEach(it => {
if (typeof it === 'string') pushIfUrl(it);
else if (it && (it.url || it.imageUrl || it.imgUrl)) pushIfUrl(it.url || it.imageUrl || it.imgUrl);
});
}
if (obj.mainImage) pushIfUrl(obj.mainImage);
if (Array.isArray(obj.imageList)) obj.imageList.forEach(pushIfUrl);
if (Array.isArray(obj.pics)) obj.pics.forEach(pushIfUrl);
if (Array.isArray(obj.imgUrls)) obj.imgUrls.forEach(pushIfUrl);
return Array.from(new Set(urls));
} catch (e) { return []; }
},
/** 查询消息列表 */
getList() {
this.loading = true;
@@ -1218,6 +1303,43 @@ export default {
this.activeQuickLinkWenanTab = {};
this.quickLinkVisible = true;
},
openGiftDialog(child) {
const materialUrl = this.getJsonValue(child.jsonQueryResult, 'materialUrl') || this.getJsonValue(child.jsonQueryResult, 'url');
const owner = this.getJsonValue(child.jsonQueryResult, 'owner') || 'g';
const skuName = child.skuName || '';
if (!materialUrl) { this.$modal.msgError('无法获取商品链接'); return; }
this.giftContext = { materialUrl, owner, skuName };
this.giftForm = { amount: null, quantity: 10 };
this.giftDialogVisible = true;
},
async submitGift() {
if (!this.giftContext.materialUrl || !this.giftForm.amount || !this.giftForm.quantity) {
this.$modal.msgError('请完善礼金金额与数量'); return;
}
this.giftLoading = true;
try {
const cg = await createGiftCoupon({ materialUrl: this.giftContext.materialUrl, amount: this.giftForm.amount, quantity: this.giftForm.quantity, owner: this.giftContext.owner, skuName: this.giftContext.skuName });
if (!cg || cg.code !== 200) { this.$modal.msgError((cg && cg.msg) || '开礼金失败'); this.giftLoading = false; return; }
const giftKey = (cg.data && (cg.data.giftCouponKey || cg.data.giftKey)) || (typeof cg.data === 'string' ? cg.data : null);
const tf = await transferWithGift({ materialUrl: this.giftContext.materialUrl, giftCouponKey: giftKey });
let shortUrl = '';
if (tf && tf.code === 200) {
const d = tf.data; if (typeof d === 'string') shortUrl = d; else if (d && d.shortURL) shortUrl = d.shortURL;
}
if (shortUrl) {
if (this.publishInitialData && this.publishDialogVisible) {
this.publishInitialData = Object.assign({}, this.publishInitialData, { content: (this.publishInitialData.content ? (this.publishInitialData.content + '\n' + shortUrl) : shortUrl) });
}
this.$modal.msgSuccess('礼金短链已生成');
} else {
this.$modal.msgSuccess('礼金创建成功');
}
this.giftDialogVisible = false;
} catch (e) {
this.$modal.msgError('礼金处理失败');
}
this.giftLoading = false;
},
/** 生成转链内容 */
generateQuickLink() {