Merge remote-tracking branch 'origin/StableVersion' into dev_vite

This commit is contained in:
X1627315083
2025-09-24 11:04:38 +08:00
3 changed files with 358 additions and 325 deletions

View File

@@ -1,319 +1,331 @@
<template>
<div class="allUserPoerationModal" ref="allUserPoerationModal"></div>
<a-modal
class="allUserPoeration_modal generalModel"
v-model:visible="operationsModal"
:footer="null"
:get-container="() => $refs.allUserPoerationModal"
width="50%"
:height="'77rem'"
:maskClosable="false"
:centered="true"
:closable="false"
:mask="true"
wrapClassName="#app"
:keyboard="false"
>
<div class="generalModel_btn">
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
<svg
width="100%" height="100%"
viewBox="0 0 46 46"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="23" cy="23" r="23" fill="black" fill-opacity="0.3" />
<rect
x="32.5063"
y="12"
width="3"
height="29"
rx="1.5"
transform="rotate(45 32.5063 12)"
fill="white"
/>
<rect
x="34.6274"
y="32.5059"
width="3"
height="29"
rx="1.5"
transform="rotate(135 34.6274 32.5059)"
fill="white"
/>
</svg>
</div>
</div>
<div class="modal_title_text">
<div>{{ title }} Coupon</div>
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>Cooperator:</span>
<input
v-model="cooperator"
placeholder="Please enter cooperator"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>percentOff(%): <span>*</span></span>
<input
:class="{ active: title != 'Add' }"
:disabled="title != 'Add'"
v-model="percentOff"
placeholder="Please enter percentOff"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>Commission Rate: <span>*</span></span>
<input
:class="{ active: title != 'Add' }"
:disabled="title != 'Add'"
v-model="commissionRate"
placeholder="Please enter commission rate"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<!-- <div class="admin_state_item" > -->
<span>Start Time: <span>*</span></span>
<a-space direction="vertical" style="width: 220px">
<a-date-picker
v-model:value="startTime"
:disabled="title != 'Add'"
style="width: 220px"
/>
</a-space>
</div>
<div class="admin_state_item">
<!-- <div class="admin_state_item" > -->
<span>End Time: <span>*</span></span>
<a-space direction="vertical" style="width: 220px">
<a-date-picker
v-model:value="endTime"
:disabled="title != 'Add'"
style="width: 220px"
/>
</a-space>
</div>
<div class="admin_state_item">
<span>MaxRedemptions:</span>
<input
:class="{ active: title != 'Add' }"
:disabled="title != 'Add'"
v-model="maxRedemptions"
placeholder="Please enter maximum"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>PaidCommission:</span>
<input
v-model="paidCommission"
placeholder="Please enter paidCommission"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>Remark:</span>
<input
v-model="remark"
placeholder="Please enter remark"
type="text"
style="width: 220px"
/>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">Close</div>
<div class="admin_search_item" @click="setOk">OK</div>
</div>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</template>
<script>
import {
defineComponent,
ref,
reactive,
watch,
onMounted,
nextTick,
toRefs,
} from "vue";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { formatTime, isEmail } from "@/tool/util";
import dayjs, { Dayjs } from "dayjs";
import md5 from "md5";
export default defineComponent({
components: {},
emits: ["searchHistoryList"],
setup(props, { emit }) {
let operations = reactive({
operationsModal: false,
operationsEdit: false,
loadingShow: false,
title: "",
});
let operationsData = reactive({
endTime: "",
startTime: "",
percentOff: "",
commissionRate: "",
maxRedemptions: "",
cooperator: "",
paidCommission: "",
remark: "",
id: "",
});
let init = (funStr, data) => {
operations.operationsModal = true;
operations.operationsEdit = true;
operations.title = funStr;
if (funStr == "Add") operations.operationsEdit = false;
if (funStr == "Edit") {
operationsData.id = data.id;
operationsData.percentOff = data.percentOff;
operationsData.commissionRate = data.commissionRate;
operationsData.maxRedemptions = data.maxRedemptions;
operationsData.cooperator = data.cooperator;
operationsData.paidCommission = data.paidCommission;
operationsData.remark = data.remark;
operationsData.endTime = dayjs(
new Date(data.redeemBy * 1000).toISOString().split("T")[0],
"YYYY/MM/DD"
);
operationsData.startTime = dayjs(
new Date(data.startTime * 1000).toISOString().split("T")[0],
"YYYY/MM/DD"
);
console.log(data)
// operationsData.endTime='2024-08-05T00:00:06'
// operationsData.validEndTime='2024-08-05T00:00:06'
// operationsData.commissionRate = data.commissionRate
// operationsData.maxRedemptions = data.maxRedemptions
// operationsData.validStartTime = formatTime(data.validStartTime)
// operationsData.validEndTime = formatTime(data.validEndTime)
}
};
let setAddData = () => {
const emdTimeMs =
new Date(operationsData.endTime).getTime() / 1000; // 直接获取毫秒时间戳
const startTimeMs =
new Date(operationsData.startTime).getTime() / 1000; // 直接获取毫秒时间戳
return {
percentOff: operationsData.percentOff,
maxRedemptions: operationsData.maxRedemptions,
commissionRate: operationsData.commissionRate,
endTime: emdTimeMs,
startTime: startTimeMs,
cooperator: operationsData.cooperator,
remark: operationsData.remark,
};
};
let setEditData = () => {
const timestampMs =
new Date(operationsData.endTime).getTime() / 1000; // 直接获取毫秒时间戳
return {
id: operationsData.id,
paidCommission: operationsData.commissionRate,
cooperator: operationsData.cooperator,
remark: operationsData.remark,
};
};
let cancelDsign = () => {
operationsData.endTime = "";
operationsData.startTime = "";
operationsData.percentOff = "";
operationsData.commissionRate = "";
operationsData.maxRedemptions = "";
operationsData.cooperator = "";
operationsData.paidCommission = "";
operationsData.remark = "";
operationsData.id = "";
operations.operationsModal = false;
};
let setOk = () => {
let data;
if (operations.title == "Add") {
data = setAddData();
if (!data.commissionRate || !data.startTime || !data.percentOff || !data.endTime)
return message.warning("Please check the input box marked with *");
Https.axiosPost(Https.httpUrls.createCoupon, data).then((rv) => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
}
});
} else {
data = setEditData();
Https.axiosGet(Https.httpUrls.updatePromCodeInfo, {
params: data,
}).then((rv) => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
}
});
}
};
return {
...toRefs(operations),
...toRefs(operationsData),
cancelDsign,
init,
focus,
blur,
setOk,
};
},
data() {
return {};
},
mounted() {},
methods: {},
});
</script>
<style lang="less" scoped>
:deep(.allUserPoeration_modal) {
.ant-modal-body {
display: flex;
flex-direction: column;
<div class="allUserPoerationModal" ref="allUserPoerationModal"></div>
<a-modal
class="allUserPoeration_modal generalModel"
v-model:visible="operationsModal"
:footer="null"
:get-container="() => $refs.allUserPoerationModal"
width="50%"
:height="'77rem'"
:maskClosable="false"
:centered="true"
:closable="false"
:mask="true"
wrapClassName="#app"
:keyboard="false"
>
<div class="generalModel_btn">
<div class="generalModel_closeIcon" @click.stop="cancelDsign()">
<svg
width="100%" height="100%"
viewBox="0 0 46 46"
fill="none"
xmlns="http://www.w3.org/2000/svg"
>
<circle cx="23" cy="23" r="23" fill="black" fill-opacity="0.3" />
<rect
x="32.5063"
y="12"
width="3"
height="29"
rx="1.5"
transform="rotate(45 32.5063 12)"
fill="white"
/>
<rect
x="34.6274"
y="32.5059"
width="3"
height="29"
rx="1.5"
transform="rotate(135 34.6274 32.5059)"
fill="white"
/>
</svg>
</div>
</div>
<div class="modal_title_text">
<div>{{ title }} Coupon</div>
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>Cooperator:</span>
<input
v-model="cooperator"
placeholder="Please enter cooperator"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>percentOff(%): <span>*</span></span>
<input
:class="{ active: title != 'Add' }"
:disabled="title != 'Add'"
v-model="percentOff"
placeholder="Please enter percentOff"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>Commission Rate: <span>*</span></span>
<input
:class="{ active: title != 'Add' }"
:disabled="title != 'Add'"
v-model="commissionRate"
placeholder="Please enter commission rate"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<!-- <div class="admin_state_item" > -->
<span>Start Time: <span>*</span></span>
<a-space direction="vertical" style="width: 220px">
<a-date-picker
v-model:value="startTime"
:disabled="title != 'Add'"
style="width: 220px"
/>
</a-space>
</div>
<div class="admin_state_item">
<!-- <div class="admin_state_item" > -->
<span>End Time: <span>*</span></span>
<a-space direction="vertical" style="width: 220px">
<a-date-picker
v-model:value="endTime"
:disabled="title != 'Add'"
style="width: 220px"
/>
</a-space>
</div>
<div class="admin_state_item">
<span>MaxRedemptions:</span>
<input
:class="{ active: title != 'Add' }"
:disabled="title != 'Add'"
v-model="maxRedemptions"
placeholder="Please enter maximum"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>PaidCommission:</span>
<input
v-model="paidCommission"
placeholder="Please enter paidCommission"
type="text"
style="width: 220px"
/>
</div>
<div class="admin_state_item">
<span>Remark:</span>
<input
v-model="remark"
placeholder="Please enter remark"
type="text"
style="width: 220px"
/>
</div>
</div>
<div class="allUserPoeration_btn admin_page">
<div class="admin_search_item" @click="cancelDsign">Close</div>
<div class="admin_search_item" @click="setOk">OK</div>
</div>
</a-modal>
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</template>
<script>
import {
defineComponent,
ref,
reactive,
watch,
onMounted,
nextTick,
toRefs,
} from "vue";
import { Https } from "@/tool/https";
import { Modal, message } from "ant-design-vue";
import { ExclamationCircleOutlined } from "@ant-design/icons-vue";
import { formatTime, isEmail } from "@/tool/util";
import dayjs, { Dayjs } from "dayjs";
import md5 from "md5";
export default defineComponent({
components: {},
emits: ["searchHistoryList"],
setup(props, { emit }) {
let operations = reactive({
operationsModal: false,
operationsEdit: false,
loadingShow: false,
title: "",
});
let operationsData = reactive({
endTime: "",
startTime: "",
percentOff: "",
commissionRate: "",
maxRedemptions: "",
cooperator: "",
paidCommission: "",
remark: "",
id: "",
});
let init = (funStr, data) => {
operations.operationsModal = true;
operations.operationsEdit = true;
operations.title = funStr;
if (funStr == "Add") operations.operationsEdit = false;
if (funStr == "Edit") {
operationsData.id = data.id;
operationsData.percentOff = data.percentOff;
operationsData.commissionRate = data.commissionRate;
operationsData.maxRedemptions = data.maxRedemptions;
operationsData.cooperator = data.cooperator;
operationsData.paidCommission = data.paidCommission;
operationsData.remark = data.remark;
operationsData.endTime = dayjs(
new Date(data.redeemBy * 1000).toLocaleDateString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).replace(/\//g, '/'),
"YYYY/MM/DD"
);
// 确保格式一致
// operationsData.startTime = dayjs(
// new Date(data.startTime * 1000).toISOString().split("T")[0],
// "YYYY/MM/DD"
// );
operationsData.startTime = dayjs(
new Date(data.startTime * 1000).toLocaleDateString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
}).replace(/\//g, '/'),
"YYYY/MM/DD"
);
// operationsData.endTime='2024-08-05T00:00:06'
// operationsData.validEndTime='2024-08-05T00:00:06'
// operationsData.commissionRate = data.commissionRate
// operationsData.maxRedemptions = data.maxRedemptions
// operationsData.validStartTime = formatTime(data.validStartTime)
// operationsData.validEndTime = formatTime(data.validEndTime)
}
};
let setAddData = () => {
const emdTimeMs =
new Date(operationsData.endTime).getTime() / 1000; // 直接获取毫秒时间戳
const startTimeMs =
new Date(operationsData.startTime).getTime() / 1000; // 直接获取毫秒时间戳
return {
percentOff: operationsData.percentOff,
maxRedemptions: operationsData.maxRedemptions,
commissionRate: operationsData.commissionRate,
endTime: emdTimeMs,
startTime: startTimeMs,
cooperator: operationsData.cooperator,
remark: operationsData.remark,
};
};
let setEditData = () => {
const timestampMs =
new Date(operationsData.endTime).getTime() / 1000; // 直接获取毫秒时间戳
return {
id: operationsData.id,
paidCommission: operationsData.commissionRate,
cooperator: operationsData.cooperator,
remark: operationsData.remark,
};
};
let cancelDsign = () => {
operationsData.endTime = "";
operationsData.startTime = "";
operationsData.percentOff = "";
operationsData.commissionRate = "";
operationsData.maxRedemptions = "";
operationsData.cooperator = "";
operationsData.paidCommission = "";
operationsData.remark = "";
operationsData.id = "";
operations.operationsModal = false;
};
let setOk = () => {
let data;
if (operations.title == "Add") {
data = setAddData();
if (!data.commissionRate || !data.startTime || !data.percentOff || !data.endTime)
return message.warning("Please check the input box marked with *");
Https.axiosPost(Https.httpUrls.createCoupon, data).then((rv) => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
}
});
} else {
data = setEditData();
Https.axiosGet(Https.httpUrls.updatePromCodeInfo, {
params: data,
}).then((rv) => {
if (rv) {
cancelDsign();
emit("searchHistoryList");
}
});
}
};
return {
...toRefs(operations),
...toRefs(operationsData),
cancelDsign,
init,
focus,
blur,
setOk,
};
},
data() {
return {};
},
mounted() {},
methods: {},
});
</script>
<style lang="less" scoped>
:deep(.allUserPoeration_modal) {
.ant-modal-body {
display: flex;
flex-direction: column;
}
}
}
</style>
<style lang="less" scoped>
.allUserPoeration_modal {
.closeIcon {
z-index: 2;
</style>
<style lang="less" scoped>
.allUserPoeration_modal {
.closeIcon {
z-index: 2;
}
.allUserPoeration_btn {
display: flex;
flex-direction: row;
height: auto;
justify-content: flex-end;
padding: 1rem 0;
.admin_search_item {
margin-bottom: 0;
}
}
.allUserPoeration_center {
flex: 1;
overflow-y: auto;
flex-direction: row;
flex-wrap: wrap;
}
}
.allUserPoeration_btn {
display: flex;
flex-direction: row;
height: auto;
justify-content: flex-end;
padding: 1rem 0;
.admin_search_item {
margin-bottom: 0;
}
}
.allUserPoeration_center {
flex: 1;
overflow-y: auto;
flex-direction: row;
flex-wrap: wrap;
}
}
</style>
</style>

View File

@@ -300,7 +300,11 @@ export default defineComponent({
// ]
let isCurrent = list[i].id == detailData?.selectDetail?.id
console.log(isCurrent,newData)
let color = (detailData.currentDetailType == 'color' && isCurrent)?(newData?.rgba?.r?`${newData.rgba.r} ${newData.rgba.g} ${newData.rgba.b}`:''):(list[i].color?.rgba?.r?`${list[i].color.rgba.r} ${list[i].color.rgba.g} ${list[i].color.rgba.b}`:'')
let color = (detailData.currentDetailType == 'color' && isCurrent && !detailData.isEditPattern.value)?
(newData?.rgba?.r?`${newData.rgba.r} ${newData.rgba.g} ${newData.rgba.b}`:''):
(list[i].color?.rgba?.r?
`${list[i].color.rgba.r} ${list[i].color.rgba.g} ${list[i].color.rgba.b}`:
'')
if(detailData.currentDetailType == 'sketch' && newData){
color = detailData.designDetail.clothes[0].color?.rgba?.r?`${detailData.designDetail.clothes[0].color.rgba.r} ${detailData.designDetail.clothes[0].color.rgba.g} ${detailData.designDetail.clothes[0].color.rgba.b}`:''
detailData.selectDetail.maskUrl = ''
@@ -309,8 +313,8 @@ export default defineComponent({
let data:any = {
changed:false,
color,
designType:(newData && detailData.currentDetailType == 'sketch' && isCurrent)?newData.designType:list[i].designType,
id:(newData && detailData.currentDetailType == 'sketch' && isCurrent)?newData.id:list[i].id,
designType:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.designType:list[i].designType,
id:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.id:list[i].id,
maskMinioUrl:(newData && detailData.currentDetailType == 'sketch')?'':list[i]?.maskMinioUrl,
// maskUrl:'',
maskUrl:(newData && detailData.currentDetailType == 'sketch')?'':list[i]?.maskUrl,
@@ -321,19 +325,19 @@ export default defineComponent({
offset,
partialDesign:list[i].partialDesign || {},
// partialDesign:detailData.isEditPattern.value?list[i].partialDesign:{},
path:(newData && detailData.currentDetailType == 'sketch' && isCurrent)?newData.minIOPath:list[i].minIOPath,
printObject:(newData && detailData.currentDetailType == 'print' && isCurrent)?{prints:newData}:list[i].printObject?list[i].printObject:{prints:[]},
path:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.minIOPath:list[i].minIOPath,
printObject:(newData && detailData.currentDetailType == 'print' && isCurrent && !detailData.isEditPattern.value)?{prints:newData}:list[i].printObject?list[i].printObject:{prints:[]},
priority,
// scale:[
// 0.5,
// 0.35822305
// ],
scale:[scale[0]?scale[0]:1,scale[1]?scale[1]:1],
type:(newData && detailData.currentDetailType == 'sketch' && isCurrent)?newData.level2Type || newData.categoryValue:list[i].type,
type:(newData && detailData.currentDetailType == 'sketch' && isCurrent && !detailData.isEditPattern.value)?newData.level2Type || newData.categoryValue:list[i].type,
sketchString:list[i].sketchString?list[i].sketchString:'',
trims:(newData && detailData.currentDetailType == 'element' && isCurrent)?{prints:newData}:list[i].trims?.prints?list[i].trims:{prints:[]},
trims:(newData && detailData.currentDetailType == 'element' && isCurrent && !detailData.isEditPattern.value)?{prints:newData}:list[i].trims?.prints?list[i].trims:{prints:[]},
}
if((list[i].color?.gradient || list[i].newDetail?.color?.gradient)){
if((list[i].color?.gradient || list[i].newDetail?.color?.gradient) && !detailData.isEditPattern.value){
gradient = list[i].newDetail?.color?.gradient || list[i].color.gradient
gradient.colorImg = await setGradual(gradient,320,700)
data.gradient = gradient
@@ -389,7 +393,7 @@ export default defineComponent({
designSingleItemDTOList:clothes,
isPreview:false,
// ifSubmit:designItemDetail.isPreview,
gender:workspace?.sex == 'Male'?1:0,
gender:workspace?.sex,
sketchString:'',
modelId:(detailData.currentDetailType == 'models' && detailData.designDetail.newModel)?detailData.designDetail.newModel.id:detailData.designDetail.oldModel?detailData.designDetail.oldModel.id:'',
modelType:(detailData.currentDetailType == 'models' && detailData.designDetail.newModel)?detailData.designDetail.newModel.type:detailData.designDetail.oldModel?detailData.designDetail.oldModel.type:'',

View File

@@ -306,6 +306,23 @@ export default defineComponent({
data.isGenerate = false
clearInterval(data.remGenerateTime)
data.remGenerate = false
if(res.errCode === 2){
Modal.confirm({
title: res.errMsg,
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
zIndex:99999,
centered:true,
onOk() {
store.commit("setUpgradePlan", true);
},
onCancel(){
}
});
}
})
}
const setGenerate = (dataList:any)=>{