Files
yiqiu cbd6250967
All checks were successful
continuous-integration/drone/push Build is passing
修改插件
2025-11-21 00:01:45 +08:00

401 lines
12 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
(function (window, undefined) {
var old_onload = window.onload;
window.onload = function () {
window.lang = Object.assign(window.lang, window.plugin_lang);
typeof old_onload == "function" && old_onload();
const {showToast, showImagePreview} = vant;
const app = Vue.createApp({
components: {
topMenu,
},
data() {
return {
lang: window.lang,
commonData: {},
id: null,
isShowMore: false,
ticketData: {},
// 工单类别
ticketTypeList: [],
// 关联产品列表
hostList: [],
sdasaasd: {maxHeight: ".9867rem", minHeight: 0},
// 基本信息
baseMsg: {
title: "",
type: "",
hosts: "",
status: "",
create_time: "",
color: "#0AB39C",
},
replyData: {
id: null,
content: "",
attachment: [],
},
sendBtnLoading: false,
fileList: [],
visible: false,
delLoading: false,
isClose: false,
viewer: null,
preImg: "",
};
},
mounted() {},
updated() {},
destroyed() {},
created() {
// 获取通用信息
this.getCommonData();
// 获取工单详情
this.getDetails();
this.autoRefresh();
},
watch: {},
filters: {},
methods: {
autoRefresh() {
setInterval(() => {
this.getDetails();
}, 1000 * 60);
},
goBack() {
location.href = "ticket.htm";
},
handeSelecFile() {
this.$refs.uploadRef.chooseFile();
},
afterRead(file) {
const arr = [];
if (file instanceof Array) {
arr.push(...file);
} else {
arr.push(file);
}
this.uploadFiles(arr);
},
uploadFiles(arr) {
arr.forEach((item) => {
const formData = new FormData();
formData.set("file", item.file); // 这里要用set,如果用append还是会出现一起上传的情况
uploadFile(formData)
.then((res) => {
if (res.data.status === 200) {
this.fileList.push({
file: item.file,
save_name: res.data.data.save_name,
});
this.replyData.attachment.push(res.data.data.save_name);
}
})
.catch((err) => {
showToast(err.data.msg);
});
});
},
handeDelFile(file, index) {
this.replyData.attachment = this.replyData.attachment.filter(
(item) => {
return item != file.save_name;
}
);
this.fileList.splice(index, 1);
},
// 使 right-main 的滚动条平滑的滚动到底部
scrollToBottom() {
let rightMain = document.getElementsByClassName("ticket-content")[0];
rightMain.scrollTop = rightMain.scrollHeight;
},
// 获取通用配置
getCommonData() {
this.commonData = JSON.parse(
localStorage.getItem("common_set_before")
);
document.title =
this.commonData.website_name + "-" + lang.ticket_label17;
},
// 返回工单列表页面
backTicket() {
location.href = "ticket.htm";
},
hexToRgb(hex) {
const color = hex.split("#")[1];
const r = parseInt(color.substring(0, 2), 16);
const g = parseInt(color.substring(2, 4), 16);
const b = parseInt(color.substring(4, 6), 16);
return `rgba(${r},${g},${b},0.12)`;
},
// 获取url中的id参数然后获取工单详情信息
getDetails() {
let url = window.location.href;
let getqyinfo = url.split("?")[1];
let getqys = new URLSearchParams("?" + getqyinfo);
let id = getqys.get("id");
this.id = id;
const params = {
id,
};
// 调用查看工单接口
ticketDetail(params).then((res) => {
if (res.data.status === 200) {
this.ticketData = res.data.data.ticket;
const replies = res.data.data.ticket.replies;
const arrEntities = {
lt: "<",
gt: ">",
nbsp: " ",
amp: "&",
quot: '"',
};
this.ticketData.replies = replies.reverse().map((item) => {
item.content = filterXSS(item.content).replace(
/&(lt|gt|nbsp|amp|quot);/gi,
function (all, t) {
return arrEntities[t];
}
);
return item;
});
// 工单类型
this.getTicketType();
// 当前状态
this.baseMsg.status = this.ticketData.status;
// 标题
this.baseMsg.title = this.ticketData.title;
this.baseMsg.create_time = this.ticketData.create_time;
this.baseMsg.color = this.ticketData.color;
// 关联产品
this.getHostList();
this.$nextTick(() => {
this.scrollToBottom();
});
}
});
},
// 获取工单类型
getTicketType() {
ticketType().then((res) => {
if (res.data.status === 200) {
this.ticketTypeList = res.data.data.list;
this.ticketTypeList.map((item) => {
if (item.id == this.ticketData.ticket_type_id) {
this.baseMsg.type = item.name;
}
});
}
});
},
// 获取产品列表
getHostList() {
const params = {
keywords: "",
status: "",
page: 1,
limit: 1000,
orderby: "id",
sort: "desc",
};
hostAll(params).then((res) => {
if (res.data.status === 200) {
this.hostList = res.data.data.list;
// let names = ""
let hosts = [];
this.ticketData.host_ids.forEach((element) => {
this.hostList.forEach((item) => {
if (item.id == element) {
let hostitem = {
id: item.id,
label: item.product_name + " (" + item.name + ")",
};
hosts.push(hostitem);
// names += item.product_name + " (" + item.name + ")" + ","
}
});
});
// names = names.slice(0, -1)
this.baseMsg.hosts = hosts;
}
});
},
// 回复工单
doReplyTicket() {
if (this.sendBtnLoading) return;
if (!this.replyData.content) {
showToast(lang.ticket_label18);
return;
}
// 将content中的 /n 替换成 <br>
this.replyData.content = this.replyData.content.replace(
/\n/g,
"<br>"
);
const params = {
...this.replyData,
id: this.id,
};
this.sendBtnLoading = true;
replyTicket(params)
.then((res) => {
if (res.data.status === 200) {
// 清空输入框
this.replyData.content = "";
this.replyData.attachment = [];
this.fileList = [];
// 重新拉取工单详情
this.getDetails();
}
this.sendBtnLoading = false;
})
.catch((err) => {
this.sendBtnLoading = false;
console.log(err);
showToast(err.data.msg);
});
},
// 上传文件相关
handleSuccess(response, file, fileList) {
// console.log(response);
if (response.status != 200) {
showToast(response.msg);
// 清空上传框
let uploadFiles = this.$refs["fileupload"].uploadFiles;
let length = uploadFiles.length;
uploadFiles.splice(length - 1, length);
} else {
this.replyData.attachment.push(response.data.save_name);
}
},
handleProgress(response) {
console.log("response", response);
},
beforeRemove(file, fileList) {
// 获取到删除的 save_name
let save_name = file.response.data.save_name;
this.replyData.attachment = this.replyData.attachment.filter(
(item) => {
return item != save_name;
}
);
},
// 附件下载
downloadfile(item) {
const url = item.url;
const name = item.name;
const type = name.substring(name.lastIndexOf(".") + 1);
if (
[
"png",
"jpg",
"jepg",
"jpeg",
"JPEG",
"bmp",
"webp",
"PNG",
"JPG",
"JEPG",
"BMP",
"WEBP",
].includes(type)
) {
showImagePreview([url]);
} else {
window.open(url);
}
},
showClose() {
this.visible = true;
},
// 关闭工单
doCloseTicket() {
const params = {
id: this.id,
};
this.delLoading = true;
closeTicket(params)
.then((res) => {
if (res.data.status == 200) {
showToast(res.data.msg);
this.visible = false;
// 重新拉取工单详情
this.getDetails();
}
this.delLoading = false;
})
.catch((error) => {
showToast(error.data.msg);
this.delLoading = false;
});
},
// 载入富文本
initTemplate() {
tinymce.init({
selector: "#tiny",
language_url: "/tinymce/langs/zh_CN.js",
language: "zh_CN",
min_height: 400,
width: "100%",
plugins:
"link lists image code table colorpicker textcolor wordcount contextmenu fullpage",
toolbar:
"bold italic underline strikethrough | fontsizeselect | forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist | outdent indent blockquote | undo redo | link unlink image fullpage code | removeformat",
images_upload_url: "/console/v1/upload",
convert_urls: false,
images_upload_handler: this.handlerAddImg,
});
},
// 富文本图片上传
handlerAddImg(blobInfo, success, failure) {
return new Promise((resolve, reject) => {
const formData = new FormData();
formData.append("file", blobInfo.blob());
axios
.post("/console/v1/upload", formData, {
headers: {
Authorization: "Bearer" + " " + localStorage.getItem("jwt"),
},
})
.then((res) => {
const json = {};
if (res.status !== 200) {
failure("HTTP Error: " + res.data.msg);
return;
}
json.location = res.data.data?.image_url;
if (!json || typeof json.location !== "string") {
failure("Error:" + res.data.msg);
return;
}
success(json.location);
});
});
},
toHost(id) {
location.href = "/productdetail.htm?id=" + id;
},
hanldeImage(event) {
console.log(event);
if (
event.target.nodeName == "IMG" ||
event.target.nodeName == "img"
) {
const img = event.target.currentSrc;
showImagePreview([img]);
}
},
},
});
window.directiveInfo.forEach((item) => {
app.directive(item.name, item.fn);
});
app.use(vant).mount("#template");
};
})(window);